Skip to content

初识HAL库

CMSIS微控制器软件接口标准

Crotex Microcontroller Software Interface Standard

ARM和与其合作的芯片厂商共同制作的标准

到了用户手上就是一个CMSIS的包

image-20231111113342702

ST为了方便开发提供了三种库

  1. 标准库
  2. HAL库(硬件抽象层)
  3. LL库(底层库)

image-20231111113447528

STM32Cube固件包

ST公司针对上面的协议做出来的属于自己的固件包

获取

stm32Cube - 工具与软件 - Search STMicrocontrollers

image-20231111113930381

image-20231111114208542

主要使用的是驱动源码, 中间文件, 以及开发板示例

image-20231111200242740

image-20231111200615647

image-20231111200707579

image-20231111200851786

Device: 使用的是arm文件夹下面的文件, 前两个文件在include文件夹里面, 第三个文件在source文件夹里面, 而启动文件在source里面的arm下面

Include: 对应的是AC5编译器, AC6编译器, 两个版本共用, 编译器版本, 对应内核的, 以及内存保护的头文件

HAL库框架结构

文件夹结构

image-20231111203240975

inc和src里面的Legacy文件夹里面的文件是补充的文件

image-20231111203427945

ex文件一般是用来区别不同芯片的同一个驱动的不同单独设置的

image-20231111204132237

image-20231111204815060

image-20231111204839618

怎么使用HAL库

基于CMSIS应用程序文件描述

image-20231111210007472

用户文件是参考了官方的例程

官方会把所有的MSP_Init函数放到同一个文件里面

image-20231111211011559

修改config文件

image-20231111211211304

  1. 选择使用到的驱动, 不需要的注释掉
  2. 对不使用的文件不进行移植

image-20231111213939532

定义晶振的频率

stm32f1xx_hal.c文件

c
HAL_StatusTypeDef HAL_Init(void)
{
  /* Configure Flash prefetch */
#if (PREFETCH_ENABLE != 0)
#if defined(STM32F101x6) || defined(STM32F101xB) || defined(STM32F101xE) || defined(STM32F101xG) || \
    defined(STM32F102x6) || defined(STM32F102xB) || \
    defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || \
    defined(STM32F105xC) || defined(STM32F107xC)

  /* Prefetch buffer is not available on value line devices */
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif
#endif /* PREFETCH_ENABLE */

  /* Set Interrupt Group Priority */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); //设置优先级分组2

  /* 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;
}

f1里面有一个预取缓冲区, 有两个64位组成的, 在复位以后会打开, 加快程序的运行

之后设置中断优先级的分组

使能系统的滴答定时器, 设置为1Ms, 作为系统的时钟源

使用注意

出现问题的时候需要去检查寄存器的操作

尽量不要通过修改库的源码实现功能

HAL库有可能出现错误

有的API函数效率过低, 可以通过直接操作寄存器进行操作