STM32CubeMX自动生成SYSTICK配置

1.SYSTICK原理及其寄存器

   1.1  SYSTICK原理

SysTick 是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,且同时触发中断。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基,产生一个周期性的中断。

 

   1.2SYSTICK寄存器

  CTRL: Systick控制和状态寄存器 
  LOAD: Systick重装载寄存器 
  VAL: Systick当前值寄存器 
  CALIB: Systick校准值寄存器  

è¿éåå¾çæè¿°

  CLKCOURCE-时钟源  0:外部时钟源HCLK(AHB总线时钟)/8 72M/8 = 9M  1:内核时钟(HCLK) 72M 

è¿éåå¾çæè¿°

è¿éåå¾çæè¿°

     CURRENT: 每经过一个Systick时钟周期,寄存器值-1 。

è¿éåå¾çæè¿°

 

2.STM32CubeMX配置与代码生成

如下图STM32CubeMX配置所示,图中To Cortex System timer(MHz)就是Systick的时钟频率。

 自动代码生成如下:

    /**Configure the Systick interrupt time */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/8000);   //  = /8/1000 :1000 is 1ms ;1000000 is 1us

    /**Configure the Systick */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

 

3.相关重要的函数

  3.1中断处理函数

void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  HAL_SYSTICK_IRQHandler();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

__IO uint32_t uwTick;

__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}

每次SysTick异常中断后,会执行SysTick_Handler() 函数,然后HAL_IncTick()函数。由于uwTick是                                               无符号32位整型数,所以根据C语言的定义,当累计到0xFFFFFFFF后,再加1等于0。

  3.2 延时函数

__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while ((HAL_GetTick() - tickstart) < wait)
  {
  }
}

__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

由于tickstart和HAL_GetTick()的返回值都是无符号32位整型,所以HAL_GetTick() - tickstart                                                  =HAL_GetTick() + (~ tickstart) ,如果tickstart > HAL_GetTick(),也可以计算出两者之间正确的差值。

 

4.注意事项

1.Systick的中断函数一定要在STM32CubeMX中设置自动生成出来;

2.由于Systick中断每次累加值uwTickFreq是在stm32f1xx_hal.c定义,且默认是1U(以1kHz为默认频率)。而Systick配置函数是在stm32f1xx_hal_cortex.c和core_cm3.h定义,各自完全独立。因此,如果Systck配置频率不是1kHz时,需要利用stm32f1xx_hal.c的HAL_SetTickFreq()函数重新配置累计值uwTickFreq;

3.当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

 

<think>嗯,用户问的是关于SysTick配置的介绍。我需要先回忆一下SysTick的基本知识。SysTick是ARM Cortex-M系列处理器中的一个系统定时器,常用于操作系统的心跳或者简单的定时功能。配置SysTick需要涉及几个关键寄存器:CTRL、LOAD、VAL和CALIB。不过CALIB可能不需要用户配置,因为是校准值。 首先,我应该解释SysTick的作用,比如它是如何作为系统定时器,提供周期性中断的。然后需要分步骤说明配置过程,可能包括选择时钟源、设置重装载值、启用中断和启动定时器这几个步骤。要注意时钟源的选择,比如内部时钟(AHB)还是AHB分频后的时钟,不同的时钟频率会影响定时时间。 接下来,需要提到如何计算重装载值,公式应该是(时钟频率 / 定时频率) - 1。这里要注意单位转换,比如如果时钟是72MHz,定时1ms的话,LOAD值应该是72000-1。另外,还要注意VAL寄存器在初始化时需要清零,否则可能导致立即进入中断。 用户可能需要知道如何编写具体的代码,比如在STM32中使用HAL库或者直接操作寄存器。不过用户的问题比较通用,可能不需要具体到某个库,而是通用的步骤。同时,需要提醒注意事项,比如时钟源是否正确,重装载值不能超过24位最大值,中断优先级配置等。 另外,SysTick的中断服务函数名称可能因编译器或启动文件不同而有所差异,常见的是SysTick_Handler。需要确保用户知道如何编写中断处理函数,并在其中执行需要的操作。 还有,用户可能想知道SysTick在FreeRTOS等RTOS中的应用,比如作为系统时基,这时候配置可能由RTOS自动完成,但用户可能需要了解如何手动配置。不过这可能超出当前问题的范围,可以简单提及。 最后,检查是否有遗漏的步骤,比如启动定时器前是否清除了VAL,中断是否启用,时钟源是否正确选择。确保配置顺序正确,避免常见的错误,比如重装载值过大导致的溢出问题。还要提醒用户关于中断优先级的设置,确保SysTick中断不会被其他中断阻塞。 总结一下,回答的结构应该是先介绍SysTick,然后分步骤说明配置过程,包括寄存器设置和计算公式,接着给出示例代码,最后提到注意事项和常见应用场景。确保使用中文,术语准确,步骤清晰,帮助用户逐步理解和配置SysTick。</think>SysTick(系统定时器)是ARM Cortex-M内核集成的24位倒计时定时器,常用于操作系统时基、任务调度或精确延时。以下是SysTick配置的关键步骤及原理: --- ### 一、SysTick寄存器 1. **CTRL**(控制寄存器) - Bit 0:定时器使能(ENABLE) - Bit 1:中断使能(TICKINT) - Bit 2:时钟源选择(CLKSOURCE) - `0`=外部时钟(AHB/8),`1`=内核时钟(AHB) - Bit 16:计数标志(COUNTFLAG) 2. **LOAD**(重装载值寄存器) - 设置倒计时初始值(最大值:$2^{24}-1$) 3. **VAL**(当前值寄存器) - 读取当前计数值,写入任意值会清零 --- ### 二、配置步骤 #### 1. 选择时钟源 - **公式**: $$ \text{时钟频率} = \begin{cases} \text{AHB时钟} & (\text{CLKSOURCE}=1) \\ \text{AHB时钟}/8 & (\text{CLKSOURCE}=0) \end{cases} $$ #### 2. 计算重装载值 - **目标周期**: $$ T = \frac{1}{\text{时钟频率}} \times (\text{LOAD} + 1) $$ - **求解LOAD**: $$ \text{LOAD} = \left( \frac{\text{时钟频率}}{\text{目标频率}} \right) - 1 $$ #### 3. 初始化流程 ```c // 示例代码(寄存器级操作): SysTick->CTRL = 0; // 关闭SysTick SysTick->LOAD = 0x00FFFFFF; // 设置最大重装载值(可选) SysTick->VAL = 0; // 清空当前值 SysTick->LOAD = load_value; // 设置实际重装载值 SysTick->CTRL |= (1 << 2) | (1 << 1) | (1 << 0); // 启用内核时钟、中断、启动定时器 ``` --- ### 三、中断服务函数(以Cortex-M为例) ```c void SysTick_Handler(void) { // 用户自定义操作(如任务切换、计时累加等) } ``` --- ### 四、注意事项 1. **24位限制**:LOAD值不能超过$2^{24}-1$(16,777,215) 2. **中断优先级**:通过NVIC配置(默认优先级最低) 3. **校准值**:部分芯片提供`SysTick->CALIB`寄存器用于校准 4. **HAL库简化**:STM32可使用`HAL_SYSTICK_Config()`函数快速配置 --- ### 五、典型应用 1. **FreeRTOS时基**:通过SysTick触发任务调度 2. **精准延时**:利用`SysTick->VAL`实现微秒级延时 3. **时间戳**:通过累计中断次数统计系统运行时间 通过合理配置SysTick,可实现高效的系统时间管理和实时控制功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值