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

在研究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也是不变的。

 

 

 

  • 18
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要使用定时器1配置10ms中断,可以使用以下步骤: 1. 配置定时器1的时钟源和分频系数,使其工作在所需的时钟频率。 2. 设置定时器1的自动重载寄存器(ARR)的值为所需的计数器值,以生成10ms的时间间隔。 3. 配置定时器1的工作模式和计数模式,使其能够自动重载并循环计数。 4. 使能定时器1的更新中断(UIE)。 5. 在中断服务函数中处理所需的任务。 以下是一个简单的示例代码,演示如何配置定时器1并在10ms中断中执行任务: ```c #include "stm32f4xx.h" void TIM1_UP_TIM10_IRQHandler(void) { // 中断服务函数,处理所需的任务 // ... // 清除中断标志位 TIM_ClearITPendingBit(TIM1, TIM_IT_Update); } int main(void) { // 启用定时器1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 配置定时器1的时钟源和分频系数 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_Prescaler = SystemCoreClock / 10000 - 1; // 定时器时钟为系统时钟的1/10000 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInitStruct.TIM_Period = 999; // 自动重载值,计数器将在10000个时钟周期后重置 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频系数为1 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct); // 使能定时器1的更新中断 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // 启动定时器1 TIM_Cmd(TIM1, ENABLE); // 配置NVIC中断优先级,并启用中断 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM1_UP_TIM10_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); while(1) { // 主程序 // ... } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值