1.概述

使用NUCLEO-L412开发板板载STM32L412KB的外部中断功能和定时器功能实现对红外数据的解析。通过这个项目掌握外部中断和定时器的使用,同时对红外数据、NEC协议有个大概的了解。


红外通讯的协议有很多,我们这个项目解析的是NEC遥控指令,其数据格式由同步码、地址码、地址反码、控制码、控制反码,5个部分组成。同步码由一个9ms的低电平和一个4.5ms的高电平组成。地址码、地址反码、控制码、控制反码都8位的数据格式,按照低位在前、高们在后的顺序发送。而使用反码的原因则是为了增加通讯传输的可靠性,对数据结果有一个简单的校验。红外NEC协议编码说明如下图所示:


6.png



2.硬件连接

4.jpg

说明:
将IR接收模块的数据引脚连接到NUCLEO-L412KB开发的D9引脚,即PA8;其它两根线分别连接V3.3和GND引脚。

3.STM32CubeMX设置

1.png 2.png 3.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

    说明:
    在程序上电启动后,依次按下红外遥控器的各个按键。在MCU接收到红外数据后,对接收的数据进行解析,并将解析结果通过串口打印输出。输出的数据为NEC数据格式,分别为地址码、地址反码、控制码、控制反码。

    6.工程代码

    IR_NEC.part03.rar (5.66 MB, 下载次数: 3)