Skip to content

项目组成

前言

Stm32单片机通常有HAL库标准库两种开发方式,两种开发方式有着不同的工程结构。HAL库又称为硬件抽象层( Hardware Abstraction Layer),Hal库为开发者提供了许多函数和模块,是开发者能够通过调用对应函数对外设进行操作,代码的可移植性好,但是由于层层封装性能开销较大;标准库直接访问寄存器运行效率高但是可移植性较差,同时意法半导体公司不再提供对标准库的支持。

HAL库工程

Hal库版本的工程需要以下部分组成:

  • CMSIS:启动文件,内核头文件,时钟初始化文件。
  • HalDriver:Hal库函数文件。(片上外设驱动函数)
  • Middlewares:中间层函数。(GUI,操作系统)
  • USER:用户文件等。

重要文件解释:

1.startup_stm32fxxxx.s

见启动过程

2.system_stm32f1xx.h

这个文件中编写了两个函数和一个全局变量:

  • SystemInit():设置系统时钟(系统时钟源,PLL乘法器,AHB/APBx预分频器和Flash设置),这个函数在startup_stm32f1xx_xx中被调用来初始化系统的时钟。
  • SystemCoreClock:包含核心时钟(HCLK),它可以被用户应用程序用来设置SysTick计时器或配置其他参数。
  • SystemCoreClockUpdate():更新变量SystemCoreClock,必须在程序执行期间更改核心时钟时调用。

3.stm32f1xx.h

官方的注释中说main.c中只需要包含这个头文件即可,这个头文件中包含了stm32f1xx_hal.hstm32f103xe.h(对应芯片的头文件),以及一些对寄存器位操作的宏定义。

4.stm32f1xx_hal

构建Hal库项目需要预先定义USE_HAL_DRIVER 宏,这是为了让 stm32f1xx.h 包含 stm32f1xx_hal.h 这个头文件。这个文件中包含了所有的Hal库函数的声明(大部分都在stm32fxxx_hal_conf.h文件中只有有关滴答计时器和调试的函数在本文件中声明),引用了stm32fxxx_hal_conf.h文件,定义了一些对定时器操作和调试用的宏。

5.stm32fxxx_hal_conf.h

在 HAL 的头文件目录下有一个默认的配置文件 stm32f1xx_hal_conf_template.h 在编译 HAL代码前,要将这个文件拷贝为 stm32f1xx_hal_conf.h ,在这个文件当中你可以通过修改宏定义来选择哪些 HAL 模块被包含在项目中,比如 GPIO、USART、I2C 等,从而减小最终固件的大小。

6.stm32f103xe.h

这里以f103系列举例了,实际上每个芯片型号都有一个对应的头文件,这个文件中定义了该芯片所有外设的寄存器在MCU寻址空间内的地址映射。

This file contains:

* - Data structures and the address mapping for all peripherals

* - Peripheral's registers declarations and bits definition

* - Macros to access peripheral's registers hardware

7.stm32fxxx_it.c

这个文件中包含了一些异常处理中断服务函数,当运行发成异常时就会触发这些中断进而执行对应的中断服务函数,可以自行更改这些函数。

  • NMI(非屏蔽中断):通过 NMI_Handler 函数处理。
  • 硬故障:当发生硬故障时,HardFault_Handler 会进入无限循环,通常用于调试。
  • 内存管理异常MemManage_Handler 也会进入无限循环。
  • 总线故障BusFault_Handler 处理总线故障并进入无限循环。
  • 使用故障UsageFault_Handler 处理使用故障并进入无限循环。
  • SVCall(Supervisor Call)调试监视器PendSV异常等,当前函数体为空,表示未实现具体的处理逻辑

文件中还编写了系统滴答定时器中断的函数SysTick_Handler,每当发生 SysTick 中断时,它会调用 HAL_IncTick() 函数,这通常用于维护系统时钟或时间戳。

8.cmsis_compiler.hcmsis_xxxx.h

CMSIS做了对不同编译器的兼容,cmsis_compiler.h文件会根据编译器的种类包含对应的编译器头文件

例如:

  • cmsis_armcc.h
  • cmsis_armclang.h
  • cmsis_gcc.h
  • cmsis_irrarm.h

ps.不同编译器使用的汇编语法不同,因此使用不同的编译器需要使用对应的头文件启动文件

只要工程目录下包含以上的必要部分就可以进行程序的编写,但是合理的工程结构有助于项目更好的开发。

工程结构可以参考使用:

  1. Stm32CubMX生成的工程模板
  2. 正点原子的工程
  3. DDL的工程模板:Deadline039/STM32-Template

标准库工程