学习单片机配置一个所需要的功能,切记,切记,流程很重要,一定要多注意去总结,然后记录下来。
今天我们现讲一下配置,定时器PWM功能的流程。
配置流程:
1、开启定时器时钟和PWM输出GPIO端口时钟;
RCC_APB2PeriphClockCmd()或者RCC_APB1PeriphClockCmd()函数
根据外设找时钟函数
RCC_APB1PeriphClockCmd():上挂接的外设;
RCC_APB2PeriphClockCmd():上挂接的外设;
2、GPIO初始化 利用GPIO_Init()函数(复用推挽输出)
这个结构体的配置我就不粘出来了吧,就是点灯操作(哈哈哈)
3、定时器参数初始化; 利用TIM_Init()函数
利用TIM_TimeBaseInitTypeDef结构体进行配置,这是结构体里面的参数以及配置成什么样
4、输出比较初始化 利用TIM_OCxInit()函数 x:通道号
利用TIM_OCInitTypeDef结构体进行配置,这是结构体里面的参数以及配置成什么样
里面没有参数的都是高级定时器的参数配置,我就没有配置
5、使能定时器 利用 TIM_Cmd()函数
注:配置PWM输出时,一定先要看准定时器的输出通道,然后进行配置GPIO为复用推挽输出,先初始化定时器的基本内容,然后配置配置输出比较初始化函数(PWM是输出比较的一种模式),切记,一定看准这个初始化函数,是带数字的(数字表示通道数);
输出比较初始化函数原型,一共有四个,表示四个通道
还有两个库函数一定要记住
函数原型以及解析:
1、void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct)
这个函数是配置输出比较初始化结构体参数的,TIM_OCInitTypeDef:这个结构体参数有很多,有一半都是高级定时器(TIM1、TIM8)的参数,如果你用的通用定时器(TIM2~TIM5),那么一般的参数都不需要配置,但是,有参数不配置,在下次换成高级定时器时,会直接不好使,所以利用这个函数来,设置一下所有参数的值(这个值影响不到任何功能变化)。
2、void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)
这个函数是改变占空比的,第一个参数选择定时器,第二个参数是数字,来改变占空比,也就是会直接改变输出比较初始化结构体里面的参数TIM_Pulse的数字;
我感觉应该啥东西了,原理的话,自己找视频看吧。
定时器配置的源码:你们可以参考一下
void My_PWM_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;//GPIO结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//定时器结构体
TIM_OCInitTypeDef TIM_OCInitStruct;//输出比较结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);//开启GPIO时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启定时器时钟
//2、初始化GPIO
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//3、初始化定时器
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分频
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInitStruct.TIM_Period=100-1;//重装载值,控制PWM周期
TIM_TimeBaseInitStruct.TIM_Prescaler=720-1;//预分频器
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
//4、初始化输出比较模式、配置输出比较模式的结构体参数
TIM_OCStructInit(&TIM_OCInitStruct);//配置输出比较结构体的参数
TIM_OCInitStruct.TIM_Pulse=50; //配置CCR寄存器,控制占空比
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1; //配置输出比较模式
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//控制输出的极性
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//输出使能
TIM_OC1Init(TIM2,&TIM_OCInitStruct);
//5、使能定时器
TIM_Cmd(TIM2,ENABLE);
}
//TIM_SetCompare(x)()函数可以改变占空比