野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11039|回复: 6

通用定时器输出2路PWM呼吸灯——断电后再上电有时候不能正常运行

[复制链接]
发表于 2018-1-23 09:16:58 | 显示全部楼层 |阅读模式
我用STM32F103ZET霸道开发板,我运用通用定时器做2路PWM输出(呼吸灯),程序写好后,用仿真器下载后正常运行,但是断电在上电之后就不能正常运行了,断电在上电10次有6次这样是不正常运行的,4次正常运行。不知道原因,求帮助,谢谢!

下面是主程序main代码

  1. #include "stm32f10x.h"
  2. #include "bsp_GeneralTim.h"


  3. void Delay( uint32_t count )
  4. {
  5.     for(; count!=0; count--);
  6. }


  7. int main(void)
  8. {

  9. volatile    uint8_t n1=1;
  10. volatile    uint8_t n2=0;
  11.     GENERAL_TIM_Init();


  12.     while(1)
  13.     {
  14.         if(n1)
  15.         {
  16.               TIM2->CCR3+=1;
  17.               if(TIM2->CCR3>199)
  18.                   n1=0;
  19.         }
  20.         else
  21.         {
  22.                 TIM2->CCR3-=1;
  23.                 if(TIM2->CCR3<1)
  24.                     n1=1;
  25.         }

  26.         if(n2)
  27.         {
  28.               TIM2->CCR4+=1;
  29.               if(TIM2->CCR4>199)
  30.                   n2=0;
  31.         }
  32.         else
  33.         {
  34.                 TIM2->CCR4-=1;
  35.                 if(TIM2->CCR4<1)
  36.                     n2=1;
  37.         }

  38.         Delay(0xFFFF);
  39.     }
  40. }
复制代码

bsp_GeneralTim.h代码

  1. #ifndef __BSP_GENERALTIME_H
  2. #define __BSP_GENERALTIME_H

  3. #include "stm32f10x.h"


  4. #define            GENERAL_TIM                   TIM2
  5. #define            GENERAL_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
  6. #define            GENERAL_TIM_CLK               RCC_APB1Periph_TIM2
  7. #define            GENERAL_TIM_PERIOD            (200-1)
  8. #define            GENERAL_TIM_PSC               (4-1)

  9. #define            GENERAL_TIM_CH3_GPIO_CLK      RCC_APB2Periph_GPIOA
  10. #define            GENERAL_TIM_CH3_PORT          GPIOA
  11. #define            GENERAL_TIM_CH3_PIN           GPIO_Pin_2


  12. #define            GENERAL_TIM_CH4_GPIO_CLK      RCC_APB2Periph_GPIOA
  13. #define            GENERAL_TIM_CH4_PORT          GPIOA
  14. #define            GENERAL_TIM_CH4_PIN           GPIO_Pin_3



  15. void GENERAL_TIM_Init(void);

  16. #endif    /* __BSP_GENERALTIME_H */
复制代码

bsp_GeneralTim.c代码

  1. #include "bsp_GeneralTim.h"


  2. static void GENERAL_TIM_GPIO_Config(void)
  3. {
  4.   GPIO_InitTypeDef GPIO_InitStructure;

  5.   RCC_APB2PeriphClockCmd(GENERAL_TIM_CH3_GPIO_CLK, ENABLE);
  6.   GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH3_PIN;
  7.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  8.   GPIO_Init(GENERAL_TIM_CH3_PORT, &GPIO_InitStructure);


  9.   RCC_APB2PeriphClockCmd(GENERAL_TIM_CH4_GPIO_CLK, ENABLE);
  10.   GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH4_PIN;
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  12.   GPIO_Init(GENERAL_TIM_CH4_PORT, &GPIO_InitStructure);


  13. }


  14. static void GENERAL_TIM_Mode_Config(void)
  15. {
  16.       // 开启定时器时钟,即内部时钟CK_INT=72M
  17.     GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);

  18. /*--------------------时基结构体初始化-------------------------*/   
  19.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  20.     // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  21.     TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_PERIOD;   
  22.     // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
  23.     TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_PSC;   
  24.     // 时钟分频因子 ,配置死区时间时需要用到
  25.     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

  26.     // 计数器计数模式,设置为向上计数
  27.     TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        
  28.     // 重复计数器的值,没用到不用管
  29.     //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  30.     // 初始化定时器
  31.     TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);

  32.    
  33.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  34.         // 配置为PWM模式1
  35.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  36.         // 输出使能
  37.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  38.         // 设置占空比大小
  39.         TIM_OCInitStructure.TIM_Pulse = 100;
  40.         // 输出通道电平极性配置
  41.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  42.         // 输出通道空闲电平极性配置
  43.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;


  44.         TIM_OC3Init(GENERAL_TIM, &TIM_OCInitStructure);
  45.         TIM_OC3PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);

  46.         TIM_OCInitStructure.TIM_Pulse = 101;

  47.         TIM_OC4Init(GENERAL_TIM, &TIM_OCInitStructure);
  48.         TIM_OC4PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);


  49.         TIM_ARRPreloadConfig(GENERAL_TIM, ENABLE);


  50.         // 使能计数器
  51.         TIM_Cmd(GENERAL_TIM, ENABLE);
  52. }

  53. void GENERAL_TIM_Init(void)
  54. {
  55.     GENERAL_TIM_GPIO_Config();
  56.     GENERAL_TIM_Mode_Config();
  57. }
复制代码




回复

使用道具 举报

发表于 2018-1-23 10:29:59 | 显示全部楼层
有时可以有时不行一般不是程序的问题哦,不过可以检查下定时器的初始化部分,确认下没有漏掉某个结构体成员的赋值,如果漏了会用默认值就会出错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 11:11:45 | 显示全部楼层
左丘冰 发表于 2018-1-23 10:29
有时可以有时不行一般不是程序的问题哦,不过可以检查下定时器的初始化部分,确认下没有漏掉某个结构体成员 ...

通用定时器用不到互补通道,所以我没有配置。   但是我刚才把其他成员(互补通道)都配置了还是一样。仿真器下载后正常。但是断电再上电后有时候不正常
回复 支持 反对

使用道具 举报

发表于 2018-1-23 11:16:05 | 显示全部楼层
好诡异
回复

使用道具 举报

 楼主| 发表于 2018-1-23 11:24:29 | 显示全部楼层

我按百度的方法;   加延时再初始化定时器配置;
                         配置多几次定时器配置;

都不行,难受。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-24 08:11:50 | 显示全部楼层
来一堆大神来一堆大神来一堆大神
回复 支持 反对

使用道具 举报

发表于 2018-2-26 14:52:44 | 显示全部楼层
楼主问题有没有解决了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 12:58 , Processed in 0.031786 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表