[STM32L5] 【STM32L562 DK试用】sysTick定时器

[复制链接]
865|11
 楼主| lishuihua 发表于 2025-3-8 11:34 | 显示全部楼层 |阅读模式
ARM Cortex-M架构中有一个位于核内的标准系统节拍时钟(Systick)。系统节拍时钟的寄存器地址由ARM标准规定,在所有芯片中都是相同的。开发者可通过ARM CMISIS库标准函数进行配置。相对于芯片自身提供的计时器,使用系统节拍时钟的优势在于其初始化和中断函数程序可以运行在任何ARM Cortex-M核的芯片上。而芯片计时器的初始化和中断函数只适用于特定芯片,在进行程序移植时需要重新研读芯片数据手册编写程序。

系统节拍时钟配置
系统节拍时钟是一个倒数计时器。系统节拍时钟的SYST_RVR寄存器用来设置倒数计时器的初始值。硬件首先会将SYST_RVR中的初始值装载进SYST_CVR寄存器中。在每个时钟上升或者下降沿,SYST_CVR寄存器值会减1。倒数到0后芯片自动将SYST_RVR寄存器值重新装载到SYST_CVR寄存器中重新开始倒计时。在倒数到0时,系统节拍时钟还、会将SYST_CSR寄存器中的COUNTFLAG位置1。如果在SYST_CSR寄存器中设置了TICKINT位,同时还会触发SysTick中断。SysTick中断位于ARM Cortex-M定义的16个中断位中,在所有芯片上具有相同的中断号。

配置SysTick时钟比较直接,这是ARM架构通用的。
  1. __weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
  2. {
  3.   HAL_StatusTypeDef  status = HAL_OK;

  4.   /* Check uwTickFreq for MisraC 2012 (even if uwTickFreq is a enum type that doesn't take the value zero)*/
  5.   if ((uint32_t)uwTickFreq != 0U)
  6.   {
  7.     /*Configure the SysTick to have interrupt in 1ms time basis*/
  8.     if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / (uint32_t)uwTickFreq)) == 0U)
  9.     {
  10.       /* Configure the SysTick IRQ priority */
  11.       if (TickPriority < (1UL << __NVIC_PRIO_BITS))
  12.       {
  13.         HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
  14.         uwTickPrio = TickPriority;
  15.       }
  16.       else
  17.       {
  18.         status = HAL_ERROR;
  19.       }
  20.     }
  21.     else
  22.     {
  23.       status = HAL_ERROR;
  24.     }
  25.   }
  26.   else
  27.   {
  28.     status = HAL_ERROR;
  29.   }

  30.   /* Return function status */
  31.   return status;
  32. }


初始化LED9与LED10
  1. int32_t BSP_LED_Init(Led_TypeDef Led)
  2. {
  3.   int32_t          status = BSP_ERROR_NONE;
  4.   GPIO_InitTypeDef GPIO_Init;

  5.   /* Enable the GPIO_LED Clock */
  6.   if (Led == LED9)
  7.   {
  8.     LED9_GPIO_CLK_ENABLE();
  9.   }
  10.   else /* Led = LED10 */
  11.   {
  12.     /* Enable VddIO2 for GPIOG */
  13.     __HAL_RCC_PWR_CLK_ENABLE();
  14.     HAL_PWREx_EnableVddIO2();
  15.     LED10_GPIO_CLK_ENABLE();
  16.   }

  17.   /* configure the GPIO_LED pin */
  18.   GPIO_Init.Pin   = LED_PIN[Led];
  19.   GPIO_Init.Mode  = GPIO_MODE_OUTPUT_PP;
  20.   GPIO_Init.Pull  = GPIO_PULLUP;
  21.   GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  22.   HAL_GPIO_Init(LED_PORT[Led], &GPIO_Init);

  23.   HAL_GPIO_WritePin(LED_PORT[Led], LED_PIN[Led], GPIO_PIN_SET);

  24.   return status;
  25. }


修改循环间隔500ms,小灯交替闪烁。
  1.   while (1)
  2.   {
  3.     /* USER CODE END WHILE */

  4.     /* USER CODE BEGIN 3 */
  5.     /* Toggle LED9 */
  6.     BSP_LED_Toggle(LED9);

  7.     /* Insert 50 ms delay */
  8.     HAL_Delay(500);

  9.     /* Toggle LED10 */
  10.     BSP_LED_Toggle(LED10);

  11.     /* Insert 100 ms delay */
  12.     HAL_Delay(500);
  13.   }


下载验证:
1161967cb0c05727dd.png


5439767cb0c1259710.png



uptown 发表于 2025-3-18 20:09 | 显示全部楼层
当SysTick计数到0时,如果使能了中断,则会产生一个SysTick中断请求,同时计数器会根据预设的值自动重载,并继续递减计数,从而实现周期性的定时功能。
cemaj 发表于 2025-3-18 20:23 | 显示全部楼层
可以在STM32L562上配置和使用SysTick定时器,实现精确的延时和定时功能。
yorkbarney 发表于 2025-3-18 20:33 | 显示全部楼层
一个24位的向下计数定时器。              
jackcat 发表于 2025-3-18 21:30 | 显示全部楼层
结合 STM32CubeMX 和 CubeIDE,可快速完成硬件初始化和调试。
wwppd 发表于 2025-3-18 21:54 | 显示全部楼层
STM32L56作为STM32系列微控制器的一员,同样内置了SysTick定时器。SysTick是一个简单而有效的系统定时器,为操作系统提供时间基准,或用于生成周期性的中断。
adolphcocker 发表于 2025-3-18 22:08 | 显示全部楼层
STM32L56 的 ​SysTick 定时器 是 Cortex-M7 内核集成的 24 位递减计数器
yorkbarney 发表于 2025-3-19 10:43 | 显示全部楼层
在STM32L56微控制器中,SysTick定时器是一个24位倒计数定时器,用于产生周期性中断或实现精确延时
sesefadou 发表于 2025-3-20 09:14 | 显示全部楼层
SysTick定时器中断优先级如何设置
mmbs 发表于 2025-3-20 09:33 | 显示全部楼层
如何关闭SysTick定时器?              
claretttt 发表于 2025-3-20 09:54 | 显示全部楼层
常用于生成操作系统的时基或者提供一个简单的、无需复杂配置的延时功能。
zerorobert 发表于 2025-3-21 14:07 | 显示全部楼层
用于产生周期性中断,为操作系统提供时基。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

31

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部