#include "stm32f10x.h" // Device header
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//开启 APB1 外设总线上的外设时钟,RCCAPB1Periph_TIM2 表示要开启 TIM2 的时钟,ENABLE 表示要开启时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//开启 APB2 外设总线上的外设时钟,RCCAPB2Periph_GPIOA 表示要开启 GPIOA 的时钟,ENABLE 表示要开启时钟。
GPIO_InitTypeDef GPIO_InitStructure;
//声明了一个名为 GPIOInitStructure 的 GPIO_InitTypeDef 结构体变量,用于配置 GPIO 的各种参数,包括模式、引脚、频率等。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//将 GPIOA 的第1个引脚设置为复用推挽输出模式,即该引脚可以被其他外设或者功能复用,并且是推挽输出模式。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
// 设置要初始化的引脚,这里是 GPIOA 的第1个引脚。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//设置该引脚的输出频率为50MHz。
GPIO_Init(GPIOA, &GPIO_InitStructure);
//将配置好的 GPIO_InitStructure 结构体应用到 GPIOA 的对应引脚上,从而完成 GPIOA 引脚的初始化。
TIM_InternalClockConfig(TIM2);
//配置 TIM2 的计数器时钟源为内部时钟,即 APB1 时钟。这里没有指定具体的计数器时钟频率,所以默认使用的是 APB1 时钟频率,一般为 CPU 主频(如常见的 72MHz)。
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
//声明一个名为 TIMTimeBaseInitStructure 的 TIMTimeBaseInitTypeDef 结构体变量,用于配置 TIM2 的各种参数,包括计数模式、溢出周期、分频器等。
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//设置计数器时钟分割(即分频器)系数为 1,即不分频。
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
//设置 TIM2 的计数模式为向上计数模式,即计数器从 0 开始递增,当计数器达到设定的溢出周期后自动清零,并发出中断或者触发其他事件。
TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;
//设置 TIM2 的溢出周期为 20000-1,即当计数器计数到 20000 时发生更新事件,同时计数器清零重新开始计数。
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
//设置 TIM2 的分频器系数为 72-1,即计数器时钟频率为 APB1 时钟频率除以 72。这里使用了上面提到的分频系数 1 和主频为 72MHz 的情况下,所得到的计数器时钟频率为 1MHz。
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
//TIMRepetitionCounter 变量没有实际用途,只是一个保留字段。明确将 TIM2 的 TIM_RepetitionCounter 值设置为 0,即使其无效化,避免误用。
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//将配置好的 TIM_TimeBaseInitStructure 结构体应用到 TIM2 上,从而完成对 TIM2 的基本配置。
TIM_OCInitTypeDef TIM_OCInitStructure;
//声明一个名为 TIMOCInitStructure 的 TIMOCInitTypeDef 结构体变量,用于配置 TIM2 的输出通道2的各种参数,包括占空比、极性等。
TIM_OCStructInit(&TIM_OCInitStructure);
//将 TIM_OCInitStructure 结构体变量中的所有成员设置为默认值,以避免未经初始化的寄存器值可能会导致不可预知的问题。
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//设置 TIM2 输出通道2 的工作模式为 PWM1 模式,即高电平持续时间小于周期的情况下输出 PWM 信号,常用于控制电机等设备。
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//设置 PWM 信号的极性为高电平有效。
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//设置 TIM2 输出通道2 的使能状态为使能,即允许输出 PWM 信号。
TIM_OCInitStructure.TIM_Pulse = 0;
//设置 PWM 信号的占空比初始值为0,即输出一直保持低电平。
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
//将配置好的 TIM_OCInitStructure 结构体应用到 TIM2 输出通道2 上,使之能够输出 PWM 信号。
TIM_Cmd(TIM2, ENABLE);
//用于启动或停止指定定时器的函数。
}
void PWM_SetCompare2(uint16_t Compare)
{
TIM_SetCompare2(TIM2, Compare);
}
/*用于设置定时器 TIM2 的输出通道 2(TIM2CH2)的比较值,从而实现 PWM 信号的调节。其中,PWMSetCompare2 函数接受一个参数 Compare,表示需要设置的比较值。PWMSetCompare2 函数的设计采用了封装的思想,从而提高了代码的可读性和可重用性。
通过将底层的驱动函数 TIMSetCompare2 封装在上层的函数中,可以隐藏掉一些具体实现的细节,使得主程序只需要调用简单易懂的函数即可实现复杂功能的实现。这种思想在编程中十分常见,被称为“模块化编程”,能够大大提高代码的灵活性和可维护性,
也是现代软件开发中非常重要的一部分。*/