对射式红外传感器计次
还是复制粘贴之前的文件
创建外部中断文件
然后写初始化函数
外部中断函数创建
这里写外部中断函数
看着这个图来配置
具体步骤就是:
第一步,配置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,搜索一下
可以改一下这里
![07a5cb4c5fdd4ad48a2d2f494e0a31e5.png](https://i-blog.csdnimg.cn/blog_migrate/cbe3e35114af2f8ac41f96a01d8d5495.png)
![51785ea41ef7478c909c5261df8cbd4a.png](https://i-blog.csdnimg.cn/blog_migrate/fe1984a6f35f045078ef1fdfdc99110a.png)
![5814799e85cf41dca4f0c8afb094d759.png](https://i-blog.csdnimg.cn/blog_migrate/fd14df30a08cad7bd0545633f5dbc943.png)
![ddb8e10cb60b4daf8247cae44f22ed03.png](https://i-blog.csdnimg.cn/blog_migrate/2a4f7946d1a4925e432f8c2c0b2832f7.png)
旋转编码计次
因为对于这个编码器而言
只不过这样在操作上有一写小瑕疵
把14改成0
复制粘贴一下
然后复制一下这个函数
改成1
最后返回Temp,然后就完成了
中断编程的建议: