关于串口和定时器冲突的问题

我写了一个串口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是正常不受影响的

能力有限,暂时只能找到出问题的点,还不能剖析问题并解决,剩下的就靠大佬们了。

上一篇:uart_init


下一篇:STM32-实现串口中断接收和发送数据