问题描述
对于Cortex-M4 cpu上的Cortex系统计时器,我有些困惑。
比方说,我们有以下配置:
- 16MHz HSI作为时钟源;
- AHB1预分频器设置为1(即HSI除以1);
这意味着主系统总线(即AHB1或AHB)以每秒16000000滴答的速度运行。就我而言,系统计时器(即SysTick)以主系统总线的速度运行,因此每秒应该计数到16000000。这似乎很明显,但是当我查看STM32F407xx参考手册中的Clock tree
图时,就会看到:
看起来system timer
的运行速度为:(main system bus speed) / 8
。
是真的吗?我已经配置了系统计时器,以每16000000次滴答生成中断。根据以上提供的配置(即HSI作为时钟源且AHB1预分频器= 1),它每秒产生一次中断,从而切换LED的开和关状态。我试图测量两次“闪烁”之间的时间,它似乎恰好是1秒。如果会有这个预分频器(即/ 8),则LED应该每8s切换一次。
- HSI频率= 16 [MHz]
- SYSTICKS_COUNT = 16000万
void system_clock_init(void)
{
LL_RCC_HSI_Enable();
while (LL_RCC_HSI_IsReady() != 1) {
;
}
LL_FLASH_SetLatency(LL_FLASH_LATENCY_0);
LL_RCC_SetAHBPrescaler(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_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
}
void system_clock_systick_config_init(void)
{
SysTick_Config(SYSTICKS_COUNT);
}
void SysTick_Handler(void)
{
led_toggle(LED_PIN_BOARD_GREEN);
}
解决方法
参考手册在“ 6.2 Clocks” 部分的末尾指出:
RCC将AHB时钟馈入Cortex系统计时器(SysTick)的外部时钟 (HCLK)除以8。SysTick可以与此时钟或Cortex时钟一起工作 (HCLK),可在SysTick控制和状态寄存器中进行配置。
根据STM32 Cortex-M4编程手册, SysTick控制寄存器(STK_CTRL)的第2位选择时钟源:
Bit 2 CLKSOURCE:时钟源选择
0:AHB / 8
1:处理器时钟(AHB)
根据同一手册,默认值应为0(使用AHB / 8)。显然,在您代码的某个位置,该位设置为1!?!