DMA 方式, TIM 输入捕获,红外线解码 当前系 统时钟为 48MHz 将预分频到 0.1mS 也就是除 4800 。 DMA 打开,设置为存储器增加。模式可以用线性模式,更加方便。 定义一个结构体,用于存储采集的数据。 typedef union{ uint32_t data32b ; uint16_t data16b ; }unICData; unICData ICData; HAL_TIM_IC_Start_DMA(&htim5,TIM_CHANNEL_4,ICData.data32b,260); 采集到的数据可以从 live watch 看到 可以将数据导出存成文本文件。并导入 matlab 或 excel 将数据前后相减,就知道脉冲间距了。 Columns 1 through 18 51 12 22 23 22 11 12 11 11 12 22 23 22 11 12 11 11 12 Columns 19 through 33 11 22 23 11 11 12 11 23 22 12 11 22 23 22 23 明显: 最长的是先导码,第一个 51 , 11/12 长的为 0 码, 22/23 长的为 1 码。所以上述指令解码为: 01110000 01110000 00110000 11001111 32 位数据 707030CF 一种可能的解码方法。将 TIM 通道设置为输入捕获中断。在第一个中断时启动 DMA 采集。在最后一个中断发生时,分析 DMA 采集的数据。判断头部,获取数据码。 解码程序如下: void IREncoder(void){ static uint16_t CurCnt,PreCnt; static uint8_t stt=0; uint8_t temp; static uint32_t RsvCode; CurCnt = __HAL_TIM_GET_COMPARE(&htim5,TIM_CHANNEL_4); PreCnt) temp = CurCnt - PreCnt; else temp = 65525 - PreCnt + CurCnt; if(stt = 0){ = 48)&&(temp <= 53)){ stt = 1; // 找到头 RsvCode = 0; } } else{ stt ++; RsvCode <<= 1; = 10)&&(temp <= 13)){ RsvCode += 0; } else RsvCode += 1; = 32){ stt = 0; } } }