打开主菜单

谷雨文档中心 β

更改

NBDK-L4:基础实验教程

添加1,843字节2019年1月24日 (四) 12:13
gyu_irc
3.通用定时器捕获模式
在输入捕捉模式下,捕捉/比较寄存器(TIMx_CCRx)用于在相应''<span class="tlid-translation-gender-indicator translation-gender-indicator"></span>''ICx信号检测到转换后锁存计数器的值。 发生捕获时,会设置相应的CCXIF标志(TIMx_SR''<span class="tlid-translation-gender-indicator translation-gender-indicator"></span>''寄存器),如果使能了中断或DMA请求,则可以发送它们。 如果在C''<span class="tlid-translation-gender-indicator translation-gender-indicator"></span>''CxIF标志已经为高电平时发生捕获,则设置过''<span class="tlid-translation-gender-indicator translation-gender-indicator"></span>''捕获标志CCxOF(TI''<span class="tlid-translation-gender-indicator translation-gender-indicator"></span>''Mx_SR寄存器)''<span class="tlid-translation-gender-indicator translation-gender-indicator"></span>''。 CCxIF可以''<span class="tlid-translation-gender-indicator translation-gender-indicator"></span>''通过软件将其写入0或读取存储在TIMx_CC''<span class="tlid-translation-gender-indicator translation-gender-indicator"></span>''Rx寄存器中的捕获数据来''<span class="tlid-translation-gender-indicator translation-gender-indicator"></span>''清除。 比较寄存器(TIMx_CCRx)用于在相应ICx信号检测到转换后锁存计数器的值。 发生捕获时,会设置相应的CCXIF标志(TIMx_SR寄存器),如果使能了中断或DMA请求,则可以发送它们。 如果在CCxIF标志已经为高电平时发生捕获,则设置过捕获标志CCxOF(TIMx_SR寄存器)。 CCxIF可以通过软件将其写入0或读取存储在TIMx_CCRx寄存器中的捕获数据来清除。 将其写入0时,CCxOF将被清除。''<span class="tlid-translation-gender-indicator translation-gender-indicator"></span>''
==== 遥控器协议说明 ====
NEC 协议,其特征如下:
 
1、 8 位地址和 8 位指令长度;
 
2、地址和命令 2 次传输(确保可靠性)
 
3、 PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;
 
4、载波频率为 38Khz;
 
5、位时间为 1.125ms 或 2.25ms;  
 
NEC 码的位定义:
 
一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms(560us 脉冲+560us 低电平)。
 
NEC 遥控指令的数据格式为:
 
同步码头、地址码、地址反码、控制码、控制反码。同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。  
 
[[文件:NBDK-INTER-NEC.jpg|边框|居中|无框|720x720像素]]
 
从图 26.1.1 中可以看到,其地址码为 0,控制码为 168。可以看到在 100ms 之后,我们还收到了几个脉冲,这是 NEC 码规定的连发码(由 9ms 低电平+2.5m 高电平+0.56ms 低电平
 
+97.94ms 高电平组成),如果在一帧数据发送完毕之后,按键仍然没有放开,则发射重复码,
 
即连发码,可以通过统计连发码的次数来标记按键按下的长短/次数。 
''<span class="tlid-translation-gender-indicator translation-gender-indicator"></span><span class="tlid-translation-gender-indicator translation-gender-indicator"></span><span class="tlid-translation-gender-indicator translation-gender-indicator"></span><span class="tlid-translation-gender-indicator translation-gender-indicator"></span><span class="tlid-translation-gender-indicator translation-gender-indicator"></span><span class="tlid-translation-gender-indicator translation-gender-indicator"></span><span class="tlid-translation-gender-indicator translation-gender-indicator"></span><span class="tlid-translation-gender-indicator translation-gender-indicator"></span><span class="tlid-translation-gender-indicator translation-gender-indicator"></span><span class="tlid-translation-gender-indicator translation-gender-indicator"></span>''
=== 硬件设计 ===
选择STM32L4引脚PC6用来捕获红外传感器HS0038的DATA引脚输出的PWM波。
==== gyu_irc ====
初始化定时器TIM3,首先配置TIM3的时钟为1MHz(也就是1us),我们设置它向上自动装载,并且设置自动装载值为10000,通过计算可以知道装满一次需要10ms。
 
然后我们需要设置输入捕获的参数,我们配置上升沿下降沿都捕获,并且设置8个时钟周期的滤波(防止误识别)。
 
最后使能TIM3的中断,并且开始捕获TIM3的通道1(也就是PC6引脚)。
<syntaxhighlight lang="c++" line="1" start="59">
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1); // 开始捕获TIM3 CH1
}
</syntaxhighlight>使能GPIOC以及TIM3的时钟,并且配置PC6为TIM3的通道1。<syntaxhighlight lang="c++" line="1" start="96">
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{
HAL_NVIC_EnableIRQ(TIM3_IRQn); // 使能TIM3中断
}
</syntaxhighlight>定时器周期中断,自动装载值装满一次,进入一次此回调(本工程是10ms进入一次)。 我们判断接收到引导码,<syntaxhighlight lang="c++" line="1" start="122">
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
irStatus |= IR_STATUS_BtnInfo; // 记录已经获取到IR按键信号(遥控器按键值)
}
if((tim3Cnt & 0X0F) < 1511) // 进入回调少于15次进入回调少于11次
{
tim3Cnt++; // 计数值自加
}
else // 超过15次,代表依次采集超时(不论是否成功)超过11次,代表一次采集超时(不论是否成功)
{
irStatus &= ~IR_STATUS_BootCode;// 删除引导码标记
510
个编辑