使用NUCLEO-L412开发板板载STM32L412KB的外部中断功能和定时器功能实现对红外数据的解析。通过这个项目掌握外部中断和定时器的使用,同时对红外数据、NEC协议有个大概的了解。
红外通讯的协议有很多,我们这个项目解析的是NEC遥控指令,其数据格式由同步码、地址码、地址反码、控制码、控制反码,5个部分组成。同步码由一个9ms的低电平和一个4.5ms的高电平组成。地址码、地址反码、控制码、控制反码都8位的数据格式,按照低位在前、高们在后的顺序发送。而使用反码的原因则是为了增加通讯传输的可靠性,对数据结果有一个简单的校验。红外NEC协议编码说明如下图所示:
2.硬件连接
说明:
将IR接收模块的数据引脚连接到NUCLEO-L412KB开发的D9引脚,即PA8;其它两根线分别连接V3.3和GND引脚。
3.STM32CubeMX设置
说明:
使用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.运行结果
说明:
在程序上电启动后,依次按下红外遥控器的各个按键。在MCU接收到红外数据后,对接收的数据进行解析,并将解析结果通过串口打印输出。输出的数据为NEC数据格式,分别为地址码、地址反码、控制码、控制反码。
6.工程代码
2019-5-22 17:54 上传
点击文件名下载附件
2019-5-22 17:54 上传
点击文件名下载附件
2019-5-22 17:54 上传
点击文件名下载附件
继续阅读本篇相关更多标签
热门活动
全部回复 1
- 25 主题
- 72 帖子
- 1180 积分
身份:LV4 高级技术员
E币:792
发消息
wind_west
发表于2019-5-22 21:43:17
显示全部楼层
沙发
学习了。
>>资料:NEC uPD78F0138
回复
评测文章
热帖
大家都在看的技术资料
举报
内容系网友发布,其中涉及到安全隐患的内容系网友个人行为,不代表面包板社区观点
关闭
站长推荐 /3
- 返回顶部
工具栏