当前位置: 首页 > news >正文

单片机-STM32部分:6、不同编程方式-寄存器、标准库、HAL库、LL库

飞书文档https://x509p6c8to.feishu.cn/wiki/C7tPwqQShi1CsfkXMaEcpOrtnJc

标准库、HAL库、LL库

寄存器

寄存器编程是最接近底层的编程方式,也是运行效率最高的,但缺点是编程效率低,维护难度高,排查问题效率低,51只有三十来个8位寄存器,而STM32不同版本的寄存器个数是51的数倍,甚至数十倍,还是32位的寄存器,所以官方把这部分寄存器操作封装成一个个函数,我们直接调用函数就可以完成功能的开发。

关于寄存器编程与库函数编程:

实现设置GPIOC PIN13为输出模式,控制LED的亮灭
//基于寄存器编程
#include "stm32f10x.h"                  
int main(void)
{/*打开时钟 APB2 IOPC*/RCC->APB2ENR = 0x00000010;/*配置GPIOC13 设置推挽输出 速率50MHZ*/GPIOC->CRH = 0x00300000;/*设置GPIO输出*/GPIOC->ODR = 0x00002000;       while(1){}
}//基于库编程
#include "stm32f10x.h"
int main(void)
{/*打开时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);                        /*配置GPIO*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode        = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed       = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_13;GPIO_Init(GPIOC, &GPIO_InitStructure);/*设置GPIO输出*/GPIO_SetBits(GPIOC, GPIO_Pin_13);                   while(1){}
}实现设置串口USART1 波特率115200 8位数据位 1位停止位 无奇偶校验
//寄存器编程
void uart_init(u32 pclk2,u32 baudrate)
{           float temp;u16 mantissa;                u16 fraction;           temp=(float)(pclk2*1000000)/(baudrate*16);//得到USARTDIVmantissa=temp;                         //得到整数部分fraction=(temp-mantissa)*16;           //得到小数部分         mantissa<<=4;mantissa+=fraction; RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  RCC->APB2ENR|=1<<14;  //使能串口时钟 GPIOA->CRH&=0XFFFFF00F;//IO状态设置GPIOA->CRH|=0X000008B0;//IO状态设置 RCC->APB2RSTR|=1<<14;   //复位串口1RCC->APB2RSTR&=~(1<<14);//停止复位                      USART1->BRR=mantissa; // 波特率设置         USART1->CR1|=0X200C;  //1位停止,无校验位.
}//库函数编程
void MX_USART1_UART_Init(u32 baudrate)
{//IO初始化GPIO_InitStruct.Pin = GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);//串口初始化UART_HandleTypeDef huart1;huart1.Instance = USART1;huart1.Init.BaudRate = baudrate;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;HAL_UART_Init(&huart1);
}
从编程难度、维护难度、移植难度几个维度对比,库函数编程都是优于寄存器编程的。

标准库

标准库(Standard Peripheral Library)是STMicroelectronics提供的最基本的库。标准库是最早的,现在已经停止维护,它提供了对STM32微控制器的底层寄存器和外设的直接访问。标准库的设计目标是提供高度灵活性和低层次的硬件控制,以满足对性能和资源的严格要求。使用标准库,开发人员可以直接操作寄存器来配置和控制微控制器的功能,但需要手动编写大量的底层代码。

HAL库

HAL库(Hardware Abstraction Layer)是STMicroelectronics为了提供更高级别的抽象和简化开发而引入的库。HAL库将底层硬件操作抽象为高级函数调用。这样,开发人员可以使用更高级别的API函数来进行配置和控制微控制器的功能,而不需要直接操作底层寄存器。HAL库提供了一种更易用和可移植的编程模型,并减少了编写底层代码的工作量。它还支持多种开发板和外设,提供了一致的接口,简化了代码移植和复用。HAL库适用于大多数应用程序,尤其是中等复杂性的项目。

LL库

LL库(Low-Level Library)是STMicroelectronics在HAL库的基础上提供的更低级别的库。LL库提供了对底层寄存器和外设的更直接的访问,并提供了一组低级别的API函数。LL库保留了更多的硬件细节,为开发人员提供了更高级别的灵活性和控制。使用LL库,开发人员可以直接编写更底层的代码,实现对微控制器和外设的精细控制。LL库适用于对性能和资源要求极高,以及对底层硬件控制有特殊需求的应用。

在这三种库函数中ST公司已经不再对标准库进行维护了,按照目前的状况来说HAL为学习的主流。针对HAL库ST公司也推出了一款图形配置工具CubeMX,可通过配置自动生成初始化代码。

HAL库的优点:

1..最大可移植性

2.提供了一整套一致的中间件组件,如RTOS,USB,TCP/IP和图形等

3.通用的用户友好的API函数接口

4.ST新出的芯片已经没有标准库

5.HAL库已经支持STM32全线产品

个人建议,现在最好是使用HAL库为主,LL库在特殊情况下使用,因为这是官方主推的库,并且CubeMX确实是个很好用的工具,而里面只有HAL库和LL库。

http://www.xdnf.cn/news/315991.html

相关文章:

  • 中间件-RocketMQ
  • k8s | Kubernetes 服务暴露:NodePort、Ingress 与 YAML 配置详解
  • 【代码优化篇】强缓存和协商缓存
  • ABP-Book Store Application中文讲解 - 前期准备 - Part 2:创建Acme.BookStore + Angular
  • 【ArcGIS Pro微课1000例】0068:Pro原来可以制作演示文稿(PPT)
  • 理解与清理 Docker 中的悬空镜像(Dangling Images)
  • 8.12 GitHub Sentinel企业级进化:容器化优化×AI监控,效率提升300%实战
  • HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录
  • 实践004-Gitlab CICD部署应用
  • 小刚说C语言刷题—1331 做彩纸花边
  • 五、Hadoop集群部署:从零搭建三节点Hadoop环境(保姆级教程)
  • Spark和Hadoop之间的联系
  • JDK Version Manager (JVMS)
  • 【论文阅读】在调制分类中针对对抗性攻击的混合训练时和运行时防御
  • Web 架构之动静分离:原理、实践与优化
  • WHAT - Rust 智能指针
  • 【PostgreSQL】数据库主从库备份与高可用部署
  • 探索智能体开发新边界:Cangjie Magic开源平台体验与解析
  • maven基本介绍
  • Nginx+Lua+Redis实现灰度发布
  • spring4.x详解介绍
  • 一个电平转换电路导致MCU/FPGA通讯波形失真的原因分析
  • Go语言八股之channel详解
  • LeetCode 热题 100 64. 最小路径和
  • 明远智睿SD2351核心板:工业AIoT时代的创新引擎
  • 大数据、物联网(IoT)、平台架构与设计重构大模型应用
  • 轻松管理房间预约——启辰智慧预约小程序端使用教程
  • 软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(2)
  • Linux中的`export` 设置的环境变量是临时的吗?如何永久生效?
  • 使用 AI 如何高效解析视频内容?生成思维导图或分时段概括总结