中级会员
 
- 积分
- 211
- 金钱
- 211
- 注册时间
- 2016-10-3
- 在线时间
- 32 小时
|
1金钱
//问题描述:利用定时器输入捕获功能解码红外遥控,解码后的数据通过串口显示在串口调试助手上。但是无论如何都不能正确解码红外遥控。
//硬件:原子哥MINI板
//编译环境:MDK5
//解码思路:配置TIM2_CH2作为输入捕获通道,开启捕获中断(没有开启更新中断),在中断中对捕获到的数据做进一步的处理。
//以下附带代码,后续再对我的代码作一个详细的说明,请原子哥指正,看到底是哪个环节出了问题。
//定时器捕获初始化函数
u8 AddressCodeL = 0;//地址码低
u8 AddressCodeH = 0;//地址码高
u8 KeyCode = 0;//键值,我们需要的就是这个数据
u8 KeyCodeF = 0;//键值反码
u32 IR_Data = 0;//一帧数据
u8 IR_RECEIVE_STA = 0;
//[7]:0,没有成功接收到一帧信号;1,成功接收到一帧信号
//[6]:0,没有成功接收到引导码;1,成功接收到引导码
//[5:0]:对遥控接收脉冲计数
u16 TIM2CH2_CAPTURE_VAL;
u8 TIM2CH2_CAPTURE_STA = 0;
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次(即先捕获到高电平,然后捕获到低电平).
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数,最大溢出次数为2^5-1.
//PA1\TIM2_CH2\TIM5_CH2
//利用输入捕获红外解码
//初始化步骤:
//①使能TIM2,PA时钟,配置PA为下拉输入
//②配置计数器ARR,PSC
//③配置捕获模式
void IR_Init(u16 reload_val,u16 psc)
{
RCC->APB1ENR &= ~(1<<0);//清0位0
RCC->APB1ENR |= 1<<0;//使能TIM2时钟
RCC->APB2ENR &= ~(1<<2);//清0位2
RCC->APB2ENR |= 1<<2;//使能PORTA时钟
GPIOA->CRL &= 0XFFFFFF0F;//清0位【7:4】
GPIOA->CRL |= 0X00000080;
GPIOA->ODR |= 1<<1;//配置PA1输入上拉
TIM2->ARR = reload_val;//配置重加载值
TIM2->CR1 |= 1<<7;//TIM2_ARR被装入缓冲器
TIM2->CR1 |= 0<<4;//计数器向上计数
TIM2->PSC = psc;//配置预分频器(计数器计数频率)
TIM2->CCMR1 |= 1<<8;//配置TIM2_CH2输入,且IC2映射至TI2上。
TIM2->CCMR1 |= 0<<12;//无滤波器,以fDTS采样
TIM2->CCMR1 |= 3<<12;//无滤波器,以fDTS采样
TIM2->CR1 |= 0<<8;//配置fDTS = fCK_INT
TIM2->CCER |= 0<<5;//CH2上升沿捕获
TIM2->CCMR1 |= 0<<10;//无预分频器
TIM2->CCER |= 1<<4;//使能CH2输入捕获
TIM2->DIER |= 1<<2;//使能TIM2_CH2捕获中断
//TIM2->DIER |= 1<<0;//使能TIM2更新中断
TIM2->CR1 |= 1<<0;//使能计数器
MY_NVIC_Init(1,3,TIM2_IRQn,2);//抢占2,子优先级0,组2
}
|
|