我写了一个串口1 初始化函数,和一个定时器1的函数,在函数初始化的时候发现,如果把串口的初始化函数放在定时器初始化的前面,定时器就没有输出,如果把定时器的初始化放在串口的前面,则串口和定时器都正常。
例如
Usart1_Init();
TIM_1_Iint();这样就会不正常
TIM_1_Iint();
Usart1_Init();这样就正常
这里我先给出我的代码,可以跳过代码部分直接看后面。
void rc_init(void) 这一块是串口1的。
{
GPIO_InitTypeDef GPIO_Init_config_PA;
USART_InitTypeDef USART1_Init_config;
NVIC_InitTypeDef NVIC_Init_set;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
GPIO_Init_config_PA.GPIO_Pin=GPIO_Pin_9 | GPIO_Pin_10;
GPIO_Init_config_PA.GPIO_Mode=GPIO_Mode_AF;
GPIO_Init_config_PA.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init_config_PA.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init_config_PA.GPIO_OType=GPIO_OType_PP;
GPIO_Init(GPIOA,&GPIO_Init_config_PA);
GPIO_SetBits(GPIOA,GPIO_Pin_9 | GPIO_Pin_10);
USART1_Init_config.USART_BaudRate=100000;
USART1_Init_config.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART1_Init_config.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
USART1_Init_config.USART_Parity=USART_Parity_Even;
USART1_Init_config.USART_WordLength=USART_WordLength_8b;
USART1_Init_config.USART_StopBits = USART_StopBits_1;
USART_Init(USART1,&USART1_Init_config);
USART_Cmd(USART1,ENABLE);
NVIC_Init_set.NVIC_IRQChannel=USART1_IRQn;
NVIC_Init_set.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init_set.NVIC_IRQChannelPreemptionPriority=1;
NVIC_Init_set.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_Init_set);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
}
void Fly_Motor_IO_Init(void) 这里是定时器1的,4个通道都开了,所以有点长。
{
GPIO_InitTypeDef GPIO_Init_Config;
TIM_TimeBaseInitTypeDef TIM_TimeBase_Config;
TIM_OCInitTypeDef TIM_OCInit_Config;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_TIM1);
GPIO_Init_Config.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_14;
GPIO_Init_Config.GPIO_Mode=GPIO_Mode_AF;
GPIO_Init_Config.GPIO_OType=GPIO_OType_PP;
GPIO_Init_Config.GPIO_PuPd=GPIO_PuPd_NOPULL;//GPIO_PuPd_NOPULL GPIO_PuPd_DOWN TIM_OCPolarity_High
GPIO_Init_Config.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOE,&GPIO_Init_Config);
TIM_TimeBase_Config.TIM_Prescaler=839; //定时器分频
TIM_TimeBase_Config.TIM_Period=1999; //自动重装载值
TIM_TimeBase_Config.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBase_Config.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM1,&TIM_TimeBase_Config);
TIM_OCInit_Config.TIM_OCMode = TIM_OCMode_PWM1; //TIM1_CH1
TIM_OCInit_Config.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInit_Config.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM1, &TIM_OCInit_Config);
TIM_OCInit_Config.TIM_OCMode = TIM_OCMode_PWM1; //TIM1_CH2
TIM_OCInit_Config.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInit_Config.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM1, &TIM_OCInit_Config);
TIM_OCInit_Config.TIM_OCMode = TIM_OCMode_PWM1; //TIM1_CH3
TIM_OCInit_Config.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInit_Config.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM1, &TIM_OCInit_Config);
TIM_OCInit_Config.TIM_OCMode = TIM_OCMode_PWM1; //TIM1_CH4
TIM_OCInit_Config.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInit_Config.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM1, &TIM_OCInit_Config);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1,ENABLE);
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
串口始终是好的,串口初始化函数的位置的不同会导致定时器的输出结果不同,所以我认为问题出在串口初始化上。
于是我对串口初始化的函数逐段注释,看看是那一块的问题
然后发现是串口参数初始化这一块,即
USART1_Init_config.USART_BaudRate=100000;
USART1_Init_config.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART1_Init_config.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
USART1_Init_config.USART_Parity=USART_Parity_Even;
USART1_Init_config.USART_WordLength=USART_WordLength_8b;
USART1_Init_config.USART_StopBits = USART_StopBits_1;
USART_Init(USART1,&USART1_Init_config);
这一块是根据遥控器接收机的参数设定。
然后再逐行找问题,我先把第一项波特率改小,结果一改小(先是改成9600),pwm波就能输出了。又试了115200,结果pwm不能输出;再试9999,结果pwm不能输出;再试9998,结果pwm能输出。
后面又试了别的设置项,结果是,是波特率影响的pwm波。
之后用串口3试了一下,发现还是同样的问题。
同时发现,定时器4个通道里,通道4是正常不受影响的
能力有限,暂时只能找到出问题的点,还不能剖析问题并解决,剩下的就靠大佬们了。