\quad\;\;\, MSP(MCU support package),它的作用是进行 MCU
级别的硬件初始化设置,并且它们通常会被上一层的初始化函数所调用,这样做的目的是为了把 MCU 相关的硬件初始化剥夺出来,方便用户代码在不同型号的 MCU
上移植。
\quad\;\;\, stm32f4xx_hal_msp.c 文件定义了两个函数 HAL_MspInit() 和
HAL_MspDeInit()。这两个函数分别被文件 stm32f4xx_hal.c 中的 HAL_Init 和 HAL_DeInit 所调用。
函数HAL_Init
HAL_StatusTypeDef HAL_Init(void) { /* Configure Flash prefetch, Instruction
cache, Data cache */ #if (INSTRUCTION_CACHE_ENABLE != 0U)
__HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); #endif /* INSTRUCTION_CACHE_ENABLE */ #
if (DATA_CACHE_ENABLE != 0U) __HAL_FLASH_DATA_CACHE_ENABLE(); #endif /*
DATA_CACHE_ENABLE */ #if (PREFETCH_ENABLE != 0U)
__HAL_FLASH_PREFETCH_BUFFER_ENABLE(); #endif /* PREFETCH_ENABLE */ /* 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) */ HAL_InitTick(TICK_INT_PRIORITY); /* Init the low level
hardware */ HAL_MspInit(); /* Return function status */ return HAL_OK; }
此函数用于初始化HAL库,此函数主要实现如下功能:
* 设置NVIC优先级分组是4。
* 设置滴答定时器的每1ms中断一次。
* 函数 HAL_Init 里面调用的 HAL_MspInit 一般在文件stm32f4xx_hal_msp.c
里面做具体实现,主要用于底层初始化。此函数也在文件 stm32f4xx_hal.c 里面,只是做了__week(弱定义),方便重新写。
注:必须在main函数里面优先调用此函数,且保证每1ms一次滴答中断。
此函数的使用比较简单,上电后优先调用即可。
函数HAL_DeInit
HAL_StatusTypeDef HAL_DeInit(void) { /* Reset of all peripherals */
__HAL_RCC_APB1_FORCE_RESET(); __HAL_RCC_APB1_RELEASE_RESET();
__HAL_RCC_APB2_FORCE_RESET(); __HAL_RCC_APB2_RELEASE_RESET();
__HAL_RCC_AHB1_FORCE_RESET(); __HAL_RCC_AHB1_RELEASE_RESET();
__HAL_RCC_AHB2_FORCE_RESET(); __HAL_RCC_AHB2_RELEASE_RESET();
__HAL_RCC_AHB3_FORCE_RESET(); __HAL_RCC_AHB3_RELEASE_RESET(); /* De-Init the
low level hardware */ HAL_MspDeInit(); /* Return function status */ return
HAL_OK; }
此函数用于复位HAL库和滴答时钟。
* 复位了 AHB1,2,3,4 的时钟以及 APB1L,APB1H,APB2,3,4 的时钟。
* 函数 HAL_DeInit 里面调用的 HAL_MspDeInit 一般在文件stm32f4xx_hal_msp.c
里面做具体实现,主要用于底层初始化,跟函数HAL_Init 里面调用的 HAL_MspInit
是一对。当前此函数也在文件stm32f4xx_hal.c里面,只是做了弱定义。
此函数的使用比较简单,需要调用的时候直接调用即可。
比如串口的初始化
1、我们要初始化和MCU无关的东西:例如串口协议,其中包括波特率,奇偶校验,停止位等等。这些设置和使用什么样的MCU没有任何关系,可以使用F1的MCU,也可以是F2…F4,甚至是PC上的串口。所以就把串口抽像成为一个“串口”。
2、有了抽像的串口,这个“串口”就要在MCU上进行承载,这里用STM32F4进行承载,PA9做为发送,PA10做为接收。MSP就是要初始化PA9、PA10,配置这两个引脚。
所以HAL驱动方式的初始化流程就是:
HAL_USART_Init() ----->HAL_UART_MspInit() 先初始化协议,再初始化MCU的引脚。