Stm32 Cortex-M4上的Systick定时器:它的预分频器是什么?

Stm32 Cortex-M4上的Systick定时器:它的预分频器是什么?,stm32,cortex-m,stm32f4,Stm32,Cortex M,Stm32f4,对于Cortex-M4 CPU上的Cortex系统计时器,我有点困惑 比如说,我们有以下配置: 16MHz HSI作为时钟源 AHB1预分频器设置为1(即HSI除以1) 这意味着主系统总线(即AHB1或AHB)以每秒1600000次的速度运行。据我所知,系统计时器(称为SysTick)以主系统总线的速度运行,因此每秒的计数应达到1600000。这似乎很明显,但当我查看STM32F407xx参考手册中的时钟树图时,我发现: 看起来系统计时器的运行速度为:(主系统总线速度)/8 这是真的吗?我

对于Cortex-M4 CPU上的Cortex系统计时器,我有点困惑

比如说,我们有以下配置:

  • 16MHz HSI作为时钟源
  • AHB1预分频器设置为1(即HSI除以1)
这意味着主系统总线(即AHB1或AHB)以每秒1600000次的速度运行。据我所知,系统计时器(称为SysTick)以主系统总线的速度运行,因此每秒的计数应达到1600000。这似乎很明显,但当我查看STM32F407xx参考手册中的
时钟树
图时,我发现:

看起来系统计时器的运行速度为:
(主系统总线速度)/8


这是真的吗?我已将系统计时器配置为每16 000 000个滴答声生成一个中断。基于上述配置(即HSI作为时钟源,AHB1预分频器=1),它每秒生成中断,从而打开和关闭LED。我试着测量“眨眼”之间的时间,它似乎正好是1秒。如果有此预分频器(即/8),则LED应每8秒切换一次

下面可以找到配置系统时钟源和系统计时器的代码

  • HSI频率=16[MHz]
  • 系统计数=16 000 000
void系统时钟初始化(void)
{
LL_RCC_HSI_Enable();
while(LL_RCC_HSI_IsReady()!=1){
;
}
LL_FLASH_SetLatency(LL_FLASH_LATENCY_0);
LL_RCC_SETAHBP重标器(LL_RCC_SYSCLK_DIV_1);
LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSI);
while(LL_RCC_GetSysClkSource()!=LL_RCC_SYS_CLKSOURCE_STATUS_HSI){
;
}
LL_RCC_设置APB1预分频器(LL_RCC_APB1分区1);
LL_RCC_设置APB2预分频器(LL_RCC_APB2_分区1);
}
无效系统时钟系统时钟配置初始化(无效)
{
系统芯片配置(系统芯片计数);
}
void SysTick_处理器(void)
{
led_开关(led_引脚_板_绿色);
}

参考手册在“6.2时钟”一节末尾指出:

RCC向Cortex系统定时器(SysTick)的外部时钟提供AHB时钟 (HCLK)除以8。SysTick可以使用该时钟或Cortex时钟 (HCLK),可在SysTick控制和状态寄存器中配置

根据STM32 Cortex-M4编程手册,SysTick控制寄存器(STK_CTRL)的第2位选择时钟源:

第2位时钟源:时钟源选择
0:AHB/8
1:处理器时钟(AHB)


根据同一手册,默认值应为0(使用AHB/8)。显然,在代码的某个地方,这个位被设置为1

“我已将系统计时器配置为每16 000 000个时钟点生成一个中断。”如何?您没有包含任何代码,很可能是由于某种原因配置错误,或者配置与您假设的不同(例如,考虑到/8分隔符)。当然,我没有包含任何代码,因为这对我来说似乎是显而易见的。让我编辑一下:)如果将
LL\u RCC\u SYSCLK\u DIV\u 1
更改为
LL\u RCC\u SYSCLK\u DIV\u 8
,会发生什么?LED闪烁的频率是多少?它回答了你的问题吗?看下面的答案,问题隐藏在那里:)非常感谢你提供的信息。这很有趣,为什么这个位设置为1。我需要核实一下。现在我知道去哪里找了!谢谢!:)知道了!从
core\u cm4.h
调用函数
SysTick\u Config()
CLKSOURCE
位设置为1,这意味着系统计时器以AHB时钟的速度运行。