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

您所在的位置:网站首页 全民k歌vip兑换码领取在哪里 关于串口和定时器冲突的问题

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

#关于串口和定时器冲突的问题| 来源: 网络整理| 查看: 265

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3