程序如下iint main(void)
{
LED_init();
BEEP_init();
usart_init(9600);
key_init();
delay_init();
LED1=0;
NVIC_Configuration();//中断分组设置
TIMx_PWM_init(TIM3,1,50);//PWM初始化
delay_ms(500);
START_TIME;
delay_ms(1000);
while(1);}
本人写的关于PWM输出的程序,初始化程序正常程序结尾有只要有while循环(不一定是while(1)),单片机引脚就没有PWM输出,仿真正常,困惑了我两天了,一直没找出原因,路过的一定要过来帮小弟分析下原因啊!!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
不放while,只跑main,程序还会回头,相当于又去做一次初始化,你把RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);放到
void TIMx_PWM_init(TIM_TypeDef*TIMx,u8 ch,u8 f)这个里面
PWM初始化程序
void TIMx_PWM_init(TIM_TypeDef*TIMx,u8 ch,u8 f)
{
TIM_PWM_GPIO_config();//引脚配置
TIM_parameter_config(TIMx,10000,72000000/(f*10000));/定时器配置
TIM_PWM_MODEconfig(ch,TIMx);//pwm模式配置
//TIM_Cmd(TIMx, ENABLE);
}
void TIM_PWM_GPIO_config()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//推挽复用输出
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void TIM_PWM_MODEconfig(u8 ch,TIM_TypeDef*TIMx)
{
TIM_OCInitTypeDef TIM_OCInitStruct;
if(TIMx==TIM3)
{
if(ch==1)
{
/*PWM1 Mode configuration: Channel1 */
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = CCR1_Val; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平*/
TIM_OC1Init(TIM3, &TIM_OCInitStruct); //使能通道1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//CH1预装载使能
}
if(ch==2)
{
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse=CCR2_Val;//设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OC2Init(TIM3,&TIM_OCInitStruct);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//CH1预装载使能
}
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
}
void TIM_parameter_config(TIM_TypeDef*TIMx,u16 arr,u16 prc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//定义和定时器寄存器有关的参数结构体指针
TIM_TimeBaseInitStruct.TIM_Period=arr-1;////设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseInitStruct.TIM_Prescaler=prc-1;//设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
if(TIMx==TIM3)TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//初始化定时器参数,设置自动重装值,分频系数,计数方式等
else if(TIMx==TIM2)TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
}
定时器使能用那个START_TIME代替的
#define START_TIME RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);TIM_Cmd(TIM3, ENABLE);
关键是程序下面没有while循环单片机就有PWM输出,加上while循环就没有输出了,我想不明白
一周热门 更多>