HAL库下载

  下载链接:https://www.st.com.cn/zh/embedded-software/stm32cube-mcu-mpu-packages/products.html
  在这里插入图片描述

一、CMSIS标准及库层次关系

  在这里插入图片描述

   CMSIS标准中最主要的为CMSIS核心层,它包括了:
     内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由ARM公司提供。
     设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。

   1、库目录、文件简介

    在这里插入图片描述

     STM32Cube_FW_F1_V1.8.0
     Documentation:
       文件夹下是HAL库帮助文档,主要讲述如何使用驱动库来编写自己的应用程序。
     Drivers:
       文件夹下是官方的CMSISI库,HAL库,板载外设驱动。
     Middlewares:
       中间件,包含ST官方的STemWin、 STM32_Audio、STM32_USB_Device_Library、STM32_USB_Host_Library;
      也有第三方的fatfs文件系统等等。
     Project :
       文件夹下是用驱动库写的针对官方发行demo板的例子和工程模板。
     Utilities:
       实用的公用组件比如LCD_LOG实用液晶打印调试信息。
     Release_Note.html:
       库的版本更新说明。

   2、CMSIS文件夹

    在这里插入图片描述

     1)Include文件夹

       在Include文件夹中包含了的是位于CMSIS标准的核内设备函数层的Cortex-M核通用的头文件。
       它们的作用是为那些采用Cortex-M核设计SOC的芯片商设计的芯片外设提供一个进入内核的接口, 定义了一些内核相关的寄存器(类似我们前面写的stm32F103xx.h文件,但定义的是内核部分的寄存器。

       我们写STM32F1的工程,必须用到其中的四个文件:core_cm3.h、core_cmFunc.h、corecmInstr.h、core_cmSimd.h,其它的文件是属于其它内核的,还有几个文件是DSP函数库使用的头文件。

       core_cM3.c文件有一些与编译器相关条件编译语句,用于屏蔽不同编译器的差异。
       里面包含了一些跟编译器相关的信息,如:“__CC_ARM ”(本书采用的RVMDK、KEIL),“GNUC ”(GNU编译器)、“ICC Compiler” (IAR编译器)。这些不同的编译器对于C嵌入汇编或内联函数关键字的语法不一样,这段代码统一使用“__ASM、__INLINE”宏来定义,而在不同的编译器下,宏自动更改到相应的值,实现了差异屏蔽。

				#if   defined ( __CC_ARM )
				   #define __ASM            __asm     /*!< asm keyword for ARM Compiler */
				   #define __INLINE         __inline  /*!< inline keyword for ARM Compiler*/
				   #define __STATIC_INLINE  static __inline
				
				   #elif defined ( __GNUC__ )
				   #define __ASM            __asm  /*!< asm keyword for GNU Compiler */
				   #define __INLINE         inline /*!< inline keyword for GNU Compiler */
				   #define __STATIC_INLINE  static inline
				
				   #elif defined ( __ICCARM__ )
				   #define __ASM            __asm  /*!< asm keyword for IAR Compiler */
				   /*!< inline keyword for IAR Compiler. */
				   #define __STATIC_INLINE  static inline
				   #define __INLINE         inline
				
				   #elif defined ( __TMS470__ )
				   #define __ASM            __asm  /*!< asm keyword for TI CCS Compiler */
				   #define __STATIC_INLINE  static inline
				
				   #elif defined ( __TASKING__ )
				   #define __ASM            __asm /*!< asm keyword for TASKING Compiler */
				   #define __INLINE         inline /*!< inline keyword for TASKING Compiler */
				
				   #define __STATIC_INLINE  static inline
				
				   #elif defined ( __CSMC__ )
				   #define __packed
				   #define __ASM            _asm /*!< asm keyword for COSMIC Compiler */
				   /*use -pc99 on compile line !< inline keyword for COSMIC Compiler   */
				   #define __INLINE         inline
				   #define __STATIC_INLINE  static inline
				
				   #endif

       重要的是在core_cm3.c文件中包含了“stdint.h” 这个头文件,这是一个ANSI C 文件,是独立于处理器之外的,就像我们熟知的C语言头文件 “stdio.h” 文件一样。位于RVMDK这个软件的安装目录下,主要作用是提供一些类型定义。

				/* exact-width signed integer types */
				   typedef   signed          char int8_t;
				   typedef   signed short     int int16_t;
				   typedef   signed           int int32_t;
				   typedef   signed       __int64 int64_t;
				
				   /* exact-width unsigned integer types */
				   typedef unsigned          char uint8_t;
				   typedef unsigned short     int uint16_t;
				   typedef unsigned           int uint32_t;
				   typedef unsigned       __int64 uint64_t;

       core_cm3.c跟启动文件一样都是底层文件,都是由ARM公司提供的,遵守CMSIS标准,即所有CM3芯片的库都带有这个文件, 这样软件在不同的CM3芯片的移植工作就得以简化。

     2)Device文件夹

       system_stm32f1xx.c文件
         文件目录:\Drivers\CMSIS\ Device\ST\stm32f1xx\Source\Templates
         文件包含了STM32芯片上电后初始化系统时钟、扩展外部存储器用的函数.
        例如我们前两章提到供启动文件调用的“SystemInit”函数,用于上电后初始化时钟,该函数的定义就存储在system_stm32f1xx.c文件。
       启动文件
         文件目录:\Drivers\CMSIS\Device\ST\stm32f1xx\Source\Templates
         文件夹下包含了对应编译平台的汇编启动文件,在实际使用时要根据编译平台来选择。
         我们使用的MDK启动文件在“ARM”文件夹中。其中的“strartup_STM32F103xx.s”即为STM32F103芯片的启动文件。
       stm32F103xx.h文件
         文件目录:\Drivers\CMSIS\Device\ST\stm32f1xx\Include
         stm32F103xx.h 这个文件非常重要,是一个STM32芯片底层相关的文件。
         包含了STM32中所有的外设寄存器地址和结构体类型定义,在使用到STM32 HAL库的地方都要包含这个头文件。

   3、STM32F1xx_ HAL _Driver文件夹

    在这里插入图片描述

     STM32F1xx_HAL_Driver文件夹下有inc(include的缩写)跟src(source的简写)这两个文件夹,这里的文件属于CMSIS之外的的、芯片片上外设部分。
     src里面是每个设备外设的驱动源程序, inc则是相对应的外设头文件。
     每个外设对应一个*.c* 和 .h 后缀的文件。
     外设文件统称为:stm32f1xx_hal_ppp.c 或stm32f1xx_hal_ppp.h文件,PPP表示外设名称。

   4、stm32f1xx_it.c、 stm32f1xx_hal_conf.h文件

     文件目录:STM32Cube_FW_F4_V1.19.0\Projects\STM32F103ZI-Nucleo\Templates
     stm32f1xx_it.c:
       该文件是专门用来编写中断服务函数的。
     stm32f1xx_hal_conf.h:
       该文件被包含进stm32f103xx.h 文件。
     STM32HAL库支持所有STM32F1型号的芯片,但有的型号芯片外设功能比较多,所以使用这个配置文件根据芯片型号增减ST库的外设文件, 另外时钟源配置也是在这里进行设置。

			   /* Includes ---------------------------------*/
			   /**
			   * @brief Include module's header file
			   */
			
			   #ifdef HAL_RCC_MODULE_ENABLED
			   #include "stm32f1xx_hal_rcc.h"
			   #endif /* HAL_RCC_MODULE_ENABLED */
			
			   #ifdef HAL_GPIO_MODULE_ENABLED
			   #include "stm32f1xx_hal_gpio.h"
			   #endif /* HAL_GPIO_MODULE_ENABLED */
			
			   #ifdef HAL_DMA_MODULE_ENABLED
			   #include "stm32f1xx_hal_dma.h"
			   #endif /* HAL_DMA_MODULE_ENABLED */
			
			   #ifdef HAL_CORTEX_MODULE_ENABLED
			   #include "stm32f1xx_hal_cortex.h"
			   #endif /* HAL_CORTEX_MODULE_ENABLED */
			
			   #ifdef HAL_ADC_MODULE_ENABLED
			   #include "stm32f1xx_hal_adc.h"
			   #endif /* HAL_ADC_MODULE_ENABLED */
			
			   #ifdef HAL_CAN_MODULE_ENABLED
			   #include "stm32f1xx_hal_can.h"
			   #endif /* HAL_CAN_MODULE_ENABLED */

二、库各文件间关系

  在这里插入图片描述

   上图描述了STM32库各文件之间的调用关系,这个图省略了DSP核和实时系统层部分的文件关系。
   在实际的使用库开发工程的过程中,我们把位于CMSIS层的文件包含进工程,除了特殊系统时钟需要修改system_stm32f1xx.c,其它文件丝毫不用修改,也不建议修改。
   对于位于用户层的几个文件,在使用库的时候,针对不同的应用对库文件进行增删(用条件编译的方法增删)和改动的文件。

三、帮助文档

   《STM32F10X-中文参考手册》
   《STM32规格书》
   《Cortex™-M3内核编程手册》
   《Cortex-M3权威指南》
   《STM32F103xG_User_Manual.chm》

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐