20250125
tips:随手记一些写程序时遇到的小问题,主要内容看纸质笔记。
目的:写NEC协议时序,发送红外信号
分配:定时器TIM1;红外发射引脚PA8(开TIM1_CH1)GPIO_Mode_AF_PP
一、红外发射模块IR_Transmitter.c
1.初始化函数中
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 1895 - 1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能或失能TIM1在CCR1上的预装载寄存器
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
需要注意的点:
(1)TIM1是高级定时器,多了很多通用定时器没有的配置,不配的话就有奇怪的问题,所以先按默认参数统一初始化,然后再配置需要的
(2)同样因为高级定时器,需要TIM_CtrlPWMOutputs
(3)输出比较通道一一对应
2.发送数据
同样遵循NEC协议,先发送引导码,然后是数据码。发送通过输出比较实现
TIM_SetCompare1(TIM1, Compare);
然后Delay延迟相应时间
for(m = 0; m < len; m++)
{
for(n = 7; n >= 0; n--)
{
IR_Transmitter_SetCompare1(661); //低电平
Delay_us(560); //低电平延时
IR_Transmitter_SetCompare1(0); //高电平
if(data[m] & (0x80 >> n)) //高电平延时
Delay_us(1600);
else
Delay_us(560);
}
}
比接收好写多了