本例子主要依据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)语句。
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
/*Configure the SysTick to have interrupt in 1ms time basis*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/*Configure the SysTick IRQ priority */
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0);
/* 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 */
}
下载运行,LED灯按照1s间隔进行闪烁。