2018/4/21
STM32
1.相关关键词注释:
1.PWM(脉冲宽度调制):通过数字输出对模拟量进行控制
2.TIM_x:定时器,在STM32中存在8个
3.TIM_OC:实现输出比较功能
4.pwmval:占空比
2.具体配置流程
1,介绍:作为PWM除了基本定时器没有通道,通用寄存器有4道,高级寄存器有7道
2.步骤
//高级定时器的PWM输出功能
//实现PWM输出步骤
//1.使能定时器3和相关IO口时钟
//2.初始化IO口为复用输出
//3.重映射PB5
//4.实现初始化定时器arr psc
//5.初始化比较参数
//6.使能预装载定时器
//7.使能定时器
//8.改变CCRX实现占空比的效果
3.具体实现
1.相关结构体的配置和时钟使能(准备工作)
//结构体初始化
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//设置定时器的初始化
TIM_OCInitTypeDef TIM_OCInitStructure;//实现对输出比较功能的配置
//配置GPIO口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//使能TIM1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO,ENABLE);//使能GPIOB和AFIO的复用时钟
2.初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置复用推挽 输出 /
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
3.配置定时器1(高级定时器)
TIM_TimeBaseInitStructure.TIM_Period=arr;//自动重载寄存器周期
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;//时钟频率的预分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//设置时钟分割,滤波器的频率和定时器的频率是一样的
//这2位定义在定时器时钟(CK_INT)频率、死区时间和由死区发生器与数字滤波器(ETR,TIx)所用
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);//进行定时器3的初始化
//TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); //允许更新中断
4.配置比较功能(TIMx_OC)
//配置PWM通道
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
//设置为模式2,模式2代表着如果所在值(TIMx_CNT)小于捕获值(TIM_xCCR)有效(高低电平可调)
//设置为模式1,模式1代表着如果所在值(TIMx_CNT)大于捕获值(TIM_xCCR)有效(高低电平可调)
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
//使能高级寄存器的刹车和死区寄存器
TIM_CtrlPWMOutputs(TIM1,ENABLE); //⑤MOE 主输出使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1 预装载使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器
TIM_Cmd(TIM1,ENABLE);//使能TIM1
}
5.主函数(这里是为了实现呼吸灯)#include"sys.h"
#include"delay.h"
#include"led.h"
#include"time.h"
int main()
{
u16 led0pwmval=0;//设置占空比
u8 dir=1;//设置状态值
delay_init(); //延时函数初始化
LED_Init(); //初始化与 LED 连接的硬件接口
TIM1_PWM_Init(899,0);//PWM的重载系数值为900 f=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);//修改占空比
}
}
注:TIM_SetCompare1(TIM1,led0pwmval)的介绍
1.实现在占空比周围实现电平的转变,从而实现呼吸灯的亮灭变化