systick_config详解

发布时间:2023-05-20

一、基本介绍

systick_config函数是一种用于配置SysTick定时器的函数。SysTick是Cortex-M系列中的系统定时器,用于提供可选功能,如调试工具和RTOS(实时操作系统)调度器。systick_config函数用于配置SysTick计数器的时钟源、计数器周期以及使能开关。在使用SysTick功能时,必须配置并启用该定时器,否则无法实现相应的功能。下面将结合代码进行详细讲解。

/**
 * @brief  配置SysTick中断周期
 * @param  ticks 读取时钟节拍数(通常为HCLK/1000为1ms)
 * @retval None
 */
void systick_config(uint32_t ticks)
{
    SystemCoreClockUpdate();
    SysTick_Config(SystemCoreClock / ticks);
}

二、详解SysTick_Config函数

SysTick_Config函数是一个重载函数,提供两种不同的用法。

  1. SysTick_Config(uint32_t ticks)用于初始化SysTick计数器。
  2. SysTick_Config(uint32_t ticks, uint8_t clksource)用于初始化SysTick计数器并选择计数器时钟源。 下面我们就逐步查看每个参数的含义。

三、参数解释

1. ticks

ticks参数用来设置SysTick计数器的周期。具体来说,计数器将重复计数ticks次,直到计数器归零并触发SysTick中断。用户可以根据实际需求设置此值。例如,如果每个rtc时钟周期为1毫秒,则可以设置1000作为ticks的值,这样每1秒就会触发一次中断。下面是ticks参数的具体解释:

  • 如果ticks太大,计数器将过于频繁地重载并中断,这将增加CPU负载和功耗。
  • 如果ticks太小,中断可能不稳定,导致定时器不准确。 实际应用中,ticks的值通常取决于系统时钟的频率,通常为HCLK / 1000。如果HCLK是72MHz,则ticks值为72000。

2. clksource

clksource参数用于选择SysTick计数器的时钟源。有两个可选项:

  • SysTick_CLKSource_HCLK_Div8:时钟源为HCLK / 8。
  • SysTick_CLKSource_HCLK:时钟源为HCLK。 如果选择HCLK / 8作为时钟源,将使SysTick计数器时钟的频率为HCLK / 8,这样就会延长计数器的周期,从而减少中断次数。这对于高负载的系统很有用,因为中断次数较少可以减少CPU负载和功耗。

四、使用示例

#include "stm32f10x.h"
void delay_ms(uint32_t ms);
int main(void)
{
    SystemInit(); // 系统初始化
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    // 初始化 PB0
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
    // 配置 SysTick 定时器,定时1ms,时钟源为 AHB
    SysTick_Config(SystemCoreClock / 1000);
    while(1)
    {
        GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET); // PB0 置高
        delay_ms(500); // 延时500ms
        GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET); // PB0 置低
        delay_ms(500); // 延时500ms
    }
}
void delay_ms(uint32_t ms)
{
    uint32_t i;
    for (i = 0; i < ms; i++)
    {
        while (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk); // 等待计数器为0
    }
}

在上面的例子中,我们配置SysTick计数器的计数周期为1ms,并以AHB为时钟周期。然后,我们在主函数中使用GPIO_WriteBit函数将PB0引脚切换为高电平/低电平以实现LED闪烁。最后,我们使用delay_ms函数提供了一个定时500ms的快速延迟函数,以使LED看起来像是在闪烁。

五、总结

systick_config函数是一种用于配置SysTick定时器的函数,用于提供可选功能,如调试工具和RTOS(实时操作系统)调度器。 在使用SysTick功能时,必须配置并启用该定时器,否则无法实现相应的功能。 本文详细介绍了systick_config函数的详细用法和参数解释,并提供了一个简单的示例用于展示如何在STM32芯片上编写基本SysTick应用程序。希望本文对您有所帮助。