在上个实验中我对通用定时器TIM5进行使用,STM32F429 输入捕获实验:cubemx 实现定时器对变化沿的输入捕获
本次实验中我们实现红外遥控实验,将会用到高级定时器的更新、输入捕获功能。红外遥控实现是通过板子上的红外接收头,接收红外遥控器发送的红外信号,可以将红外信号转为高低电平的形式,而红外接收头的输出端接在板子上的PA8,它在接收到信号后会转换为NEC protocol的PWM(脉冲宽度调制),也就是一种协议。
比如在接收端一个逻辑1就是560us低电平+1680us高电平。逻辑0就是560us低电平+560us高电平。
遥控器在发送数据前,会先发送一个同步码(9ms低电平+4.5ms高电平),然后是地址码,地址反码,控制码,控制反码(四个码均为8位),如果发送完一帧数据后按键还没有松开,接收头则会重复发送连发码(9ms低电平+2.5ms高电平+0.56ms低电平+97.94ms高电平),表示仍旧是上一个控制命令。
现在我们了解了协议,其实就是判断各高低电平的持续时间,来得到想要的地址码,地址反码,控制码,控制反码。从而判断地址码、地址反码看看是不是给自己的命令,如果是就判断控制反码是否合法,获取控制码。
那么问题来了,怎样得到高低电平脉冲的持续时间呢?那么就用到了定时器的输入捕获以及更新(如果此处不理解可以回顾一下前一章)。
PA8连接着高级定时器TIM1,其实思路和上一章的普通定时器获取高电平脉冲持续时间的一致,只不过这次加上了协议,稍微多了一个判断步骤而已。
通过对比我们可知TIM1与上个实验的TIM5差别在了TIM1的重装计数器是16位的,TIM5的重装计数器是32位的,所以上个实验我们尚可设置为0xffffffff;而这个实验只能设置在0~65535之间,我们此次设置为10000。希望可以10ms进一次计数溢出中断。
另一个是TIM1多了一个重复计数器,这个重复计数器的范围是0~255,啥意思呢,就是如果是0的话,就在TIM1的重装计数器溢出的时候进入一次计数溢出中断。如果重复计数器的值为n,则在TIM1的重装计数器溢出n+1次的时候才进一次溢出中断。
注:图中的向上的箭头就是进入中断的时候。
所以了解了重复计数器的作用后,我们选择不使用他,RCR赋值为0,也就是上溢一次计数器,就进入一次溢出中断。
通过查芯片手册可以看见:TIM1和TIM5时钟不同,TIM1是使用APB2 TIMER=180MHZ;TIM5是使用APB1 TIMER=90MHZ.
再去对照cubemx的时钟树得知APB2 Timer clocks为180MHZ,APB2其他外设的时钟为90MHZ.
因为我们需要用到channel的输入捕获,其实如果只用计数器,是不需要选择独立通道的。
通过上面讲解高级定时器和普通定时器的一些不同点,已经足够完成我们的实验了。那么我继续配置cubemx,再去看cubemx的配置项就不难理解了。
因为APB2是180M,所以分频采用180的话,就是1us周期,若重装值定为10000。则周期为10ms。
若repetition counter为0,则相当于不用多过一个周期,就是10ms进一次更新中断。
若为1,那么就是两次周期后进入更新中断!!
之后我们第一步需要做的和之前TIM5的一样,使能TIM1的输入捕获,打开TIM1的更新中断。
设置一些全局变量,用来辅助控制接收过程,得到有效的控制数据
添加定时器更新中断回调函数
添加输入捕获中断函数
这两个函数搭配看,理顺逻辑关系
接着同屏幕的刷新类似也需要一个红外遥控的刷新去处理上面的那些全局变量,检查有效的数据包,得到遥控器按下了哪个按键
最后由main函数循环刷新,并将有效的按键信息显示在屏幕上
捋顺一遍逻辑并不可能永远记住,但我们可以记住的是一种思想,通过定时器的输入捕获和更新中断去分析红外遥控的信号。并通过不断判断一些全局变量得到有效的键值,然后去使用它。
并且通过这个实验去学习定时器的输入捕获和更新都怎么用。