STM32定时器时钟配置问题说明SystemCoreClock

本文详细介绍了STM32L476通用定时器的配置过程,特别是SystemCoreClock值的更新机制及其对SYSTICK时钟的影响,确保即使在改变主时钟频率时也能保持SYSTICK的1ms周期不变。

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

在研究STM32L476的通用定时器时,遇到了一个关于SystemCoreClock值=4000000U的问题,琢磨了好久,终于弄明白了,这里记录一下。

1、定时器初始化函数中

2、其中的SystemCoreClock是在system_stm32l4xx.c文件中定义的一个变量

3、其实这个值在此处只是一个变量定义时的初始值,系统在时钟初始化时会使用上面的方法3进行更新的。在SystemClock_Config中会调用HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3)函数更新系统时钟。

4、在HAL_RCC_ClockConfig

5、在HAL_RCC_ClockConfig函数中同样会初始化系统Tick时钟

6、初始化SYSTICK为SystemCoreClock/1000,然后在HAL_RCC_ClockConfig还会再次初始化SYSTICK时钟,当然有的也在HAL_InitTick函数中直接进行初始化

7、在其中的HAL_RCC_GetHCLKFreq()函数中获取系统的时钟参数

系统时钟SystemCoreClock在前面已经更新。整个过程及更新了SystemCoreClock,又更新了SYSTICK,保证了即使修改主时钟频率时,SYSTICK的1ms也是不变的。

 

 

 

### STM32定时器参数配置方法 #### 配置STM32定时器的基本流程 为了实现1毫秒周期性的中断触发,需先初始化TIMx定时器并设置其自动重装载寄存器(ARR)以及计数频率。具体操作如下: - **使能时钟源**:确保目标定时器时钟已经开启。 - **设定预分频系数(PSC)**:此值决定了定时器输入时钟被多少次分割后作为实际工作时钟。 - **计算自动重载值(ARR)**:基于所需的延时时长和PSC来决定该数值大小;对于期望达到1ms间隔的情况而言,则有特定公式可依循[^1]。 ```c // 假设系统时钟为72MHz, TIMx_CLK = 72 MHz / (PSC + 1), ARR * (PSC + 1) = TIMx_CLK * Desired_Delay uint16_t PrescalerValue = (uint16_t)((SystemCoreClock / 20000) - 1); // PSC 设置为得到大约半微秒精度 uint16_t PeriodValue = (uint16_t)(PrescalerValue * 0.001f); // 计算ARR使得总延迟接近于1ms ``` #### 初始化结构体填充与定时器启动 利用`TIM_TimeBaseInitTypeDef`结构体完成对各个成员变量赋初值的工作,并调用相应API函数执行真正的硬件资源分配及状态改变过程。 ```c TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_DeInit(TIM4); TIM_InternalClockConfig(TIM4); TIM_TimeBaseStructure.TIM_Period = PeriodValue; /* 自动重装载值 */ TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; /* 预分频系数 */ TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM4, ENABLE); ``` 以上代码片段展示了如何针对指定型号(这里以TIM4为例)进行基础属性定义、关联优先级安排及其最终激活命令发送等一系列动作。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值