文章目录
关于PWM波的输出,我们需要用到定时器的4个通道(通用定时器和高级定时器有,基本定时器没有这4个通道)里面的PWM生成。然后查看数据手册,了解定时器的重映射引脚情况。所以配置时,需要:开GPIO时钟,引脚复用时钟,定时器时钟;定时器部分重映射;GPIO引脚初始化配置,定时器初始化配置,定时器的PWM模式配置;使能定时器CCRx重装载;最后使能时钟。
在main函数里面,TIM_SetCompare2(TIM3,PWM_Val);//通过设置比较值来调占空比。这个后面一定是需要一点延时的,不然呼吸灯不会亮!
留有一个疑问:我看的书上用定时器输出PWM波的时候用到了定时器中断,我并不知道为什么。
1. 代码
main.c
#include "stm32f10x.h" // Device header
#include "pwm.h"
#include "Delay.h"
int main (void)
{
uint16_t PWM_Val = 0;//定义变量PWM_Val为PWM的占空比
uint8_t cnt = 1;//定义一个变量,用于判断。
PWM_remapGPIO_Init(899,0);
while(1)
{
if(cnt)
PWM_Val ++;
else
PWM_Val --;
if(PWM_Val > 600)
cnt = 0;
if(PWM_Val==0)
cnt = 1;
TIM_SetCompare2(TIM3,PWM_Val);//通过设置比较值来调占空比。
Delay_ms(5);
}
}
pwm.c
#include "stm32f10x.h" // Device header
/**
* @brief 通用定时器TIM3的PWM波输出
* @param
* @retval
*/
void PWM_remapGPIO_Init(uint16_t ARR,uint8_t psc)
{
GPIO_InitTypeDef PWM_GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);//使能GPIO外设与AFIO复用功能模块时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//选则TIM3部分重映像
// 1·配置PWM输出通道,开启TIM3时钟
// TIM2的通道2(CH2)作为PWM的输出引脚,就需要对PB5进行配置
PWM_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
PWM_GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
PWM_GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&PWM_GPIO_InitStruct);
//2·初始化定时器3(TIM3)
TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = ARR;
TIM_TimeBaseInitStruct.TIM_Prescaler = psc;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
//3·设置TIM3_CH2的PWM模式,使能TIM3的CH2输出
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//设置定时器模式:PWM2模式
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStruct.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OC2Init(TIM3,&TIM_OCInitStruct);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能TIM3重载CCR2上的预装载寄存器
TIM_Cmd(TIM3,ENABLE);
}