文章目录
- [一、通用TIMx (TIM2、TIM3、TIM4和TIM5)寄存器](#一、通用TIMx (TIM2、TIM3、TIM4和TIM5)寄存器)
-
- [ 1、控制寄存器 1(TIMx_CR1)](# 1、控制寄存器 1(TIMx_CR1))
- [ 2、控制寄存器 2(TIMx_CR2)](# 2、控制寄存器 2(TIMx_CR2))
- [ 3、从模式控制寄存器(TIMx_SMCR)](# 3、从模式控制寄存器(TIMx_SMCR))
- [ 4、DMA/中断使能寄存器(TIMx_DIER)](# 4、DMA/中断使能寄存器(TIMx_DIER))
- [ 5、状态寄存器(TIMx_SR)](# 5、状态寄存器(TIMx_SR))
- [ 6、事件产生寄存器(TIMx_EGR)](# 6、事件产生寄存器(TIMx_EGR))
- [ 7、捕获/比较模式寄存器 1(TIMx_CCMR1)](# 7、捕获/比较模式寄存器 1(TIMx_CCMR1))
- [ 8、捕获/比较模式寄存器 2(TIMx_CCMR2)](# 8、捕获/比较模式寄存器 2(TIMx_CCMR2))
- [ 9、捕获/比较使能寄存器(TIMx_CCER)](# 9、捕获/比较使能寄存器(TIMx_CCER))
- [ 10、计数器(TIMx_CNT)](# 10、计数器(TIMx_CNT))
- [ 11、预分频器(TIMx_PSC)](# 11、预分频器(TIMx_PSC))
- [ 12、自动重装载寄存器(TIMx_ARR)](# 12、自动重装载寄存器(TIMx_ARR))
- [ 13、捕获/比较寄存器 1(TIMx_CCR1)](# 13、捕获/比较寄存器 1(TIMx_CCR1))
- [ 14、捕获/比较寄存器 2(TIMx_CCR2)](# 14、捕获/比较寄存器 2(TIMx_CCR2))
- [ 15、捕获/比较寄存器 3(TIMx_CCR3)](# 15、捕获/比较寄存器 3(TIMx_CCR3))
- [ 16、捕获/比较寄存器 4(TIMx_CCR4)](# 16、捕获/比较寄存器 4(TIMx_CCR4))
- [ 17、DMA控制寄存器(TIMx_DCR)](# 17、DMA控制寄存器(TIMx_DCR))
- [ 18、连续模式的DMA地址(TIMx_DMAR)](# 18、连续模式的DMA地址(TIMx_DMAR))
- [ 19、TIMx寄存器图](# 19、TIMx寄存器图)
- 二、基本TIM6和TIM7寄存器
-
- [ 1、TIM6 和TIM7 控制寄存器 1(TIMx_CR1)](# 1、TIM6 和TIM7 控制寄存器 1(TIMx_CR1))
- [ 2、TIM6 和TIM7 控制寄存器 2(TIMx_CR2)](# 2、TIM6 和TIM7 控制寄存器 2(TIMx_CR2))
- [ 3、TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)](# 3、TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER))
- [ 4、TIM6 和TIM7 状态寄存器(TIMx_SR)](# 4、TIM6 和TIM7 状态寄存器(TIMx_SR))
- [ 5、TIM6 和TIM7 事件产生寄存器(TIMx_EGR)](# 5、TIM6 和TIM7 事件产生寄存器(TIMx_EGR))
- [ 6、TIM6 和TIM7 计数器(TIMx_CNT)](# 6、TIM6 和TIM7 计数器(TIMx_CNT))
- [ 7、TIM6 和TIM7 预分频器(TIMx_PSC)](# 7、TIM6 和TIM7 预分频器(TIMx_PSC))
- [ 8、TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)](# 8、TIM6 和TIM7 自动重装载寄存器(TIMx_ARR))
- [ 9、TIM6 和TIM7 寄存器图](# 9、TIM6 和TIM7 寄存器图)
- [三、高级TIM1 和TIM8寄存器](#三、高级TIM1 和TIM8寄存器)
-
- [ 1、TIM1 和TIM8 控制寄存器 1(TIMx_CR1)](# 1、TIM1 和TIM8 控制寄存器 1(TIMx_CR1))
- [ 2、TIM1 和TIM8 控制寄存器 2(TIMx_CR2)](# 2、TIM1 和TIM8 控制寄存器 2(TIMx_CR2))
- [ 3、TIM1 和TIM8 从模式控制寄存器(TIMx_SMCR)](# 3、TIM1 和TIM8 从模式控制寄存器(TIMx_SMCR))
- [ 4、TIM1 和TIM8 DMA/中断使能寄存器(TIMx_DIER)](# 4、TIM1 和TIM8 DMA/中断使能寄存器(TIMx_DIER))
- [ 5、TIM1 和TIM8 状态寄存器(TIMx_SR)](# 5、TIM1 和TIM8 状态寄存器(TIMx_SR))
- [ 6、TIM1 和TIM8 事件产生寄存器(TIMx_EGR)](# 6、TIM1 和TIM8 事件产生寄存器(TIMx_EGR))
- [ 7、TIM1 和TIM8 捕获/比较模式寄存器 1(TIMx_CCMR1)](# 7、TIM1 和TIM8 捕获/比较模式寄存器 1(TIMx_CCMR1))
- [ 8、TIM1 和TIM8 捕获/比较模式寄存器 2(TIMx_CCMR2)](# 8、TIM1 和TIM8 捕获/比较模式寄存器 2(TIMx_CCMR2))
- [ 9、TIM1 和TIM8 捕获/比较使能寄存器(TIMx_CCER)](# 9、TIM1 和TIM8 捕获/比较使能寄存器(TIMx_CCER))
- [ 10、 TIM1 和TIM8 计数器(TIMx_CNT)](# 10、 TIM1 和TIM8 计数器(TIMx_CNT))
- [ 11、TIM1 和TIM8 预分频器(TIMx_PSC)](# 11、TIM1 和TIM8 预分频器(TIMx_PSC))
- [ 12、TIM1 和TIM8 自动重装载寄存器(TIMx_ARR)](# 12、TIM1 和TIM8 自动重装载寄存器(TIMx_ARR))
- [ 13、TIM1 和TIM8 重复计数寄存器(TIMx_RCR)](# 13、TIM1 和TIM8 重复计数寄存器(TIMx_RCR))
- [ 14、TIM1 和TIM8 捕获/比较寄存器 1(TIMx_CCR1)](# 14、TIM1 和TIM8 捕获/比较寄存器 1(TIMx_CCR1))
- [ 15、TIM1 和TIM8 捕获/比较寄存器 2(TIMx_CCR2)](# 15、TIM1 和TIM8 捕获/比较寄存器 2(TIMx_CCR2))
- [ 16、TIM1 和TIM8 捕获/比较寄存器 3(TIMx_CCR3)](# 16、TIM1 和TIM8 捕获/比较寄存器 3(TIMx_CCR3))
- [ 17、TIM1 和TIM8 捕获/比较寄存器(TIMx_CCR4)](# 17、TIM1 和TIM8 捕获/比较寄存器(TIMx_CCR4))
- [ 18、TIM1 和TIM8 刹车和死区寄存器(TIMx_BDTR)](# 18、TIM1 和TIM8 刹车和死区寄存器(TIMx_BDTR))
- [ 19、TIM1 和TIM8 DMA控制寄存器(TIMx_DCR)](# 19、TIM1 和TIM8 DMA控制寄存器(TIMx_DCR))
- [ 20、 TIM1 和TIM8 连续模式的DMA地址(TIMx_DMAR)](# 20、 TIM1 和TIM8 连续模式的DMA地址(TIMx_DMAR))
- [ 21、TIM1 和TIM8 寄存器图](# 21、TIM1 和TIM8 寄存器图)
- 四、实例代码
-
- [ 1、基本定时器(TIM6)定时中断(1s)](# 1、基本定时器(TIM6)定时中断(1s))
- [ 2、通用定时器(TIM3)PWM 输出(PA7,1kHz,占空比可调)](# 2、通用定时器(TIM3)PWM 输出(PA7,1kHz,占空比可调))
- [ 3、通用定时器(TIM4)输入捕获(PB6,测量脉冲频率)](# 3、通用定时器(TIM4)输入捕获(PB6,测量脉冲频率))
- [ 4、高级定时器(TIM1)互补 PWM 输出(PA8/PA9,带死区)](# 4、高级定时器(TIM1)互补 PWM 输出(PA8/PA9,带死区))
- 五、总结
-
- [ 1、定时器寄存器编程核心流程:](# 1、定时器寄存器编程核心流程:)
- [ 2、时钟适配:](# 2、时钟适配:)
- [ 3、中断通道号:](# 3、中断通道号:)
- [ 4、PWM 关键配置:](# 4、PWM 关键配置:)
一、通用TIMx (TIM2、TIM3、TIM4和TIM5)寄存器
1、控制寄存器 1(TIMx_CR1)
偏移地址:0x00
复位值:0x0000


2、控制寄存器 2(TIMx_CR2)
偏移地址:0x04
复位值:0x0000

3、从模式控制寄存器(TIMx_SMCR)
偏移地址:0x08
复位值:0x0000



4、DMA/中断使能寄存器(TIMx_DIER)
偏移地址:0x0C
复位值:0x0000


5、状态寄存器(TIMx_SR)
偏移地址:0x10
复位值:0x0000


6、事件产生寄存器(TIMx_EGR)
偏移地址:0x14
复位值:0x0000


7、捕获/比较模式寄存器 1(TIMx_CCMR1)
偏移地址:0x18
复位值:0x0000
通道可用于输入(捕获模式)或输出(比较模式),通道的方向由相应的CCxS定义。
该寄存器其它位的作用在输入和输出模式下不同。
OCxx描述了通道在输出模式下的功能,ICxx描述了通道在输出模式下的功能。
因此必须注意,同一个位在输出模式和输入模式下的功能是不同的。


8、捕获/比较模式寄存器 2(TIMx_CCMR2)
偏移地址:0x1C
复位值:0x0000



9、捕获/比较使能寄存器(TIMx_CCER)
偏移地址:0x20
复位值:0x0000

10、计数器(TIMx_CNT)
偏移地址:0x24
复位值:0x0000

11、预分频器(TIMx_PSC)
偏移地址:0x28
复位值:0x0000

12、自动重装载寄存器(TIMx_ARR)
偏移地址:0x2C
复位值:0x0000

13、捕获/比较寄存器 1(TIMx_CCR1)
偏移地址:0x34
复位值:0x0000

14、捕获/比较寄存器 2(TIMx_CCR2)
偏移地址:0x38
复位值:0x0000

15、捕获/比较寄存器 3(TIMx_CCR3)
偏移地址:0x3C
复位值:0x0000

16、捕获/比较寄存器 4(TIMx_CCR4)
偏移地址:0x40
复位值:0x0000

17、DMA控制寄存器(TIMx_DCR)
偏移地址:0x48
复位值:0x0000

18、连续模式的DMA地址(TIMx_DMAR)
偏移地址:0x4C
复位值:0x0000

19、TIMx寄存器图
下表中将TIMx的所有寄存器映射到一个16位可寻址(编址)空间。

二、基本TIM6和TIM7寄存器
1、TIM6 和TIM7 控制寄存器 1(TIMx_CR1)
偏移地址:0x00
复位值:0x0000


2、TIM6 和TIM7 控制寄存器 2(TIMx_CR2)
偏移地址:0x04
复位值:0x0000

3、TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)
偏移地址:0x0C
复位值:0x0000


4、TIM6 和TIM7 状态寄存器(TIMx_SR)
偏移地址:0x10
复位值:0x0000

5、TIM6 和TIM7 事件产生寄存器(TIMx_EGR)
偏移地址:0x14
复位值:0x0000

6、TIM6 和TIM7 计数器(TIMx_CNT)
偏移地址:0x24
复位值:0x0000

7、TIM6 和TIM7 预分频器(TIMx_PSC)
偏移地址:0x28
复位值:0x0000

8、TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)
偏移地址:0x2C
复位值:0x0000

9、TIM6 和TIM7 寄存器图
下表中将TIMx的所有寄存器映射到一个16位可寻址(编址)空间

三、高级TIM1 和TIM8寄存器
1、TIM1 和TIM8 控制寄存器 1(TIMx_CR1)
偏移地址:0x00
复位值:0x0000


2、TIM1 和TIM8 控制寄存器 2(TIMx_CR2)
偏移地址:0x04
复位值:0x0000


3、TIM1 和TIM8 从模式控制寄存器(TIMx_SMCR)
偏移地址:0x08
复位值:0x0000


4、TIM1 和TIM8 DMA/中断使能寄存器(TIMx_DIER)
偏移地址:0x0C
复位值:0x0000


5、TIM1 和TIM8 状态寄存器(TIMx_SR)
偏移地址:0x10
复位值:0x0000


6、TIM1 和TIM8 事件产生寄存器(TIMx_EGR)
偏移地址:0x14
复位值:0x0000


7、TIM1 和TIM8 捕获/比较模式寄存器 1(TIMx_CCMR1)
偏移地址:0x18
复位值:0x0000
通道可用于输入(捕获模式)或输出(比较模式),通道的方向由相应的CCxS位定义。
该寄存器其它位的作用在输入和输出模式下不同。
OCxx描述了通道在输出模式下的功能,ICxx描述了通道在输入模式下的功能。
因此必须注意,同一个位在输出模式和输入模式下的功能是不同的。



8、TIM1 和TIM8 捕获/比较模式寄存器 2(TIMx_CCMR2)
偏移地址:0x1C
复位值:0x0000



9、TIM1 和TIM8 捕获/比较使能寄存器(TIMx_CCER)
偏移地址:0x20
复位值:0x0000


10、 TIM1 和TIM8 计数器(TIMx_CNT)
偏移地址:0x24
复位值:0x0000

11、TIM1 和TIM8 预分频器(TIMx_PSC)
偏移地址:0x28
复位值:0x0000

12、TIM1 和TIM8 自动重装载寄存器(TIMx_ARR)
偏移地址:0x2C
复位值:0x0000

13、TIM1 和TIM8 重复计数寄存器(TIMx_RCR)
偏移地址:0x30
复位值:0x0000

14、TIM1 和TIM8 捕获/比较寄存器 1(TIMx_CCR1)
偏移地址:0x34
复位值:0x0000

15、TIM1 和TIM8 捕获/比较寄存器 2(TIMx_CCR2)
偏移地址:0x38
复位值:0x0000

16、TIM1 和TIM8 捕获/比较寄存器 3(TIMx_CCR3)
偏移地址:0x3C
复位值:0x0000

17、TIM1 和TIM8 捕获/比较寄存器(TIMx_CCR4)
偏移地址:0x40
复位值:0x0000

18、TIM1 和TIM8 刹车和死区寄存器(TIMx_BDTR)
偏移地址:0x44
复位值:0x0000


19、TIM1 和TIM8 DMA控制寄存器(TIMx_DCR)
偏移地址:0x48
复位值:0x0000


20、 TIM1 和TIM8 连续模式的DMA地址(TIMx_DMAR)
偏移地址:0x4C
复位值:0x0000

21、TIM1 和TIM8 寄存器图
下表中将TIM1和TIM8的所有寄存器映射到一个16位可寻址(编址)空间。


四、实例代码
1、基本定时器(TIM6)定时中断(1s)
TIM6 无 IO、仅支持定时中断,适合基础延时 / 系统节拍。
c
#include "stm32f10x.h"
// 全局变量:1s中断计数
uint8_t TIM6_Count = 0;
/**
* @brief GPIO初始化:PC13 LED输出
*/
void GPIO_Init_TIM6(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13);
GPIOC->CRH |= GPIO_CRH_MODE13_0;
GPIOC->ODR |= GPIO_ODR_ODR13; // 初始熄灭
}
/**
* @brief TIM6 1s定时中断初始化
* 计算:72MHz / (PSC+1) / (ARR+1) = 1Hz → PSC=7199, ARR=9999
*/
void TIM6_IRQ_Init(void)
{
// 1. 开启TIM6时钟(APB1)
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN;
// 2. 关闭定时器,清空配置
TIM6->CR1 &= ~TIM_CR1_CEN;
TIM6->SR &= ~TIM_SR_UIF; // 清除更新标志
// 3. 配置预分频器和自动重装值
TIM6->PSC = 7199; // 预分频:7200-1 → 72MHz/7200=10kHz
TIM6->ARR = 9999; // 自动重装:10000-1 → 10kHz/10000=1Hz(1s)
TIM6->EGR |= TIM_EGR_UG; // 强制更新参数
// 4. 开启更新中断
TIM6->DIER |= TIM_DIER_UIE;
// 5. 配置NVIC(TIM6对应54号中断通道)
SCB->AIRCR = 0x05FA0800; // 优先级分组2
NVIC->IP[54] &= ~0xFF; // 清空优先级
NVIC->IP[54] |= 0x20; // 抢占优先级2,子优先级0
NVIC->ISER[1] |= (1 << 22); // 54=32+22 → ISER1的bit22置1
// 6. 开启TIM6
TIM6->CR1 |= TIM_CR1_CEN;
}
/**
* @brief TIM6中断服务函数
*/
void TIM6_IRQHandler(void)
{
if(TIM6->SR & TIM_SR_UIF)
{
TIM6_Count++;
if(TIM6_Count >= 1) // 1s到
{
GPIOC->ODR ^= GPIO_ODR_ODR13; // 翻转LED
TIM6_Count = 0;
}
TIM6->SR &= ~TIM_SR_UIF; // 清除标志
}
}
// 主函数
int main(void)
{
GPIO_Init_TIM6();
TIM6_IRQ_Init();
while(1);
}
2、通用定时器(TIM3)PWM 输出(PA7,1kHz,占空比可调)
TIM3_CH2(PA7)输出 1kHz PWM,可动态调整占空比(如控制 LED 亮度)。
c
#include "stm32f10x.h"
/**
* @brief GPIO初始化:PA7(TIM3_CH2)复用推挽输出
*/
void GPIO_Init_PWM(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN;
// PA7:复用推挽输出(10MHz)
GPIOA->CRL &= ~(GPIO_CRL_MODE7 | GPIO_CRL_CNF7);
GPIOA->CRL |= GPIO_CRL_MODE7_0 | GPIO_CRL_CNF7_1;
}
/**
* @brief TIM3 PWM初始化(1kHz,初始占空比50%)
* 计算:72MHz / (71+1) / (999+1) = 1kHz
*/
void TIM3_PWM_Init(void)
{
// 1. 开启TIM3时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
// 2. 关闭定时器,清空配置
TIM3->CR1 &= ~TIM_CR1_CEN;
// 3. 配置CH2为PWM模式1,预装载使能
TIM3->CCMR1 &= ~TIM_CCMR1_OC2M; // 清空CH2模式位
TIM3->CCMR1 |= TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2; // PWM模式1
TIM3->CCMR1 |= TIM_CCMR1_OC2PE; // CH2预装载使能
// 4. 配置输出极性(高电平有效),开启CH2输出
TIM3->CCER &= ~TIM_CCER_CC2P;
TIM3->CCER |= TIM_CCER_CC2E;
// 5. 配置分频、重装值、比较值(50%占空比)
TIM3->PSC = 71; // 72MHz/72=1MHz
TIM3->ARR = 999; // 1MHz/1000=1kHz
TIM3->CCR2 = 500; // 占空比=500/1000=50%
// 6. 开启自动重装预装载,强制更新
TIM3->CR1 |= TIM_CR1_ARPE;
TIM3->EGR |= TIM_EGR_UG;
// 7. 开启TIM3
TIM3->CR1 |= TIM_CR1_CEN;
}
/**
* @brief 动态修改PWM占空比
* @param duty:占空比(0~1000,对应0~100%)
*/
void TIM3_Set_PWM_Duty(uint16_t duty)
{
if(duty > 1000) duty = 1000;
TIM3->CCR2 = duty;
}
// 主函数:占空比渐变
int main(void)
{
uint16_t duty = 0;
uint8_t dir = 1; // 1=递增,0=递减
GPIO_Init_PWM();
TIM3_PWM_Init();
while(1)
{
// 占空比从0→1000→0循环
if(dir) duty++;
else duty--;
if(duty >= 1000) dir = 0;
if(duty <= 0) dir = 1;
TIM3_Set_PWM_Duty(duty);
// 简单延时(可替换为SysTick延时)
for(uint32_t i=0; i<10000; i++);
}
}
3、通用定时器(TIM4)输入捕获(PB6,测量脉冲频率)
TIM4_CH1(PB6)捕获外部脉冲,计算脉冲频率(如测量传感器信号)。
c
#include "stm32f10x.h"
// 全局变量:捕获值、频率
uint32_t TIM4_Capture_Value = 0;
uint32_t TIM4_Freq = 0;
/**
* @brief GPIO初始化:PB6(TIM4_CH1)浮空输入
*/
void GPIO_Init_Capture(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN;
// PB6:浮空输入
GPIOB->CRL &= ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6);
GPIOB->CRL |= GPIO_CRL_CNF6_0;
}
/**
* @brief TIM4输入捕获初始化(上升沿捕获)
*/
void TIM4_Capture_Init(void)
{
// 1. 开启TIM4时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
// 2. 关闭定时器,清空配置
TIM4->CR1 &= ~TIM_CR1_CEN;
// 3. 配置输入捕获模式(CH1,上升沿捕获)
TIM4->CCMR1 &= ~TIM_CCMR1_CC1S;
TIM4->CCMR1 |= TIM_CCMR1_CC1S_0; // CH1映射到TI1
TIM4->CCER &= ~TIM_CCER_CC1P; // 上升沿捕获
TIM4->CCER |= TIM_CCER_CC1E; // 开启CH1捕获
// 4. 配置预分频器(不分频),开启更新中断
TIM4->PSC = 0;
TIM4->DIER |= TIM_DIER_CC1IE | TIM_DIER_UIE; // 捕获中断+更新中断
// 5. NVIC配置(TIM4对应30号中断)
SCB->AIRCR = 0x05FA0800;
NVIC->IP[30] |= 0x10;
NVIC->ISER[0] |= (1 << 30);
// 6. 开启TIM4
TIM4->CR1 |= TIM_CR1_CEN;
}
/**
* @brief TIM4中断服务函数(捕获脉冲计算频率)
*/
void TIM4_IRQHandler(void)
{
static uint32_t last_capture = 0;
// 捕获中断
if(TIM4->SR & TIM_SR_CC1IF)
{
TIM4_Capture_Value = TIM4->CCR1; // 读取捕获值
if(TIM4_Capture_Value > last_capture)
{
// 频率 = 72MHz / (捕获值 - 上一次捕获值)
TIM4_Freq = 72000000 / (TIM4_Capture_Value - last_capture);
}
last_capture = TIM4_Capture_Value;
TIM4->SR &= ~TIM_SR_CC1IF; // 清除捕获标志
}
// 更新中断(溢出处理)
if(TIM4->SR & TIM_SR_UIF)
{
last_capture = 0; // 重置捕获值
TIM4->SR &= ~TIM_SR_UIF;
}
}
// 主函数
int main(void)
{
GPIO_Init_Capture();
TIM4_Capture_Init();
while(1)
{
// TIM4_Freq即为测量到的频率(Hz),可通过串口输出
}
}
4、高级定时器(TIM1)互补 PWM 输出(PA8/PA9,带死区)
TIM1_CH1(PA8)主 PWM + CH1N(PA9)互补 PWM,带死区(电机控制常用)。
c
#include "stm32f10x.h"
/**
* @brief GPIO初始化:PA8(TIM1_CH1)、PA9(TIM1_CH1N)复用推挽输出
*/
void GPIO_Init_TIM1_PWM(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN;
// PA8:复用推挽输出
GPIOA->CRH &= ~(GPIO_CRH_MODE8 | GPIO_CRH_CNF8);
GPIOA->CRH |= GPIO_CRH_MODE8_0 | GPIO_CRH_CNF8_1;
// PA9:复用推挽输出
GPIOA->CRH &= ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9);
GPIOA->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_CNF9_1;
}
/**
* @brief TIM1互补PWM初始化(10kHz,占空比40%,死区100ns)
*/
void TIM1_PWM_Init(void)
{
// 1. 开启TIM1时钟(APB2)
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
// 2. 关闭定时器,清空配置
TIM1->CR1 &= ~TIM_CR1_CEN;
// 3. 配置CH1为PWM模式1,预装载使能
TIM1->CCMR1 &= ~TIM_CCMR1_OC1M;
TIM1->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2;
TIM1->CCMR1 |= TIM_CCMR1_OC1PE;
// 4. 配置死区时间(100ns:72MHz→1个时钟=13.8ns,100/13.8≈7→DTG=7)
TIM1->BDTR |= 7; // 死区时间=7×Tck_int
TIM1->BDTR |= TIM_BDTR_MOE; // 主输出使能(必须开启,否则互补PWM无输出)
// 5. 开启CH1和CH1N输出,高电平有效
TIM1->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP);
TIM1->CCER |= TIM_CCER_CC1E | TIM_CCER_CC1NE;
// 6. 配置分频、重装值、比较值
TIM1->PSC = 7; // 72MHz/8=9MHz
TIM1->ARR = 899; // 9MHz/900=10kHz
TIM1->CCR1 = 360; // 占空比=360/900=40%
// 7. 开启自动重装预装载,强制更新
TIM1->CR1 |= TIM_CR1_ARPE;
TIM1->EGR |= TIM_EGR_UG;
// 8. 开启TIM1
TIM1->CR1 |= TIM_CR1_CEN;
}
// 主函数
int main(void)
{
GPIO_Init_TIM1_PWM();
TIM1_PWM_Init();
while(1);
}
五、总结
1、定时器寄存器编程核心流程:
开时钟→关定时器→配功能(中断 / PWM / 捕获)→配分频 / 重装值→开中断 / NVIC(若需)→开定时器;
定时中断需清除UIF标志,PWM 需配置复用 GPIO + 输出使能,输入捕获需处理溢出;
高级定时器需额外配置BDTR寄存器(死区 + 主输出使能),这是与通用定时器的核心区别。
2、时钟适配:
若系统时钟不是 72MHz,需重新计算PSC和ARR(公式:频率 = 定时器时钟 / (PSC+1) / (ARR+1));
通用定时器时钟 = 2×APB1 时钟(APB1 分频 > 1 时),高级定时器时钟 = APB2 时钟。
3、中断通道号:
TIM2=28、TIM3=29、TIM4=30、TIM6=54、TIM1=25,需根据通道号配置 NVIC->ISER。
4、PWM 关键配置:
必须开启ARPE(自动重装预装载)和OCxPE(通道预装载),否则参数修改不生效;
高级定时器需开启MOE(主输出使能),否则互补 PWM 无输出。