打印
[STM32L5]

【STM32L562 DK试用】sysTick定时器

[复制链接]
332|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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架构通用的。
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
  HAL_StatusTypeDef  status = HAL_OK;

  /* Check uwTickFreq for MisraC 2012 (even if uwTickFreq is a enum type that doesn't take the value zero)*/
  if ((uint32_t)uwTickFreq != 0U)
  {
    /*Configure the SysTick to have interrupt in 1ms time basis*/
    if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / (uint32_t)uwTickFreq)) == 0U)
    {
      /* Configure the SysTick IRQ priority */
      if (TickPriority < (1UL << __NVIC_PRIO_BITS))
      {
        HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
        uwTickPrio = TickPriority;
      }
      else
      {
        status = HAL_ERROR;
      }
    }
    else
    {
      status = HAL_ERROR;
    }
  }
  else
  {
    status = HAL_ERROR;
  }

  /* Return function status */
  return status;
}


初始化LED9与LED10
int32_t BSP_LED_Init(Led_TypeDef Led)
{
  int32_t          status = BSP_ERROR_NONE;
  GPIO_InitTypeDef GPIO_Init;

  /* Enable the GPIO_LED Clock */
  if (Led == LED9)
  {
    LED9_GPIO_CLK_ENABLE();
  }
  else /* Led = LED10 */
  {
    /* Enable VddIO2 for GPIOG */
    __HAL_RCC_PWR_CLK_ENABLE();
    HAL_PWREx_EnableVddIO2();
    LED10_GPIO_CLK_ENABLE();
  }

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

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

  return status;
}


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

    /* USER CODE BEGIN 3 */
    /* Toggle LED9 */
    BSP_LED_Toggle(LED9);

    /* Insert 50 ms delay */
    HAL_Delay(500);

    /* Toggle LED10 */
    BSP_LED_Toggle(LED10);

    /* Insert 100 ms delay */
    HAL_Delay(500);
  }


下载验证:







使用特权

评论回复
沙发
uptown| | 2025-3-18 20:09 | 只看该作者
当SysTick计数到0时,如果使能了中断,则会产生一个SysTick中断请求,同时计数器会根据预设的值自动重载,并继续递减计数,从而实现周期性的定时功能。

使用特权

评论回复
板凳
cemaj| | 2025-3-18 20:23 | 只看该作者
可以在STM32L562上配置和使用SysTick定时器,实现精确的延时和定时功能。

使用特权

评论回复
地板
yorkbarney| | 2025-3-18 20:33 | 只看该作者
一个24位的向下计数定时器。              

使用特权

评论回复
5
jackcat| | 2025-3-18 21:30 | 只看该作者
结合 STM32CubeMX 和 CubeIDE,可快速完成硬件初始化和调试。

使用特权

评论回复
6
wwppd| | 2025-3-18 21:54 | 只看该作者
STM32L56作为STM32系列微控制器的一员,同样内置了SysTick定时器。SysTick是一个简单而有效的系统定时器,为操作系统提供时间基准,或用于生成周期性的中断。

使用特权

评论回复
7
adolphcocker| | 2025-3-18 22:08 | 只看该作者
STM32L56 的 ​SysTick 定时器 是 Cortex-M7 内核集成的 24 位递减计数器

使用特权

评论回复
8
yorkbarney| | 2025-3-19 10:43 | 只看该作者
在STM32L56微控制器中,SysTick定时器是一个24位倒计数定时器,用于产生周期性中断或实现精确延时

使用特权

评论回复
9
sesefadou| | 2025-3-20 09:14 | 只看该作者
SysTick定时器中断优先级如何设置

使用特权

评论回复
10
mmbs| | 2025-3-20 09:33 | 只看该作者
如何关闭SysTick定时器?              

使用特权

评论回复
11
claretttt| | 2025-3-20 09:54 | 只看该作者
常用于生成操作系统的时基或者提供一个简单的、无需复杂配置的延时功能。

使用特权

评论回复
12
zerorobert| | 2025-3-21 14:07 | 只看该作者
用于产生周期性中断,为操作系统提供时基。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

31

帖子

0

粉丝