中断优先级
配置NVIC来进行中断优先级配置(值越小,优先级越高)。
NVIC优先级分组
NVIC的优先级组通过NVIC_PriorityGroupConfig(NVIC_PriorityGroup_X)来配置X表示哪个分组。
| NVIC组 | 抢占优先级 | 响应优先级 |
|---|---|---|
NVIC_PriorityGroup_0 |
0bits | 4bits,可分为0-15 |
NVIC_PriorityGroup_1 |
1bits | 3bits |
NVIC_PriorityGroup_2 |
2bits | 2bits |
NVIC_PriorityGroup_3 |
3bits | 1bits |
NVIC_PriorityGroup_4 |
4bits | 0bits |
计数器计数频率
$$
CK_CNT = CK_PSC/(PSC+1)
$$
CK_CNT:定时器时钟,CK_PSC:定时器时钟源,PSC:预频分值。
计数器溢出频率
$$
CK_CNT_OV = CK_CNT/(ARR +1)=CK_PSC/(PSC+1)/(ARR+1)
$$
ARR:自动重装值。
PWM
PWM频率
$$
Freq =CK_CNT /(PSC+1)/(ARR+1)
$$
PWM占空比
$$
Duty=CCR/(ARR+1)
$$
PWM分辨率
$$
Reso = 1/(ARR+1)
$$
标准库PWM设置
以TIM2的通道4为例。
void TIM2_PWM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 配置定时器周期为20ms(50Hz)
TIM_TimeBaseStructure.TIM_Period = 2000 - 1; // 72MHz / 7200 = 10KHz (ARR)
TIM_TimeBaseStructure.TIM_Prescaler = 720 - 1; // 10KHz / 720 = 50Hz (PSC)
TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 初始化TIM2
// 配置PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
TIM_OCInitStructure.TIM_Pulse = 150; // 初始位置1.5ms (初始值)
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性高
TIM_OC4Init(TIM2, &TIM_OCInitStructure); // 使用通道4
// 使能TIM2
TIM_Cmd(TIM2, ENABLE);
TIM_CtrlPWMOutputs(TIM2, ENABLE); // 主输出使能
}
PWM模式1和PWM模式2的区别
| 特性 | PWM模式1 (TIM_OCMode_PWM1) |
PWM模式2 (TIM_OCMode_PWM2) |
|---|---|---|
| 有效电平 | 计数器值 < TIM_Pulse 时有效 |
计数器值 ≥ TIM_Pulse 时有效 |
| 无效电平 | 计数器值 ≥ TIM_Pulse 时无效 |
计数器值 < TIM_Pulse 时无效 |
| 极性反转 | 通过 TIM_OCPolarity 配置 |
通过 TIM_OCPolarity 配置 |
| 适用场景 | 常规PWM控制 | 需要反向逻辑的PWM控制 |