江协STM32:对射式红外传感器计次和旋转编码器计次

对射式红外传感器计次

还是复制粘贴之前的文件

创建外部中断文件

然后写初始化函数

外部中断函数创建

这里写外部中断函数

看着这个图来配置

具体步骤就是:

第一步,配置RCC,把我们这里涉及的外设的时钟都打开,不打开时钟,外设是没法工作的

第二步,配置GPIO,选择我们的端口位输入模式

第三步,配置AFIO,选择我们用的这一路GPIO,连接到后面的EXTI

第四步,配置EXTI,选择边缘触发方式,比如上升沿,下降沿或者双边沿,还有选择触发响应方式,可以选择中断响应和事件响应,一般都是中断响应

第五步,配置NVIC,给我们这个中断一个合适的优先级

最后,通过,NVIC,外部中断信号就能进入CPU了,这CPU才能收到中断信号,才能跳转到中断函数里执行中断程序

这几步就是外部中断的配置流程

开始编写程序

第一步开启时钟

开启GPIO时钟

这里解释一下为什么开GPIOB的时钟,时钟相当于人的大脑,寄存器是基于触发器,而触发器的赋值是一定需要时钟的,也就是说有时钟cup才能向寄存器写入值。一般用什么外设就要开该外设的时钟。我们这里用的是GPIOB这个外设,所以要开启GPIOB的时钟

开启GPIOB的时钟,这里注意一下,GPIOB是APB2的外设,这里参数是APB2_GPIOB的这个,函数也要用APB2的这个开启时钟函数,注意函数和参数的这个APB2,APB1和AHB要对应起来

第二步开启AFIO的时钟

AFIO也是APB2的外设

如果不确定哪个外设接在哪个总线上,可以转到这个函数的定义,看一看参数表

第三步EXTI,这个外设的时钟是一直打开的,不需要我们再开启时钟了

第四步NVIC,这个外设的时钟是一直打开的,不需要我们再开启时钟了,这个是因为,NVIC是内核的外设,内核的外设都是不需要开启时钟的

第二步配置GPIO

第一个GPIO_Mode,对应外部中断来说,要选择浮空输入,上拉输入,或者下拉输入,这其中的一个模式

像这种其他外设使用GPIO的情况,如果你不清楚该配置为什么模式,可以看手册,GPIO这一章,有一个外设的GPIO配置表,里面优先每个外设的各个引脚都需要配置为什么模式

所以这里就给上拉输入,默认高电平的输入方式

第二个GPIO_Pin,我们用的PB14号口,所以就写GPIO_Pin_14

第三个GPIO_Speed还是GPIO_Speed_50MHz

最后调用GPIO_Init函数,初始化一下GPIO的外设

这样GPIO部分我们就配置好了

第三步,配置AFIO

这个AFIO外设,ST公司并没有给它分配专门的库函数文件,它的库函数是和GPIO再一个文件里的

GPIO_AFIODenlnit这个函数是用来复位AFIO外设的,调用这个函数AFIO外设的配置就会全部清除

GPIO_PinLocConfig这个函数是用来锁定GPIO配置的,调用这个函数,参数你指定某个引脚,那这个引脚的配置就会被锁定,防止意外更改,这个函数用到不多,了解即可

这两个函数是用来配置AFIO的时间输出功能的,用的也不多

这两个函数比较重要了

GPIO_PinRemapConfig可以用来进行引脚重映射

第一个参数可以选择你要重映射的方式,第二个参数是新的状态,目前用不上

GPIO_EXTILineConfig,就是我们这次外部中断所需要用的函数

调用这个函数,就可以配置AFIO的数据选择器,来选择我们想要的中断引脚

GPIO_ETH_MedialnterfaceConfig这个函数跟以太网有关,这个芯片没有以太网外设,所以也用不到

现在继续

现在要配置AFIO外部中断引脚选择,直接复制GPIO_EXTILineConfig这个函数,然后跳转到定义看一下

所以这个函数实际上是AFIO的函数

然后看第二个参数,第二个参数是GPIO_PinSource,指定要配置的外部中断线,这个参数可以是GPIO_PinSourcex,其中x可以是0到15

x改成14,代表连接PB14号口的第14个中断线路

到这里AFIO外部中断已经选择配置就完成了,就这一个函数就行了

当执行完这个函数后,AFIO的第14个数据选择器就拨好了,其中输入端被拨到了GPIOB的外设上,对应的就是PB14号引脚,输出端固定连接的是EXTI的第14个中断线路,这样,PB14号引脚的电平信号就可以顺利通过AFIO,进入到后级EXTI电路了

第四步配置EXTI

先看看EXTI的库函数

这些就是EXTI的所有库函数了

第一个EXTI_Delnit,调用它,就可以把EXTI的配置都清除,恢复成上电默认的状态

第二个EXTI_Init调用这个函数,就可以根据这个结构体里的参数配置EXTI外设,我们初始化EXTI主要用的就是这个函数,使用方法和GPIO_Init也是一样的

第三个EXTI_StructInit调用这个函数,可以把参数传递的结构体变量赋一个默认值

像前面这三个函数,基本的所有外设都有,就像是库哈斯你的模板函数一样,基本每个外设都需要这些类型的函数,这些模板函数使用方法和意思也是一样的

第四个EXTI_GenerateSWInterrupt这个函数是用来软件触发外部中断的,调用这个函数,参数给一个指定的中断线,就能软件触发一次这个外部中断,如果你只需要外部已经触发中断,那就不需要这个函数了

剩下的这个四个函数,也是库函数的模板函数,很多模块都有这个函数 ,因为再外设运行的过程中,会产生一些状态标志位,比如外部中断来了,是不是会有一个挂起寄存器置了一个标志位,对于其他外设,比如串口收到数据,会置标志位,定时器实际到,也会置标志位这些标志位都是放状态寄存器的,当程序想要看这些标志位时,就可以用到这四个函数

162行函数,可以获取指定的标志位是否被置1了

163行函数,可以对置1的标志位进行清除

那对于这些标志位,有的比较紧急,在置标志位后会触发中断,在中断函数里,如果你想查看标志位和清除标志位,那就要164行和165行这两个函数

164行获取中断标志位是否被置1了,

165行,清除中断挂起标志位

总结一下:

如果你想在主程序查看和清除标志位,就用162和163,如果你想在中断函数里查看清除标志位,就用164和165,其实本质上,这四个函数都是对状态寄存器的读写,162,163,和164,165两个类似的功能,都是读写状态寄存器,只不过164和165只能读写与中断有关的标志位,并且对中断是否允许做出了判断,而162,163这两个函数知识一般的读写标志位,没有额外的出来,能不能触发中断的标志位都能读取,所以建议在主程序里用162和163,中断程序里用164和165

到这里,这个EXTI的库函数都看完了

对于EXTI的初始化配置,用EXTI_Init函数就行了

里面只有一个参数就是EXTI初始化的结构体,因为EXTI只有一个,所以不需要像GPIO那样

看一下说明,第一个参数是EXTI_InitSyruct,它是一个EXTI_InitTyoeDef类型的结构体指针,包含了对于EXTI外设的是配置信息

起个变量名叫,EXTI_InitStructure

第一个参数,EXTI_Line,这个是指定我们要配置的中断线

这些就是这个参数的取值,我们需要用PB14所在的第14个线路

所以选择EXTI_Line14

第二个参数,EXTI_LINECmd,指定选择的中短线的新状态,这个参数可以是ENABLE和DISABLE,因为要开启中断,所以选择ENABLE

第二个参数就ok了

第三个参数,EXTI_Mode,指定外部中断线的模式,这个参数可以是EXTIMode_TypeDef里面的一个值

跳转页面

52是中断模式,53是事件模式,我们需要的是中断模式

第三个参数也就ok了

第四个参数,EXTI_Trigger,指定触发信号的有效边沿

这个参数可以是这个定义里的一个值,这里写错了应该是EXTITrigger_TypeDef

64行上升沿触发,65下降沿触发,66上升沿和下降沿都触发,这个选择跟你的实际需求来,这里选择下降沿触发

这样我们的外部中断配置完成了

当前的配置将EXTI的第14个线路配置位中断模式,下降沿触发,然后开启中断,这样PB14的电平信号就能通过EXTI通向下一级NVIC了

现在来执行第五步,配置NVIC

还是先看一下库文件里的函数

196行函数这个函数是用来中断分组的,参数是中断分组的方式

197行函数,这个是根据结构体里面指定的参数初始化NVIC

198行函数,这个是设置中断向量表

199行函数,这个是系统低功耗配置

198和19用的不多先看看就行

我们就用196和197行函数

在配置中断之前,先指定一些中断的分组,然后使用NVIC_Init初始化NVIC就行了

这样分组就完成了,另外注意以,这个分组方式整个芯片只能用一种,所以按理说这个分组代码整个工程只需要执行一次就行了

指定中断通道来开启或关闭

因为是用的GPIOB_Pin14,在10-15的范围内,所以要用这个

然后是IRQChannelCmd,参数可以是ENABLE或者DISABLE,选择ENABLE

这两个参数,是指定所选通道的场站优先级和响应优先级,跳转看看

这个是抢占优先级,这个值可以是0到15

具体可以可以参照这个表,Ctrl+F,搜索一下

可以改一下这里

旋转编码计次

因为对于这个编码器而言

只不过这样在操作上有一写小瑕疵

把14改成0

复制粘贴一下

然后复制一下这个函数

改成1

最后返回Temp,然后就完成了

中断编程的建议:

相关推荐
EVERSPIN1 小时前
分享国产RISC-V单片机通用
单片机·嵌入式硬件·risc-v
浅陌pa2 小时前
05:(寄存器开发)定时器一
stm32·单片机·嵌入式硬件
TNT_JQR3 小时前
电子信息类专业技术学习及比赛路线总结(大一到大三)
单片机·嵌入式硬件·学习
钟剑锋-JeffChong5 小时前
智能手表(Smart Watch)项目
stm32·单片机·嵌入式开发·智能手表
jmlinux5 小时前
环形缓冲区(Ring Buffer)在STM32 HAL库中的应用:防止按键丢失
c语言·stm32·单片机·嵌入式硬件
江山如画,佳人北望6 小时前
智能平衡移动机器人-平台硬件电路
单片机·嵌入式硬件
江将好...7 小时前
定时器实验(Proteus 与Keil uVision联合仿真)
单片机·嵌入式硬件
地球空间-技术小鱼7 小时前
嵌入式系统学习
嵌入式硬件·学习
物随心转7 小时前
中断系统的原理
单片机·嵌入式硬件
FreakStudio15 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy