STM32F407定时器时钟频率和时钟源

文章详细阐述了STM32F4系列微控制器中不同定时器的时钟源,如高级定时器timer1,timer8和通用定时器timer9至timer11由APB2总线提供时钟,而通用及基本定时器的时钟来源于APB1总线。当APB1和APB2的分频数不同时,定时器的时钟频率会相应变化。文章还提到,了解这些时钟频率对使用定时器进行精确延时编程至关重要,并给出了中断实现延时的计算公式。

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

(1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线
(2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线

(3)当APB1和APB2分频数为1的时候,TIM1、TIM8~TIM11的时钟为APB2的时钟,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟;

(4)而如果APB1和APB2分频数不为1,那么TIM1、TIM8~TIM11的时钟为APB2的时钟的两倍,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍。

对于stm32f407 168M主频,因为系统初始化SystemInit函数里初始化APB1总线时钟为4分频即42M,所以TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即84M;APB2总线时钟为2分频即84M,TIM1、TIM8~TIM11的时钟为APB2时钟的两倍即168M。

对于stm32f427 180M主频,因为系统初始化SystemInit函数里初始化APB1总线时钟为4分频即45M,所以TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即90M;APB2总线时钟为2分频即90M,TIM1、TIM8~TIM11的时钟为APB2时钟的两倍即180M。

知道定时器的时钟源频率我们用定时器做延时就很方便了,只要设定合适的分频系数即可,附一下用中断实现延时的公式:(摘自原子的STM32F4开发指南)
                      Tout = ((arr+1)*(psc+1))/Tclk;
公式中psc就是分频系数,arr就是计数值,达到这个计数就会发生溢出中断,Tclk就是上述分析的时钟源频率。

 

### STM32F407 定时器时钟配置教程及相关参数 #### 1. 定时器时钟 STM32F407定时器可以由多种时钟驱动,主要包括内部时钟 (Internal Clock, ICLK) 外部时钟 (External Clock, ECLK)。对于高级控制定时器(如 TIM1 TIM8),其时钟于 APB2 总线时钟经过预分频后的频率;而对于通用定时器(如 TIM2 至 TIM5),则来自 APB1 总线时钟[^1]。 #### 2. 配置步骤概述 通过 HAL 库 CubeMX 工具完成定时器的初始化与配置是一项常见任务。以下是基于 HAL 库 CubeMX 的主要配置流程: - **选择定时器实例**: 在项目中指定要使用的定时器模块(例如 TIM2 或 TIM3)。 - **启用时钟信号**: 使用 `__HAL_RCC_TIMx_CLK_ENABLE()` 启用对应定时器时钟供应[^2]。 - **设定预分频系数 (Prescaler)**: 这决定了输入到计数器的实际时钟频率。计算公式为: \[ f_{CNT} = \frac{f_{CK\_INT}}{(PSC + 1)} \] 其中 \( PSC \) 是预分频寄存器值[^3]。 - **定义自动重载值 (Auto Reload Value)**: 自动重载寄存器决定计数值达到多少后触发更新事件或中断请求。该值通常用于设置时间间隔。 #### 3. 示例代码展示 以下是一个简单的 HAL 库实现示例,展示了如何配置 TIM2 并启动周期性中断服务程序: ```c // 初始化结构体变量声明 TIM_HandleTypeDef htim2; void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; // 设置定时器模式、方向等属性 htim2.Instance = TIM2; htim2.Init.Prescaler = 8399; // 设定预分频值 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数方式向上 htim2.Init.Period = 9999; // 自动重装载值 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if(HAL_TIM_Base_Init(&htim2)!= HAL_OK){ Error_Handler(); // 错误处理函数调用 } // 配置时钟同步机制 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if(HAL_TIM_ConfigClockSource(&htim2,&sClockSourceConfig)!= HAL_OK){ Error_Handler(); } } // 中断回调函数模板 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance==TIM2){ // 判断是否为 TIM2 中断 Toggle_LED(); // 调用 LED 翻转逻辑或其他业务逻辑 } } ``` 上述代码片段实现了对 TIM2 的基本初始化,并设置了每秒一次的时间基中断。 #### 4. 关键参数解释 | 参数名称 | 描述 | |--------------------|------------------------------------------------------------------------------------------| | Prescaler | 输入时钟被此值加一再除的结果作为实际供给给计数器工作的有效时钟频率 | | Period | 表明计数器从零累加至最大值所需经历的脉冲数量 | | Counter Mode | 上升沿计数还是下降沿计数 | 这些参数共同影响着最终产生的波形形状及时序精度。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值