利用STM32外部中断驱动四路数字触摸感应传感器模块

发布者:BlissfulSunrise最新更新时间:2017-11-09 来源: eefocus关键字:STM32  外部中断  数字触摸感应  传感器模块 手机看文章 扫描二维码
随时随地手机看文章

首先先介绍一下STM32的外部中断,当然这也不是我总结的,这是在那么多博客里找到的一篇个人认为总结不错的学习文档。先学到手再说吧!


STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。

程序开发

其实上面那些基本概念和知识只是对STM32的中断系统有一个大概的认识,用程序说话将会更能够加深如何使用中断。使用外部中断的基本步骤如下:

1.设置好相应的时钟;

2.设置相应的中断;

3.IO口初始化;

4.把相应的IO口设置为中断线路(要在设置外部中断之前)并初始化;

5.在选择的中断通道的响应函数中中断函数。


根据原理图,K1/K2/K3连接的是PC5/PC2/PC3,因此我将用EXTI5/EXTI2/EXTI3三个外部中断。PB5/PD6/PD3分别连接了三个LED灯。中断的效果是按下按键,相应的LED灯将会被点亮。


1.设置相应的时钟

首先需要打开GPIOB、GPIOC和GPIOE(因为按键另外一端连接的是PE口)。然后由于是要用于触发中断,所以还需要打开GPIO复用的时钟。相应的函数在GPIO的学习笔记中有了详细了解释。详细代码如下:

  1. void RCC_cfg()

  2. {

  3.        //打开PE PD PC PB端口时钟,并且打开复用时钟

  4.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

  5. }



设置相应的时钟所需要的RCC函数在stm32f10x_rcc.c中,所以要在工程中添加此文件。


2.设置好相应的中断

设置相应的中断实际上就是设置NVIC,在STM32的固件库中有一个结构体NVIC_InitTypeDef,里面有相应的标志位设置,然后再用NVIC_Init()函数进行初始化。详细代码如下:

  1. void NVIC_cfg()

  2. {

  3.         NVIC_InitTypeDef NVIC_InitStructure;

  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                         //选择中断分组2

  5.         

  6.         

  7. NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQChannel;     //选择中断通道2

  8. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为0

  9.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       //响应式中断优先级设置为0

  10.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                  //使能中断

  11.         NVIC_Init(&NVIC_InitStructure);

  12.         

  13.         NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;            //选择中断通道3

  14.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占式中断优先级设置为1

  15.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //响应式中断优先级设置为1

  16.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                  //使能中断

  17.         NVIC_Init(&NVIC_InitStructure);

  18.         

  19.         NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;  //选择中断通道5

  20.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占式中断优先级设置为2

  21.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //响应式中断优先级设置为2

  22.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                  //使能中断

  23.         NVIC_Init(&NVIC_InitStructure);

  24. }



由于有3个中断,因此根据前文所述,需要有3个bit来指定抢占优先级,所以选择第2组。又由于EXTI5-9共用一个中断响应函数,所以EXTI5选择的中断通道是EXTI9_5_IRQChannel,详细信息可以在头文件中查询得到。用到的NVIC相关的库函数在stm32f10x_nivc.c中,需要将此文件复制并添加到工程中。具体位置可以查看关于GPIO的笔记。这段代码编译起来没有任何问题,但是在链接的时候就会报错,需要把STM32F10xR.LIB加入工程中,具体位置在…KeilARMRV31LIBSTSTM32F10xR.LIB。


3.IO口初始化

  1. void IO_cfg()

  2. {

  3.        GPIO_InitTypeDef GPIO_InitStructure;

  4.       

  5.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                            //选择引脚2

  6.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //输出频率最大50MHz

  7.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //带上拉电阻输出

  8.        GPIO_Init(GPIOE,&GPIO_InitStructure);

  9.        GPIO_ResetBits(GPIOE,GPIO_Pin_2);                             //将PE.2引脚设置为低电平输出

  10.       

  11.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5; //选择引脚2 3 5

  12.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择输入模式为浮空输入

  13.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //输出频率最大50MHz

  14.        GPIO_Init(GPIOC,&GPIO_InitStructure);                                 //设置PC.2/PC.3/PC.5

  15.       

  16.       

  17.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;                  //选择引脚3 6

  18.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //输出频率最大50MHz

  19.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //带上拉电阻输出

  20.        GPIO_Init(GPIOD,&GPIO_InitStructure);

  21.       

  22.       

  23.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                        //选择引脚5

  24.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //输出频率最大50MHz

  25.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //带上拉电阻输出

  26.        GPIO_Init(GPIOB,&GPIO_InitStructure);        

  27. }



其中连接外部中断的引脚需要设置为输入状态,而连接LED的引脚需要设置为输出状态,初始化PE.2是为了使得按键的另外一端输出低电平。GPIO中的函数在stm32f10x_gpio.c中。

4.把相应的IO口设置为中断线路

由于GPIO并不是专用的中断引脚,因此在用GPIO来触发外部中断的时候需要设置将GPIO相应的引脚和中断线连接起来,具体代码如下:

  1. void EXTI_cfg()

  2. {

  3.        EXTI_InitTypeDef EXTI_InitStructure;

  4.        //清空中断标志

  5.        EXTI_ClearITPendingBit(EXTI_Line2);

  6.        EXTI_ClearITPendingBit(EXTI_Line3);

  7.        EXTI_ClearITPendingBit(EXTI_Line5);

  8.        //选择中断管脚PC.2 PC.3 PC.5

  9.        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);

  10.        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);

  11.        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);

  12.        EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 | EXTI_Line5; //选择中断线路2 3 5

  13.        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置为中断请求,非事件请求

  14.        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //设置中断触发方式为上下降沿触发

  15.        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                          //外部中断使能

  16.       EXTI_Init(&EXTI_InitStructure);

  17. }



EXTI_cfg中需要调用到的函数都在stm32f10x_exti.c。


5.写中断响应函数

STM32不像C51单片机那样,可以用过interrupt关键字来定义中断响应函数,STM32的中断响应函数接口存在中断向量表中,是由启动代码给出的。默认的中断响应函数在stm32f10x_it.c中。因此我们需要把这个文件加入到工程中来。

在这个文件中,我们发现,很多函数都是只有一个函数名,并没有函数体。我们找到EXTI2_IRQHandler()这个函数,这就是EXTI2中断响应的函数。我的目标是将LED灯点亮,所以函数体其实很简单:

  1. void EXTI2_IRQHandler(void)

  2. {

  3.        //点亮LED灯

  4.        GPIO_SetBits(GPIOD,GPIO_Pin_6);

  5.        //清空中断标志位,防止持续进入中断

  6.        EXTI_ClearITPendingBit(EXTI_Line2);

  7. }

  8. void EXTI3_IRQHandler(void)

  9. {

  10.        GPIO_SetBits(GPIOD,GPIO_Pin_3);

  11.        EXTI_ClearITPendingBit(EXTI_Line3);

  12. }

  13. void EXTI9_5_IRQHandler(void)

  14. {

  15.        GPIO_SetBits(GPIOB,GPIO_Pin_5);

  16.        EXTI_ClearITPendingBit(EXTI_Line5);

  17. }


由于EXTI5-9是共用一个中断响应函数,因此所有的EXTI5 – EXTI9的响应函数都写在这个里面。


6.写主函数

  1. #include "stm32f10x_lib.h"

  2. void RCC_cfg();

  3. void IO_cfg();

  4. void EXTI_cfg();

  5. void NVIC_cfg();

  6. int main()

  7. {

  8.           RCC_cfg();

  9.           IO_cfg();

  10.           NVIC_cfg();

  11.           EXTI_cfg();

  12.           while(1);            

  13. }



main函数前是函数声明,main函数函数体中都是调用初始化配置函数,然后进入死循环,等待中断响应。


以上就是STM32外部中断的介绍,功能可以不用管,知道该配置哪些东西就够了。ok,基础知识学习完了吧!那么就可以买个具体模块来试试了。这里用的是四路数字触摸感应传感器模块。


下面是该模块的简要描述:

一、模块描述

该传感器模块是四路触摸感应模块,基于TTP224芯片。通过触摸数字(1、2、3、4),可以起到控制外围硬件电路的作用。手按数字开关,对应的灯(D1、D2、D3、D4)会亮,对应的四个输出口(OUT1、OUT2、OUT3、OUT4)中的一个会输出高电平。

模块参数:

1、板载TTP224电容式4键触摸感应IC

2、板载4路电平状态指示灯

3、工作电压:2.4V-5.5V

4、模块可以设置输出模式、键输出模式、最长输出时间和快速/低功耗选择

5、PCB板子尺寸:35(mm)x29(mm)

 

二、硬件调试

(1) 硬件实物图展示如下图:

利用STM32外部中断驱动四路数字触摸感应传感器模块

(2) 模块原理图接口展示如图:

利用STM32外部中断驱动四路数字触摸感应传感器模块

 

(3) 管脚实际连接表

单片机---->kepler11---->传感器模块,连接表

MUC(STM32F103RBT6)

Kepler 11

四路触摸感应模块


3.3-VCC

1(VCC)


GND

2(GND)

14(PA0)

左上1(AD0)

6(OUT1)

15(PA1)

左上2(AD1)

5(OUT2)

16(PA2)

左上3(AD2)

4(OUT3)

17(PA3)

左上4(AD3)

3(OUT4)


三、软件调试

本工程实现的功能是通过触摸传感器模块中的数字触发引脚的外部中断,从而控制核心板上LED灯闪烁以及K11开发板上的继电器。本案例基于光轮电子公司TreeOS软件开发架构运行,具体软件工程还请关注光轮电子公司TreeOS驱动库文件。

以下是工程图:

利用STM32外部中断驱动四路数字触摸感应传感器模块


关键字:STM32  外部中断  数字触摸感应  传感器模块 引用地址:利用STM32外部中断驱动四路数字触摸感应传感器模块

上一篇:26. SPI实验W25Qxx讲解
下一篇:27. SD卡实验一 -SDIO简介

推荐阅读最新更新时间:2024-03-16 15:44

STM32 输出比较错误及解决
程序1:TIM2输出比较,产生频率为366.2Hz的方波 #include stm32f10x.h void RCC_configuration(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //开启GPIO的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); } void Led_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO初始化的结构体 GPIO_Init
[单片机]
STM32串口悬空导致CPU持续进入中断函数
STM32的串口开启中断,在串口悬空(即不接外设)的情况下,CPU会不断的进串口中断服务函数 并且接收到的数据为0,当你把外设接上,一切OK。 void USART2_IRQHandler(void) { INT8U tmp; /* OK */ if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET){ USART_ClearITPendingBit(USART2, USART_IT_RXNE); tmp = USART_ReceiveData(USART2); } } 其实原因很简单,在初始化串口是输入引脚设置成了悬空
[单片机]
电力行业,米尔STM32MP135开发板IEC61850协议移植笔记
1. 概述 IEC61850是变电站自动化系统(SAS)中通信系统和分散能源(DER)管理的国际标准。它通过标准的实现,实现了智能变电站的工程运作标准化。使得智能变电站的工程实施变得规范、统一和透明,在电力和储能系统中应用非常广泛。 本文基于米尔MYD-YF13X开发板,在Linux系统上移植和使用开源的libIEC61850库,该库提供了用C语言编写的IEC 61850 / MMS,IEC 61850 / GOOSE和IEC 61850-9-2 /采样值通信协议的服务端和客户端库。 2. 搭建配置环境 本章节讲述libIEC61850库的编译环境配置过程。 2.1. 安装JAVA环境 IEC61850库中
[嵌入式]
电力行业,米尔STM32MP135开发板IEC61850协议移植笔记
STM32单片机(1) 总记 学习资料+参考手册+LED灯
学习资料 视频教程 李想stm32视频教程49集 http://pan.baidu.com/s/1kTyt03P 原子教你玩STM32 http://pan.baidu.com/s/1gd25r6F 刘洋STM32(好) http://pan.baidu.com/s/1mgkeNsG http://www.iqiyi.com/u/1005856393 http://yun.baidu.com/share/home?uk=2853967793 http://www.zxkjmcu.com/ 参考文档 STM32的函数说明(中文).pdf http://download.csdn.net/detail/ley
[单片机]
stm32学习笔记(九)PWM输出
#include pwm.h #include led.h ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK Mini STM32开发板 //PWM 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2010/12/03 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 正点原子 2009-2019 //All rights reserved
[单片机]
stm32的超频实验
从时钟树中可以看出外接晶振可以接4-16Mhz,经过PLL倍频,最高可以达到16倍晶振的频率。笔者自己是外接的8Mhz晶振,所以说理论上可以达到8*16=128Mhz的频率。 所用芯片:stm32f103 编译工具:keil5 时钟配置子函数如下: void HSE_Init(uint32_t RCC_PLLMul_x)//范围2-16 { ErrorStatus HSEStatus;//定义 //重置RCC,否则不会有效果 RCC_DeInit(); //打开HSE RCC_HSEConfig(RCC_HSE_ON); HSEStatus=RCC_WaitForHSEStartUp();
[单片机]
<font color='red'>stm32</font>的超频实验
STM32跑马灯例程总结
//======================================================// **基于学习STM32有一段时间了,特意写下一篇关于一个简单的跑马灯 的例程,梳理思路,也希望我自己的理解能帮到一些学习STM32的初学者 /**再此,鸣谢余师傅在学习上的大力帮助!!**/ //======================================================// 首先,GPIO的配置种类有8种。分别为模拟输入、浮空输入,上拉输入、下拉输入、开漏输出、推挽输出、复用开漏输出、复用推挽输出。 下面将以实例的方式讲解GPIO的设置及实现过程。 事例1:跑马灯实验 跑马灯实
[单片机]
STM8L051F3_02_EXTI应用
本章介绍STM8L051F3的EXTI相关知识,内容分为以下几部分: EXTI简介 KEY外部中断检测 1、EXTI简介 EXTI也是属于GPIO的知识点,应用比较广泛。STM8L051F3每个I/O口在输入模式下都能配置为中断,在这个配置下,一个信号沿或电平输入到I/O口上将产生一个中断请求。外部中断只有在端口的输入模式下才有效。 可通过配置寄存器Px_CR2相应的位来独立地使能或禁能某个端口的外部中断功能。另外,可通过ADC_TDRH和ADC_TDRL寄存器来禁用施密特触发器节省功耗。 2、KEY外部中断检测 2.1 KEY的外部中断配置 本小节介绍将GPIO配置为外部中断输入模式,并通过KEY(PC4)来触发一个
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved