STM32之HAL例程分析-systicker应用

本文介绍了基于STM32的HAL库进行系统初始化和LED控制的步骤,通过HAL_Init()函数启动HAL库的基本设置,包括中断分组和系统定时器配置。HAL_InitTick(TICK_INT_PRIORITY)进一步配置了1ms中断周期的SysTick定时器。代码示例展示了如何使用HAL库控制LED灯以1s间隔闪烁,涉及HAL_Delay()函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本例子主要依据ST官方STM3210E-EVAL开发板的HAL例程裁剪修改而适应自己的硬件开发电路,主要是为了快速熟悉HAL相关例程中各个API函数的功能。以下为main函数代码。

  HAL_Init();

  /* Configure the system clock to 72 MHz */
  SystemClock_Config();

  /* Initialize LEDs */
  BSP_LED_Init(LED1);
  BSP_LED_Init(LED2);
  BSP_LED_Init(LED3);
  BSP_LED_Init(LED4);

  /* Turn on LED1 and LED2 */
  BSP_LED_On(LED1);
  BSP_LED_On(LED2);

  /* Infinite loop */
  while (1)
  {
    /* Toggle LED2 and LED4 */
    BSP_LED_Toggle(LED3);
    BSP_LED_Toggle(LED4);

    /* Insert 1000 ms delay */
    HAL_Delay(1000);

    /* Toggle LED1 and LED3 */
    BSP_LED_Toggle(LED1);
    BSP_LED_Toggle(LED2);

    /* Insert 1000 ms delay */
    HAL_Delay(1000);
  }

HAL_Init()函数主要对访问FLASH是否需要缓存、中断分组、系统定时器systick进行初始化等进行相关操作,至于主板硬件外设的初始化,一般自定义函数即可。这里主要介绍HAL_InitTick(TICK_INT_PRIORITY)语句。该函数在初始访问时,使用的内部时钟作为参考源, SystemClock_Config()重新配置后,再使用配置后的时钟作为基准源。

__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
  /* Configure the SysTick to have interrupt in 1ms time basis*/
  if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
  {
    return HAL_ERROR;
  }

  /* Configure the SysTick IRQ priority */
  if (TickPriority < (1UL << __NVIC_PRIO_BITS))
  {
    HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
    uwTickPrio = TickPriority;
  }
  else
  {
    return HAL_ERROR;
  }

  /* Return function status */
  return HAL_OK;
}

HAL_SYSTICK_Config函数中的SysTick_Config主要对系统定时器的初始值LOAD,时钟源CLKSOURCE、当前计数值VAL清零、中断使能TICKINT以及定时器使能位CTRL等进行初始化。程序如下:

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  {
    return (1UL);                                                   /* Reload value impossible */
  }

  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  return (0UL);                                                     /* Function successful */
}

在整个软件运行系统中,全局变量uwTick作为计数器,在1ms的sysytick中断内对其累加计数。uwTickFreq为枚举定义,值为1.

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

HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT;  /* 1KHz */

typedef enum
{
  HAL_TICK_FREQ_10HZ         = 100U,
  HAL_TICK_FREQ_100HZ        = 10U,
  HAL_TICK_FREQ_1KHZ         = 1U,
  HAL_TICK_FREQ_DEFAULT      = HAL_TICK_FREQ_1KHZ
} HAL_TickFreqTypeDef;
/**

 下载运行,LED灯按照1s间隔进行闪烁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值