stm32定时器输出PWM控制LED灯
stm32定时器输出PWM控制LED灯
wangxl@20180723
一、概述
本章中,通过查看原理图,我们的LED指示灯配置在PA4管脚上,查表得知PA4的管脚与TIM14 的通道1重映射, 通过定时器产生 PWM 来控制指示灯的亮度。
二、本章学习目标
- 学会查看数据手册
- 理解stm32端口复用
- 学会配置 STM32 的定时器
- 学会配置定时器输出PWM
三、PA端口复用
参见DataSheet:“STM32F030x数据手册.pdf”P31
**复用功能**:要想用某个复用功能,首先把IO口配置成复用功能模式,复用输出输入模式(根据功能的不同配置成不同的模式,参考手册里面详细介绍)。比如你想用PA4复用功能TIM14-CH1输出比较,先把PA4设置为推挽复用输出(GPIO_MODE_AF)。再配置TIM14-CH1即可。
Gpio复用功能配置函数介绍:
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource,uint8_t GPIO_AF)
函数解释:改变指定管脚的映射关系。即配置指定管脚的复用功能。
函数参数说明:
GPIOx:gpio的分组/gpio端口;
GPIO_PinSource:具体要配置成复用功能的管脚(如GPIO_Pin_0 GPIO_Pin_1这样的宏定义);
GPIO_AF:选择该管脚要使用的复用功能。有如下配置:(注意:复用功能的配置要和实际管脚支持的复用功能匹配)
如本例配置:GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_4);
四、功能简介
通过初始调用Timer_cfg(),配置PA4管脚对应的tim14时钟;实时调用PWM_cfg(uint8_t duty)函数,传输不同的duty值,改变比较寄存器(CCR1)中的值,从而改变PWM的占空比,实现产生频率为1K占空比的PWM波。
五、代码参考
1、timerpwm.h头
//————————————timerpwm.h—————————————————-
#ifndef __TIMERPWM_H
#define __TIMERPWM_H
#include “stm32f0xx.h”
//PA4 TIM14_CH1
extern TIM_OCInitTypeDef TIM_OCInitStructure;
#define LED_PWM_VAL TIM4->CCR1 //CCR1捕获比较值寄存器
#define PWM_PIN GPIO_Pin_4
#define PWM_GPIO_PORT GPIOA
#define PWM_GPIO_CLK RCC_AHBPeriph_GPIOA
void Timer_cfg();
void PWM_cfg(uint8_t duty);
#endif
//————————————timerpwm.h end—————————————————-
- Timerpwm.c
#include “timerpwm.h”
uint16_t TimerPeriod;
//初始配置PA4对应的tim14时钟
void Timer_cfg()
{
GPIO\_InitTypeDef GPIO\_InitStructure;
TIM\_TimeBaseInitTypeDef TIM\_TimeBaseStructure;
/\* GPIOA Clocks enable \*/
RCC\_AHBPeriphClockCmd( PWM\_GPIO\_CLK, ENABLE);//使能GPIO的AHB总线时钟
/\* GPIOA PA4 Configuration: Time4 Channel 1 \*/
GPIO\_InitStructure.GPIO\_Pin = PWM\_PIN ;
GPIO\_InitStructure.GPIO\_Mode = GPIO\_Mode\_AF; //把需要的管脚配置成第二功能模式
GPIO\_InitStructure.GPIO\_Speed = GPIO\_Speed\_50MHz;
GPIO\_InitStructure.GPIO\_OType = GPIO\_OType\_PP;
GPIO\_InitStructure.GPIO\_PuPd = GPIO\_PuPd\_UP ;
GPIO\_Init(PWM\_GPIO\_PORT, &GPIO\_InitStructure);//对PA4进行IO口初始化
//配置管脚复用 GPIOA4复用为TIM14
GPIO\_PinAFConfig(PWM\_GPIO\_PORT, GPIO\_PinSource4, GPIO\_AF\_4);
//使能TIM14时钟
RCC\_APB1PeriphClockCmd(RCC\_APB1Periph\_TIM14, ENABLE);
/\* Compute the value to be set in ARR regiter to generate signal frequency at 1 Khz \*/
TimerPeriod = (SystemCoreClock / 1000 ) - 1;
/\* Time Base configuration \*/
TIM\_TimeBaseStructure.TIM\_Prescaler = 0;
TIM\_TimeBaseStructure.TIM\_CounterMode = TIM\_CounterMode\_Up;
TIM\_TimeBaseStructure.TIM\_Period = TimerPeriod;
TIM\_TimeBaseStructure.TIM\_ClockDivision = 0;
TIM\_TimeBaseStructure.TIM\_RepetitionCounter = 0;
//使用内部时钟
TIM\_TimeBaseInit(TIM14, &TIM\_TimeBaseStructure);
}
//led灯的pwm占空比输出
void PWM_cfg(uint8_t duty)
{
//占空比,取值范围为0-100
int dutyfactor = (uint16\_t) (((uint32\_t) duty \* (TimerPeriod-1 )) / 100);
TIM\_OCInitTypeDef TIM\_OCInitStructure;
//设置缺省值
TIM\_OCStructInit(&TIM\_OCInitStructure);
/\* Channel 1 Configuration in PWM mode \*/
TIM\_OCInitStructure.TIM\_OCMode = TIM\_OCMode\_PWM2;//选择定时器模式
TIM\_OCInitStructure.TIM\_OutputState = TIM\_OutputState\_Enable; //选择输出比较状态 使能输出状态 开启OC\*输出到对应引脚
TIM\_OCInitStructure.TIM\_OutputNState = TIM\_OutputNState\_Enable;//选择互补输出比较状态 互补输出使能 开启OC\*N输出到对应的引脚
TIM\_OCInitStructure.TIM\_Pulse = dutyfactor; //设置了待装入捕获比较器的脉冲值
//TIM输出比较极性高
TIM\_OCInitStructure.TIM\_OCPolarity = TIM\_OCPolarity\_High;//设置TIM输出比较极性 高
TIM\_OC1Init(TIM14, &TIM\_OCInitStructure);
TIM\_Cmd(TIM14, ENABLE);
//设置TIM1的PWM输出为使能
TIM\_CtrlPWMOutputs(TIM14,ENABLE);
}
还没有评论,来说两句吧...