一、最重要的:使能主输出(常见“踩坑点”)
高级定时器需要额外使能主输出,这是最容易被忽略的一步。
在使用TIM1输出PWM时,完成所有常规配置后,必须调用以下函数使能主输出:
c
TIM_PWM_Output_Enable(TIM1); // 高级定时器专用
通用定时器(如TIM3)不需要这一步,但TIM1作为高级定时器必须有这个操作。
二、GPIO复用功能配置
2.1 正确配置GPIO模式
使用TIM1的PWM输出通道时,GPIO需要配置为复用推挽输出模式:
c
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP; // 复用推挽输出
不是普通的推挽输出(GPIO_MODE_OUT_PP),这一点需要注意。
2.2 正确选择AF复用编号
不同引脚对应的TIM1通道,AF编号可能不同。必须查阅对应芯片的用户手册中“引脚复用”章节确认具体值。
例如N32G003中:
PA8使用 TIM1_CH1 → GPIO_AF2_TIM1
PA7使用 TIM1_CH2 → GPIO_AF4_TIM1
同一个TIM1的不同通道可能使用不同的AF编号,不要凭经验假设。
c
// 示例:PA7配置为TIM1_CH2
GPIO_InitStructure.Pin = GPIO_PIN_7;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_TIM1; // 确认具体型号的手册
三、时钟配置
3.1 TIM1时钟源配置
TIM1挂在APB2总线上,需要单独配置时钟源:
c
RCC_TIM1_Clock_Config(RCC_TIM1_CLKSRC_PCLK); // 选择PCLK作为时钟源
RCC_APB_Peripheral_Clock_Enable(RCC_APB_PERIPH_TIM1);
3.2 使能AFIO时钟
使用引脚复用功能时,需要使能AFIO时钟:
c
RCC_APB_Peripheral_Clock_Enable(RCC_APB_PERIPH_AFIO);
四、互补PWM与死区配置(电机控制场景)
TIM1支持带死区时间的互补PWM输出,适用于H桥驱动和电机控制。
4.1 死区时间计算
死区时间通过 TIM_BDTRInitStruct.DeadTime 寄存器配置,计算公式与时基时钟(T_DTS)相关:
配置情况 死区时间范围
DTGN[7:5]=0xx 0 ~ 1176 ns
DTGN[7:5]=10x 1185 ~ 2352 ns
DTGN[7:5]=110 2370 ~ 4667 ns
DTGN[7:5]=111 4741 ~ 9334 ns
4.2 BDTR寄存器完整配置示例
c
TIM_BDTRInitType TIM_BDTRInitStruct;
TIM_BDTRInitStruct.OssrState = TIM_OSSR_STATE_ENABLE;
TIM_BDTRInitStruct.OssiState = TIM_OSSI_STATE_ENABLE;
TIM_BDTRInitStruct.LockLevel = TIM_LOCK_LEVEL_OFF;
TIM_BDTRInitStruct.DeadTime = 0xFF; // 死区时间配置
TIM_BDTRInitStruct.Break = TIM_BREAK_IN_DISABLE;
TIM_BDTRInitStruct.BreakPolarity = TIM_BREAK_POLARITY_HIGH;
TIM_BDTRInitStruct.AutomaticOutput = TIM_AUTO_OUTPUT_ENABLE;
TIM_ConfigBkdt(TIM1, &TIM_BDTRInitStruct);
4.3 互补通道配置
使用互补输出时,需要同时配置OutputState和OutputNState:
c
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE; // 主通道使能
TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE; // 互补通道使能
TIM_OCInitStructure.OcPolarity = TIM_OC_POLARITY_HIGH; // 主通道极性
TIM_OCInitStructure.OcNPolarity = TIM_OCN_POLARITY_HIGH; // 互补通道极性
五、定时器同步功能
TIM1可以作为主定时器,触发其他从定时器(如TIM3)工作。配置时需要注意:同步功能不支持动态修改连接关系,应在使能主定时器触发输出之前,先配置并使能从定时器。
c
// TIM1作为TIM3的预分频器配置步骤:
// 1. 设置TIM1_CTRL2.MMSEL='010',选择更新事件作为触发输出
// 2. 配置TIM3_SMCTRL.TSEL,连接TIM1的TRGO到TIM3
// 3. 配置TIM3的从模式
// 4. 启动TIM3
// 5. 启动TIM1
六、检查清单
如果TIM1输出PWM没有波形,按以下顺序检查:
序号 检查项
1 TIM1时钟是否使能(RCC_APB_PERIPH_TIM1)
2 AFIO时钟是否使能(RCC_APB_PERIPH_AFIO)
3 GPIO模式是否为复用推挽输出(GPIO_MODE_AF_PP)
4 GPIO_Alternate是否选择了正确的AF编号
5 是否调用了TIM_PWM_Output_Enable(TIM1) ← 最容易遗漏
6 引脚物理连接是否正确
七、不同型号间的差异提醒
不同N32系列芯片的TIM1特性可能存在差异,例如:
N32G003:TIM1通道与引脚的AF映射需查手册确认
N32G031:TIM1支持6个通道,通道1/2/3支持互补输出
N32L43x:TIM1和TIM8均支持互补PWM和死区功能
实际开发时,建议以对应型号的用户手册和数据手册为准。 |
评论
|