STM32_TIM_寄存器操作

文章目录

  • [一、通用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 无输出。

相关推荐
0南城逆流02 小时前
【STM32】知识点介绍七:PWM功能
stm32·单片机·嵌入式硬件
智者知已应修善业2 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
dashizhi20152 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑
我是一棵无人问荆的小草3 小时前
单片机通电后延迟启动策略
单片机·嵌入式硬件
坏柠3 小时前
ESP32-S3 蓝牙 BLE 从零到一:广播、服务、特征,用一个智能灯的例子全讲透
嵌入式硬件
日更嵌入式的打工仔3 小时前
UART RX为什么要上拉
单片机
三佛科技-187366133976 小时前
FT32F030F6AP7高性能32位RISC内核MCU解析(兼容STM32F030K6TP7)
stm32·单片机·嵌入式硬件
LCMICRO-133108477467 小时前
长芯微LDC90810完全P2P替代ADC128D818,是一款八通道系统监控器,专为监控复杂系统状态而设计。
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模数转换芯片adc
嵌入式老菜鸟qq1252427737 小时前
关于S2-LP休眠
单片机·嵌入式硬件·mcu·射频工程