预备
学习目标
概述
-
PWM模式1和PWM模式2
模式 说明 PWM模式1 CNT<CCR 是有效电平 PWM模式2 CNT>CCR 是有效电平 -
引脚映射
-
ARPE(PreloadConfig函数)
ARPE=1 更新ARR立即生效 ARPE=0 更新ARR下个周期生效
周期是ARR决定的,占空比是CCRx决定的
pwm.c
#include "pwm.h"
#include "led.h"
//这里使用PWM3的通道2(部分重映像)B5
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;//输入捕获结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//开启Tim3的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//开启PB的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);//开启复用时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//结构体赋值
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//开启定时器部分引脚重映射
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上记数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//脉宽调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0;//设置装载脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_CtrlPWMOutputs(TIM3,ENABLE);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_Cmd(TIM3, ENABLE);//使能
}
pwm.h
#ifndef __PWM_H
#define __PWM_H
#include "sys.h"
void TIM3_PWM_Init(u16 arr,u16 psc);
#endif
主函数调用
int main(void)
{
delay_init(); //延时函数初始化
u16 ledpwmval=0;
u8 dir=1;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
LED_Init(); //初始化与LED连接的硬件接口
TIM3_PWM_Init(899,0);
while(1)
{
delay_ms(10);
if(dir)ledpwmval++;
else ledpwmval--;
if(ledpwmval>890)dir=0;
if(ledpwmval==0)dir=1;
TIM_SetCompare2(TIM3,ledpwmval);
}
}
作业
- 使用别的GPIO口进行定时器的PWM输出