OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3503|回复: 6

用STM32F103C8T6最小系统板写的PWM呼吸灯程序,不知道为啥下载进板子后灯一直亮,求大神指点

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-10-8
在线时间
6 小时
发表于 2020-10-17 14:55:59 | 显示全部楼层 |阅读模式
3金钱
void TIM2_PWM_Init_JX(void)
{  
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   // 使能TIM2时钟                                  JOJO
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);     // 使能GPIOA时钟

    //定时器输出引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//刷新值暂定                                                JOJO
GPIO_Init(GPIOA, &GPIO_InitStructure);       // 初始化PA0、PA1


   //初始化TIM1的计数模式、分频值、重装载值等
TIM_TimeBaseStructure.TIM_Period = 899;    // 设置下一个更新事件后,装入自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler =0;  // 设置TIM2时钟预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;      // 设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);     // 根据参数初始化TIM2

//初始化TIM1_CH1-4的PWM
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;     // 选择定时器模式:TIM脉冲宽度调制模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  // 比较输出使能

  TIM_OCInitStructure.TIM_Pulse = 0;        //jojo


TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   // 输出极性:TIM输出比较极性高;  
TIM_OC1Init(TIM2, &TIM_OCInitStructure);        // 数初始化TIM2_OC1
TIM_OC2Init(TIM2, &TIM_OCInitStructure);      // 数初始化TIM2_OC2
TIM_OC3Init(TIM2, &TIM_OCInitStructure);      // 数初始化TIM2_OC3
TIM_OC4Init(TIM2, &TIM_OCInitStructure);      // 数初始化TIM2_OC4
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);      // 使能TIM1在OC1上的预装载寄存器
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);    // 使能TIM1在OC2上的预装载寄存器
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);    // 使能TIM1在OC3上的预装载寄存器
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);    // 使能TIM1在OC4上的预装载寄存器

TIM_ARRPreloadConfig(TIM2,ENABLE);        // 使能TIM2的自动重装载寄存器

TIM_CtrlPWMOutputs(TIM2,ENABLE);        // 主输出使能
int main()
{
       
        TIM2_PWM_Init_JX;
        int dir=1;
        int compare=0;
                while(1)
  {
                delay(100);
                if(dir==1) compare++;
                else compare--;
          if(compare>500)  dir=0;
                if(compare==1) dir=1;
                TIM_SetCompare4(TIM2,compare);
        }

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-10-17 17:15:56 | 显示全部楼层
回复

使用道具 举报

12

主题

3401

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8684
金钱
8684
注册时间
2020-5-11
在线时间
4167 小时
发表于 2020-10-17 17:16:07 | 显示全部楼层
也许delay时间太短,呼吸太快了看不出来。
建议先用普通IO口模式直接驱动LED延时取反,测试delay的时间。若是有示波器测一下引脚就好了。
专治疑难杂症
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-10-8
在线时间
6 小时
 楼主| 发表于 2020-10-17 17:21:49 | 显示全部楼层

我把自动装载值改成2000也不行
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-10-8
在线时间
6 小时
 楼主| 发表于 2020-10-17 17:22:43 | 显示全部楼层
LcwSwust 发表于 2020-10-17 17:16
也许delay时间太短,呼吸太快了看不出来。
建议先用普通IO口模式直接驱动LED延时取反,测试delay的时间。 ...

也试过,我把delay的值改大也不行
回复

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2019-9-5
在线时间
68 小时
发表于 2020-10-21 21:12:50 | 显示全部楼层
重装载值太大了,1/900约等于百分之0.1的占空比,把重装载值设置为100试试看,因为你下面的比较值是自增+1,加大一点,自加5试试看
回复

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2019-9-5
在线时间
68 小时
发表于 2020-10-21 21:16:45 | 显示全部楼层
你的重装载值设置跟比较值不符合实际,1/900约等于0.1%的占空比,变化太小,建议把重装载值设小一点,可以设置成100比较好计算
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 18:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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