说明:
1、在中断里面使用HAL_Delay要特别注意。
2、函数HAL_InitTick会被HAL_Init和HAL_RCC_ClockConfig调用。
3、这个文件比较杂,像基准电压大小配置,EXTI配置,IO补偿配置等都在这个文件里面。
==============================================================================
##### 初始化和复位初始化 #####
==============================================================================
1、初始化NVIC配置,初始化时钟(主要是滴答定时器)以及备份域的初始化。
2、复位HAL的部分配置。
3、配置一个1ms的时间基准。
(1)、默认的时间基准是来源于滴答定时器,也可以来自其他同通用定时器。
(2)、函数HAL_Init里面会调用时间基准初a始化函数HAL_InitTick,而调用函数HAL_RCC_ClockConfig也会调用时间基准初始化函数HAL_InitTick
(3)、如果在中断服务程序里面调用延迟函数HAL_Delay要特别注意,因为这个函数的时间基准是基于滴答定时器或者其他通用定时器实现,实现方式是滴答定时器或者其他通用定时器里面做了个变量计数。如此以来,结果是显而易见的,如果其他中断服务程序调用了此函数,且中断优先级高于滴答定时器,会导致滴答定时器中断服务程序一直得不到执行,从而卡死在里面。所以滴答定时器的中断优先级一定要比他们高。
1、函数HAL_StatusTypeDef HAL_Init(void)
(1)此函数用于初始化HAL库,必须在main函数里面优先调用。此函数主要实现如下功能
a、设置NVIC优先级分组是4。
b、设置滴答定时器的每1ms中断一次。
c、HAL库不像之前的标准库,在系统启动函数SystemInit里面做了RCC初始化,HAL库是没有做的,所以进入到main函数后,系统还在用内部高速时钟HSI,对于H7来说,HSI主频是64MHz。
d、函数HAL_Init里面调用的HAL_MspInit一般在文件stm32h7xx_hal_msp.c里面做具体实现,主要用于底层初始化。当前此函数也在文件stm32h7xx_hal.c里面,只是做了弱定义。
(2)用户务必保证每1ms一次滴答中断。
(3)返回值,HAL_ERROR和HAL_OK。
HAL_StatusTypeDef HAL_Init(void)
{
/* Set Interrupt Group Priority */
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
/* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK)
{
return HAL_ERROR;
}
/* Init the low level hardware */
HAL_MspInit();
/* Return function status */
return HAL_OK;
} |