你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103RCT6呼吸灯实验PWM调不出来

[复制链接]
tmkc 提问时间:2020-1-6 09:34 /
STM32F103RCT6呼吸灯实验PWM调不出来,用的原子MINI 开发板,利用PA8 复用功能TIM1_CH1   输出PWM
#include"stm32f10x.h"
#include"sys.h"
#define LED0 PAout(8)
#define LED1 PDout(2)
void SysTick_Init(u8 SYSCLK);  //SysTick初始化函数声明
void delay_ms(u16 nms);        //自定义的延时毫秒函数声明
void GPIO_Configuration(void); //GPIO端口初始化设置函数声明
void TIM1_PWM_Init(u16 arr,u16 psc);//定时器1初始化设置配置成PWM输出函数声明
u8 fac_us=0;
u16 fac_ms=0;
int main(void)
{ u16 led0pwmval=0;
        u8 dir=1;
        SysTick_Init(72);  // 调用SysTick初始化函数
  //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        GPIO_Configuration();
        TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz
        while(1)
        {
                 delay_ms(10);         
                if(dir)led0pwmval++;
                else led0pwmval--;         
                 if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;                                                   
                TIM_SetCompare1(TIM1,led0pwmval);           
         }
}
void SysTick_Init(u8 SYSCLK) //SysTick初始化函数
{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SYSCLK/8; //SYSCLK的8分频 保存1us所需的计数次数
fac_ms=(u16)fac_us*1000; //1ms 需要计数的次数
}

void GPIO_Configuration(void)
{        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);//使能PA,PD外设端口时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                  //LED0-->PA8 端口配置
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出,TIM1_CH1输出PWM脉冲波形
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                          //根据设定参数初始化GPIOA.8
  // GPIO_SetBits(GPIOA,GPIO_Pin_8);                                                        //PA8 输出高
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                            //LED1-->PD2 端口配置
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOD, &GPIO_InitStructure);                                          //根据设定参数初始化GPIOD.2,推挽输出,IO口速度为50MHz
  GPIO_SetBits(GPIOD,GPIO_Pin_2);                                                       //PD.2 输出高           
}

void TIM1_PWM_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  TIM_CtrlPWMOutputs(TIM1,ENABLE);                         //MOE 主输出使能        
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
        TIM_ARRPreloadConfig(TIM1, ENABLE);                //使能TIMx在ARR上的预装载寄存器
        TIM_Cmd(TIM1, ENABLE);                             //使能TIM1
}

void delay_ms(u16 nms) //利用SysTick自定义的延时毫秒函数 最长延时1864ms
{u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; // nms毫秒需要装载的寄存器值
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01; //开始倒数
do{temp=SysTick->CTRL;}
while ((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~0x01; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}


收藏 评论6 发布时间:2020-1-6 09:34

举报

6个回答
tmkc 回答时间:2020-1-6 09:39:40
void SysTick_Init(u8 SYSCLK) //SysTick初始化函数
{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SYSCLK/8; //SYSCLK的8分频 保存1us所需的计数次数
fac_ms=(u16)fac_us*1000; //1ms 需要计数的次数
}

void GPIO_Configuration(void)
{        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);//使能PA,PD外设端口时钟
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                  //LED0-->PA8 端口配置
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //复用推挽输出,TIM1_CH1输出PWM脉冲波形
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                          //根据设定参数初始化GPIOA.8
  GPIO_SetBits(GPIOA,GPIO_Pin_8);                                                        //PA8 输出高
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                            //LED1-->PD2 端口配置
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOD, &GPIO_InitStructure);                                          //根据设定参数初始化GPIOD.2,推挽输出,IO口速度为50MHz
  GPIO_SetBits(GPIOD,GPIO_Pin_2);                                                       //PD.2 输出高           
}

void TIM1_PWM_Init(u16 arr,u16 psc)
{ GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能TIM1外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                  //LED0-->PA8 端口配置
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出,TIM1_CH1输出PWM脉冲波形
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
       
       
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  TIM_CtrlPWMOutputs(TIM1,ENABLE);                         //MOE 主输出使能       
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
        TIM_ARRPreloadConfig(TIM1, ENABLE);                //使能TIMx在ARR上的预装载寄存器
        TIM_Cmd(TIM1, ENABLE);                             //使能TIM1
}

void delay_ms(u16 nms) //利用SysTick自定义的延时毫秒函数 最长延时1864ms
{u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; // nms毫秒需要装载的寄存器值
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01; //开始倒数
do{temp=SysTick->CTRL;}
while ((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~0x01; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
toofree 回答时间:2020-1-6 11:44:57
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
先不用主循环,只给 TIM_Pulse 设定几个不同的固定值,看亮度有变化没。
比如,0,50,200,400,800

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

tmkc 回答时间:2020-1-6 12:15:05
toofree 发表于 2020-1-6 11:44
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
先不用主循环,只给 TIM_Pulse  ...

如果把void GPIO_Configuration(void)函数里的
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
GPIO_Init(GPIOA, &GPIO_InitStructure);
这些都打//屏蔽掉
tmkc 回答时间:2020-1-6 12:20:06
如果把void GPIO_Configuration(void)函数里的这几句
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                  //LED0-->PA8 端口配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出,TIM1_CH1输出PWM脉冲波形
        GPIO_Init(GPIOA, &GPIO_InitStructure);


移动加到void TIM1_PWM_Init(u16 arr,u16 psc)函数里边,PWM呼吸灯就正常了, 有点奇怪,想不通
klhsdyy 回答时间:2020-1-6 12:21:24
你没有开启PWM吧
tmkc 回答时间:2020-1-6 12:30:51
PWM开了啊

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版