小海师 发表于 2025-6-12 10:47

stm32的开发方式

1. 硬件抽象层(HAL)开发
1.1 HAL简介
硬件抽象层(HAL,Hardware Abstraction Layer)是STMicroelectronics为STM32微控制器提供的标准化软件接口,位于硬件和应用代码之间,旨在简化开发流程,屏蔽底层硬件差异。

核心功能:

封装硬件资源(如GPIO、UART、SPI、I2C、ADC等),提供统一的API。
支持STM32全系列芯片(F0、F1、F4、F7、H7等),便于跨型号移植。
结合STM32CubeMX工具,自动生成初始化代码,降低开发门槛。
组成:

HAL驱动:提供外设初始化、配置和操作的API。
CMSIS:基于ARM Cortex-M标准,确保内核兼容性。
BSP(板级支持包):支持特定开发板的额外功能(如LED、按键)。
示例代码(点亮LED):

c复制GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 设置PA5为高电平



1.2 HAL的优点
易于移植:
统一API接口,跨不同STM32型号的代码复用性高。
配合STM32CubeMX,只需调整芯片型号和配置参数(如时钟、引脚),无需大幅修改核心功能代码。
简化开发:
高层次抽象,开发者无需深入了解寄存器细节。
模块化设计,按外设划分(如HAL_UART、HAL_SPI),逻辑清晰。
官方支持:
ST官方主推,文档和示例丰富,持续更新。
支持新款STM32芯片,适合长期开发。
1.3 HAL的局限性
代码体积较大,因高抽象层增加函数调用开销。
对于极高性能需求场景,可能需结合寄存器操作优化。
2. 标准外设库(SPL)开发
2.1 SPL简介
标准外设库(SPL,Standard Peripheral Library)是STM32早期提供的开发库,较贴近硬件,提供直接的外设操作函数,但抽象程度低于HAL。

核心功能:

提供外设操作函数,直接与寄存器交互。
支持部分STM32系列(如F1、F2、F4等),但新芯片支持有限。
示例代码(点亮LED):

c复制GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_SetBits(GPIOA, GPIO_Pin_5); // 设置PA5为高电平


2.2 SPL的优点
性能较高:更贴近硬件,函数调用开销小。
灵活性强:支持直接寄存器操作,适合优化性能。
2.3 SPL的局限性
移植性差:
不同STM32系列的寄存器和函数实现差异大,移植需重写部分代码。
缺乏统一API,跨型号适配复杂。
维护性差:
ST官方已停止更新SPL,新芯片不再支持。
缺乏图形化配置工具,初始化代码需手动编写。
3. HAL与SPL的移植性对比
3.1 为什么HAL更易移植?
统一API:HAL的函数(如HAL_GPIO_Init())在所有STM32系列中保持一致,而SPL的函数名和参数在不同系列(如F1和F4)可能不同。
高抽象级别:HAL通过结构体配置硬件(如GPIO_InitTypeDef),屏蔽寄存器差异;SPL需直接操作寄存器,移植时需检查硬件差异(如时钟树、中断向量)。
CubeMX支持:HAL配合STM32CubeMX可自动生成适配新芯片的初始化代码,SPL需手动修改。
跨系列兼容:HAL基于CMSIS标准,适配不同Cortex-M内核;SPL对内核差异敏感。
3.2 移植示例(UART程序从F1到F4)
HAL:
在CubeMX中更改芯片型号(如从STM32F103到STM32F407)。
调整时钟和引脚配置,重新生成代码。
核心功能代码(如HAL_UART_Transmit())基本无需改动。
SPL:
修改时钟配置(如RCC_APB2PeriphClockCmd)。
检查UART寄存器差异(如USART_CR1、波特率寄存器)。
调整中断向量表和外设初始化代码,工作量较大。
4. 总结与选择建议
选择HAL:
适合快速开发、跨型号移植或新手开发者。
推荐场景:新项目、需要长期维护、涉及多款STM32芯片。
选择SPL:
适合已有SPL项目或对性能要求极高的场景。
注意:不建议用于新项目,因官方不再支持。
混合开发:
性能关键部分可直接操作寄存器,常规功能使用HAL以提高开发效率。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2501_90934603/article/details/148221712

页: [1]
查看完整版本: stm32的开发方式