HAL库中的MSP文件,及HAL_Init和HAL_DeInit

本文详细介绍了STM32 HAL库中的初始化函数HAL_Init()和De初始化函数HAL_DeInit()。HAL_MspInit()和HAL_MspDeInit()在其中起着关键作用,分别用于设置MCU硬件环境和复位所有外设。HAL_Init()设置了NVIC优先级分组、启动滴答定时器,并调用HAL_MspInit()进行底层硬件初始化。而HAL_DeInit()则负责复位所有AHB和APB时钟,并通过HAL_MspDeInit()进行底层硬件的De初始化。这两个函数的使用对于MCU的移植和应用至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      \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的引脚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Harvey1104

感谢您的认可,无限飓风不断进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值