STM32使用高级定时器和通用定时器的配置区别

本文详细对比了STM32中的高级定时器TIM1与通用定时器TIM3的区别,包括它们分别位于APB2和APB1总线上的时钟使能配置,以及中断配置的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正点原子例程里面用的是通用定时器TIM3,我想要将其换成高级定时器TIM1,那么有哪些区别呢
1.时钟使能:
如下可以看到,高级定时器TIM1挂载在APB2总线,通用定时器TIM3挂载在APB1总线。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //TIM3时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //TIM1时钟使能
//APB1下的外设,包含TIM3
#define RCC_APB1Periph_TIM2              ((uint32_t)0x00000001)
#define RCC_APB1Periph_TIM3              ((uint32_t)0x00000002)
#define RCC_APB1Periph_TIM4              ((uint32_t)0x00000004)
#define RCC_APB1Periph_TIM5              ((uint32_t)0x00000008)
#define RCC_APB1Periph_TIM6              ((uint32_t)0x00000010)
#define RCC_APB1Periph_TIM7              ((uint32_t)0x00000020)
#define RCC_APB1Periph_TIM12             ((uint32_t)0x00000040)
#define RCC_APB1Periph_TIM13             ((uint32_t)0x00000080)
#define RCC_APB1Periph_TIM14             ((uint32_t)0x00000100)
#define RCC_APB1Periph_WWDG              ((uint32_t)0x00000800)
#define RCC_APB1Periph_SPI2              ((uint32_t)0x00004000)
#define RCC_APB1Periph_SPI3              ((uint32_t)0x00008000)
#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)
#define RCC_APB1Periph_USART3            ((uint32_t)0x00040000)
#define RCC_APB1Periph_UART4             ((uint32_t)0x00080000)
#define RCC_APB1Periph_UART5             ((uint32_t)0x00100000)
#define RCC_APB1Periph_I2C1              ((uint32_t)0x00200000)
#define RCC_APB1Periph_I2C2              ((uint32_t)0x00400000)
#define RCC_APB1Periph_USB               ((uint32_t)0x00800000)
#define RCC_APB1Periph_CAN1              ((uint32_t)0x02000000)
#define RCC_APB1Periph_CAN2              ((uint32_t)0x04000000)
#define RCC_APB1Periph_BKP               ((uint32_t)0x08000000)
#define RCC_APB1Periph_PWR               ((uint32_t)0x10000000)
#define RCC_APB1Periph_DAC               ((uint32_t)0x20000000)
#define RCC_APB1Periph_CEC               ((uint32_t)0x40000000)
#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x81013600) == 0x00) && ((PERIPH) != 0x00))

//APB1下的外设,包含TIM1
#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)
#define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)
#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00))

2.中断配置
通用定时器中断配置一个: TIM3_IRQ
高级定时器中断配置四个: TIM1_BRK_IRQnTIM1_UP_IRQnTIM1_TRG_COM_IRQnTIM1_CC_IRQn

### STM32 高级定时器通用定时器区别 #### 功能对比 STM32系列微控制器中的高级定时器通用定时器虽然都属于定时器类别,但在功能应用场合上有显著差异。 - **通道数量** 高级定时器通常具有更多的通道用于输入捕获/输出比较操作。例如,TIM1 TIM8 是常见的高级定时器实例,拥有多个互补通道支持复杂的电机控制需求[^2]。 - **死区时间插入** 只有高级定时器具备内置的死区时间插入功能,这对于防止功率开关器件直通非常重要,在逆变电路或H桥驱动场景下尤为有用。 - **刹车输入(紧急停止)** 高级定时器还提供了一个特殊的刹车输入引脚(BRK),当检测到该信号有效时可以立即关闭所有输出以实现快速保护机制;而这一点是普通通用定时器所不具备的能力。 - **同步接口** 这两类定时之间另一个重要差别在于是否存在外部触发单元(ETR)以及主从模式下的相互连接能力——即能否作为其他定时资源的时间基准源来进行多轴协调运作。显然前者在这方面表现得更为出色。 ```c // 示例代码展示如何初始化一个高级定时器 (假设为 TIM1) void Init_Advanced_Timer(void){ __HAL_RCC_TIM1_CLK_ENABLE(); // 启用 TIM1 的时钟 TIM_HandleTypeDef htim1; htim1.Instance = TIM1; htim1.Init.Prescaler = 79; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 999; HAL_TIM_PWM_Init(&htim1); } ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值