使用NUCLEO-L412开发板板载STM32L412KB的外部中断功能和定时器功能实现对红外数据的解析。通过这个项目掌握外部中断和定时器的使用,同时对红外数据、NEC协议有个大概的了解。
红外通讯的协议有很多,我们这个项目解析的是NEC遥控指令,其数据格式由同步码、地址码、地址反码、控制码、控制反码,5个部分组成。同步码由一个9ms的低电平和一个4.5ms的高电平组成。地址码、地址反码、控制码、控制反码都8位的数据格式,按照低位在前、高们在后的顺序发送。而使用反码的原因则是为了增加通讯传输的可靠性,对数据结果有一个简单的校验。红外NEC协议编码说明如下图所示:
![6.png 6.png](https://static.assets-stash.eet-china.com/forum/201905/22/191902qpbu29j0p9i1n9ui.png)
2.硬件连接
![4.jpg 4.jpg](https://static.assets-stash.eet-china.com/forum/201905/22/175138r195o9osblggo59l.jpg)
说明:
将IR接收模块的数据引脚连接到NUCLEO-L412KB开发的D9引脚,即PA8;其它两根线分别连接V3.3和GND引脚。
3.STM32CubeMX设置
![1.png 1.png](https://static.assets-stash.eet-china.com/forum/201905/22/175137nmh8ffcffhd98ho0.png)
![2.png 2.png](https://static.assets-stash.eet-china.com/forum/201905/22/175138la5kwh1x3brcgzo6.png)
![3.png 3.png](https://static.assets-stash.eet-china.com/forum/201905/22/175138w9g3ufzsggn3pdg3.png)
说明:
使用PA8引脚的外部中断复用功能,中断模式设置为下降沿触发,并使能外部触发中断。打开TIM6的定时器功能,用于对外部触发间的间隔时间采集,定时单位为0.1毫秒。
4.主要程序
/* Private variables --------------------------------------------------------*/volatile uint16_t IR_CYCLE[33]; volatile uint8_t IR_RCVOK = 0; volatile uint8_t IR_START = 0; volatile uint8_t IR_INDEX = 0; volatile uint16_t IR_COUNT = 0;
复制代码/** * @brief : This function handles EXTI line[9:5] interrupts. * @param : * @returns: * @details: */ void EXTI9_5_IRQHandler(void) { uint16_t IR_CycleTime; if(IR_START) { IR_CycleTime = IR_COUNT; if((IR_CycleTime < 140) && (IR_CycleTime >= 50)) { IR_INDEX = 0; } IR_CYCLE[IR_INDEX++] = IR_CycleTime; IR_COUNT = 0; if(IR_INDEX == 33) { IR_START = 0; IR_RCVOK = 1; } } else { IR_COUNT = 0; IR_INDEX = 0; IR_START = 1; } HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8); } volatile uint32_t TIM6_Tick = 0; /** * @brief : This function handles TIM6 global interrupt. * @param : 0.1ms * @returns: * @details: */ void TIM6_IRQHandler(void) { IR_COUNT++; HAL_TIM_IRQHandler(&htim6); }
复制代码/** * @brief : * @param : * @returns: * @details: */ void IR_Parsing(void) { uint8_t i = 0, j = 0, k = 1; if(IR_RCVOK) { IR_RCVOK = 0; memset(IR_DATA, 0, sizeof(IR_DATA)); for(i = 0; i < 4; i++) { for(j = 0; j < 8; j++, k++) { if((IR_CYCLE[k] >= 9) && (IR_CYCLE[k] < 14)) { IR_DATA[i] &= ~(0x1 << j); } else if((IR_CYCLE[k] >= 20) && (IR_CYCLE[k] < 25)) { IR_DATA[i] |= (0x1 << j); } } } printf("\r\nIR Data : 0x%02x, 0x%02x, 0x%02x, 0x%02x", IR_DATA[0], IR_DATA[1], IR_DATA[2], IR_DATA[3]); } }
复制代码5.运行结果
![5.png 5.png](https://static.assets-stash.eet-china.com/forum/201905/22/175138bxdze1hdvdv8ghc0.png)
说明:
在程序上电启动后,依次按下红外遥控器的各个按键。在MCU接收到红外数据后,对接收的数据进行解析,并将解析结果通过串口打印输出。输出的数据为NEC数据格式,分别为地址码、地址反码、控制码、控制反码。
6.工程代码
![](static/image/filetype/rar.gif)
2019-5-22 17:54 上传
点击文件名下载附件
![](static/image/filetype/rar.gif)
2019-5-22 17:54 上传
点击文件名下载附件
![](static/image/filetype/rar.gif)
2019-5-22 17:54 上传
点击文件名下载附件
继续阅读本篇相关更多标签
全部回复 1
- 25 主题
- 72 帖子
- 1180 积分
身份:LV4 高级技术员
E币:792
发消息
wind_west
![论坛新秀 论坛新秀](static/image/common/medal1.gif)
发表于2019-5-22 21:43:17
显示全部楼层
沙发
学习了。
>>资料:Rockchip pwm ir开发指南
回复
![](/static/image/mianbaoban/2.0/ad.png)
评测文章
热帖
大家都在看的技术资料
举报
内容系网友发布,其中涉及到安全隐患的内容系网友个人行为,不代表面包板社区观点
关闭
站长推荐
/3
![上一条 上一条](static/image/common/pic_nv_prev.gif)
![下一条 下一条](static/image/common/pic_nv_next.gif)
-
返回顶部
-
工具栏