微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Cortex-M4的Systick计时器:它的预分频器是什么?

对于Cortex-M4 cpu上的Cortex系统计时器,我有些困惑。

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

  • 16MHz HSI作为时钟源;
  • AHB1预分频器设置为1(即HSI除以1);

这意味着主系统总线(即AHB1或AHB)以每秒16000000滴答的速度运行。就我而言,系统计时器(即SysTick)以主系统总线的速度运行,因此每秒应该计数到16000000。这似乎很明显,但是当我查看STM32F407xx参考手册中的Clock tree图时,就会看到:

enter image description here

看起来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!?!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。