本例子主要依据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间隔进行闪烁。