求助!103单片机程序底部加上while(1)循环后无法输出PWM,

2019-10-15 23:38发布

程序如下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输出,仿真正常,困惑了我两天了,一直没找出原因,路过的一定要过来帮小弟分析下原因啊!!!!



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
abdfgh
1楼-- · 2019-10-16 00:52
你的时钟使能放在初始化的后面,下面有while肯定就不执行了,前面的初始化相当于没有做
不放while,只跑main,程序还会回头,相当于又去做一次初始化,你把RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);放到
void TIMx_PWM_init(TIM_TypeDef*TIMx,u8 ch,u8 f)这个里面
abdfgh
2楼-- · 2019-10-16 04:16
没有看到你设置占空比和使能定时器的函数...
梦在远方
3楼-- · 2019-10-16 06:38
abdfgh 发表于 2016-12-21 10:25
没有看到你设置占空比和使能定时器的函数...

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循环就没有输出了,我想不明白

一周热门 更多>