深入理解STM32中MspInit函数的相关知识

在书本上以及网上总结了一些关于Msp函数的知识

在学习HAL库的过程中,总是会看到MspInit和MspDeInit,书本上只是说这是回调函数,但是关于这个函数有什么用,为什么要有这个函数,却说的很少,于是我就上网找了一些资料,在结合一下书本上的说法,就有了这一篇笔记。

这篇笔记有可能会随着我的水平的提升而进行迭代。

MSP:MCU Specific Package,即MCU特定程序包,也称MCU具体方案

因为MspDeInit用的很少,所有这里只介绍MspInit

可以通过两个说法来了解带有MspInit的函数的主要作用

①存放外设使用到的GPIO、CLOCK、NVIC、DMA等外设的初始化(驱动)代码。

②针对具体的MCU型号的某个功能进行硬件初始化。

这种函数的名称基本都是HAL_PPP_MspInit()和HAL_PPP_MspDeInit(),PPP代表任意外设,这种函数通常会被他们的上一级函数HAL_PPP_Init()调用。

搞这样一个HAL_PPP_MspInit()函数出来,是为了把针对具体的MCU型号的某个功能进行硬件初始化的代码独立出来,方便移植。

例如,我们想把程序从F1移植到F4,那我们只需要修改HAL_PPP_MspInit()里面的内容,其他的地方不变。

再说一下函数执行的大概流程

①执行HAL_PPP_Init(),如HAL_USART_Init(),进行一些与具体硬件无关的初始化设置,比如波特率、奇偶校验位等(此时初始化的内容与具体的MCU型号无关,在不同的MCU上都是一样的)

②HAL_PPP_Init()会调用HAL_PPP_MspInit(),如HAL_USART_MspInit(),进行一些与具体硬件有关的初始化设置,比如具体的GPIO引脚(此时初始化的内容会因为具体的MCU型号的不同而不同)

在C语言中,关键字 "__weak" 用于修饰函数,表示该函数是一个弱函数(weak function)。弱函数是指,如果用户重新定义了这个函数,那么会执行用户定义函数而忽略弱函数。

MspInit()函数通常有两个,一个是HAL库自带的,由关键字 "__weak" 修饰,是弱函数,另一个是用户重新实现的。例如HAL_Init()调用的HAL_MspInit()。

在文件stm32f4xx_hal.c中有使用"__weak" 定义的HAL_MspInit()

同时,在用户文件stm32f4xx_hal_msp.c内,又重新定义了这个函数

此时,HAL_Init()调用的HAL_MspInit()就是用户重新实现的那个

物联沃分享整理
物联沃-IOTWORD物联网 » 深入理解STM32中MspInit函数的相关知识

发表评论