STM32 LL库为什么比HAL库高效呢?

发布者:SereneSoul55最新更新时间:2024-02-03 来源: elecfans关键字:STM32  LL库  HAL库 手机看文章 扫描二维码
随时随地手机看文章

概 述

有些应用要求MCU能高效处理,特别是跑一些算法时,对CPU执行效率要求较高。


网上有很多文章说STM32Cube HAL执行效率不高,代码量大等问题 ,导致很多还没有入门,或初学的读者就产生各种各样的疑惑。



说实话,HAL相对标准外设库来说确实存在代码效率不高、代码量大灯这些问题,那么与之对应的STM32Cube LL恰好避免了这样的问题。


LL能高效的原因

简单总结一下原因: 巧妙运用C语言静态、内联函数直接操作寄存器


当然,这是其中重要的原因,还有一些其它原因,这里暂不描述。


你会在LL库.h文件中发现大量类似,静态、内联函数直接读写寄存器的函数。


比如读写IO口:


__STATIC_INLINE uint32_t LL_GPIO_ReadOutputPort(GPIO_TypeDef *GPIOx)

{

  return (uint32_t)(READ_REG(GPIOx- >ODR));

}



__STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)

{

  WRITE_REG(GPIOx- >BSRR, (PinMask > > GPIO_PIN_MASK_POS) & 0x0000FFFFU);

}

其中 __STATIC_INLINE ,就是静态、内联:


#define __STATIC_INLINE  static __inline

而读写位的定义:

图片

这里面的 宏定义 ,在众多外设.h中都在调用。 比如使能USART :


LL库使能USART:


__STATIC_INLINE void LL_USART_Enable(USART_TypeDef *USARTx)

{

  SET_BIT(USARTx- >CR1, USART_CR1_UE);

}

标准外设库使能USART:


void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_USART_ALL_PERIPH(USARTx));

  assert_param(IS_FUNCTIONAL_STATE(NewState));



  if (NewState != DISABLE)

  {

    /* Enable the selected USART by setting the UE bit in the CR1 register */

    USARTx- >CR1 |= USART_CR1_UE;

  }

  else

  {

    /* Disable the selected USART by clearing the UE bit in the CR1 register */

    USARTx- >CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE);

  }

}

通过对比,你会明显发现: LL库的执行效率更高 。


什么是内联函数?

写到这里,就可能有读者会问:什么是内联函数?


内联函数是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展。


通常,程序执行时,处理器从内存中读取代码执行。 当程序中调用一个函数时,程序跳到存储器中保存函数的位置 ,开始读取代码执行,执行完后再返回。


为了提高速度,C语言定义了inline函数,告诉编译器把函数代码在编译时 直接拷贝到程序中 ,这样就不用执行时另外读取函数代码。


**提示:**当内联函数很大时,会有相反的作用,因此一般比较小的函数才使用内联函数。


软件框架思维

LL之所以高效,是因为它巧妙运用了一些C语言知识,没有太多封装,直接或间接对寄存器进行操作。


而能这样实现, 归功于ST开发团队设计了这么一个中间层软件框架 。


对于有大型项目开发经验的人来说,一个项目的框架对整个项目影响很大。


就好比你建一栋楼,如果楼层框架都没造好,你觉得这栋楼质量会好吗?


所以,这里就提到,我们编程时,特别项目较大,需要考虑一下软件框架,一个好的框架能让你的项目达到事半功倍的效果。


关键字:STM32  LL库  HAL库 引用地址:STM32 LL库为什么比HAL库高效呢?

上一篇:stm32能跑linux吗
下一篇:意法半导体超低功耗STM32MCU上新,让便携产品轻松拥有惊艳图效

推荐阅读最新更新时间:2024-11-17 10:41

再造STM32---第七部分:初识 STM32 固件
本章参考资料:《STM32F4xx 参考手册》、《STM32F4xx 规格书》、《Cortex-M3 权威指南》 , STM32 标准库帮助文档:《stm32f4xx_dsp_stdperiph_lib_um.chm》。在上一章中,我们构建了几个控制 GPIO 外设的函数,算是实现了函数库的雏形,但GPIO 还有很多功能函数我们没有实现,而且 STM32 芯片不仅仅只有 GPIO 这一个外设。 如果我们想要亲自完成这个函数库,工作量是非常巨大的。 ST 公司提供的标准软件库,包含了 STM32 芯片所有寄存器的控制操作,我们直接学习如何使用 ST 标准库,会极大地方便控制 STM32 芯片。 7.1 CMSIS
[单片机]
再造STM32---第七部分:初识 <font color='red'>STM32</font> 固件<font color='red'>库</font>
STM32 DMA笔记
在做实验之前,首先必须明白什么是DMA,DMA的作用又体现在哪里。 DMA,即直接内存存储,在一些数据的传输中,采用DMA方式,从而将CPU解放出来。让CPU有足够的时间处理其他的事情。 stm32使用DMA的相关操作: 1、DMA的配置 要配置的有DMA传输通道选择,传输的成员和方向、普通模式还是循环模式等等。 void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; //DMA设置: //设置DMA源:内存地址&串口数据寄存器地址 //方向:内存-- 外设 //每次传输位:8bit //传输大小DMA_BufferSize=SENDBUF
[单片机]
<font color='red'>STM32</font> DMA笔记
使用STM32 ST-LINK Utility 设置读保护后不能运行
前言 有些时候,我们总是按自己的想法,觉得不会有问题的时候,出现了一些看起来奇奇怪怪的问题,只不过最后还是可以发现这是有理可据的。 问题 某客户在其产品的设计中,使用了STM32F411VET6。客户工程师在开发过程中,尝试使用STM32 ST-LINK Utility 软件配合 ST-LINK 给32F411EDISCOVERY 板上的STM32 加上Level 1 的读保护。工程师发 现,原本在板子上正常运行的代码,加上读保护后,就不运行了。按了板上的RESET 按键也无济于事。 调研 1.了解问题 客户工程师使用32F411EDISCOVERY 来验证读保护的功能。 客户打开STM32 ST-LINK Utili
[单片机]
掌握这三个思路告诉你如何使用STM32测量频率和占空比
题目 (1)测量脉冲信号频率fo,频率范围为10Hz~2MHz,测量误差的绝对值不大于0.1%。 (2)测量脉冲信号占空比D,测量范围为10%~90%,测量误差的绝对值不大于2%。 使用官方STM32F429 Discovery开发板,主频180MHz,定时器频率90MHz。 思路一、外部中断 这种方法是很容易想到的,而且对几乎所有MCU都适用(连51都可以)。方法也很简单,声明一个计数变量TIM_cnt,每次一个上升沿/下降沿就进入一次中断,对TIM_cnt++,然后定时统计即可。如果需要占空比,那么就另外用一个定时器统计上升沿、下降沿之间的时间即可。 缺陷显而易见,当频率提高,将会频繁进入中断,占用大量时间。而当频
[单片机]
掌握这三个思路告诉你如何使用<font color='red'>STM32</font>测量频率和占空比
STM32之时钟树笔记
1 STM32有五个时钟源:HSI、HSE、LSI、LSE、PLL 1.1 HSI:高速内部时钟、RC振荡器、频率为8MHz、时钟精度较差,可作为备用时钟源(时钟安全系统CSS)。 1.2 HSE:高速外部时钟、可接外部晶体/陶瓷谐振器(4MHz~16MHz)或外部时钟源(HSE旁路,Max 25MHz)。 1.3 LSI:低速内部时钟、RC振荡器、频率为40kHz,大容量MCU可进行LSI时钟校准。 1.4 LSE:低速外部时钟、接频率为32.768kHz的外部晶体/陶瓷谐振器。 1.5 PLL:锁相环倍频输出,时钟输入源可选择HSI/2、HSE或HSE/2。倍频可选择为2~16倍,最大输出72MHz。 用户可通过多
[单片机]
STM32和AD5791的转换
现在很多智能测量仪表要求具有超高精度的电压信号,同时要求高稳定性、高线形度和低噪声、低温度漂移。这样的模拟系统设计面临复杂的工程技术挑战,常规的方法是采用多个较低分辨率的DAC和大量分立元件与支持IC整合在一起,同时伴随着相当大的开发风险和高代价的修改时间,才能优化电路参数、减小误差和设计出复杂的自动校准电路,这样不仅增加了硬件设计的复杂性,通常达到的精度也不是很高。本系统设计的基于STM32微处理器和AD5791的20位超高精度测量系统中,实现了单路超高精度可调电压信号的输出,输出电压信号的幅值可以通过软件来设置。该系统可靠性高,不需要校准电路。 STM32F2, STM32F4, STM32F7, STM32H7,STM32L
[单片机]
<font color='red'>STM32</font>和AD5791的转换
STM32之AHB与APB总线
AHB是高速总线,是一种系统总线,它主要负责连接处理器、DMA等一些内部接口。AHB 系统由主模块、从模块和基础结构3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。 APB是低速总线,它主要负责连接外围设备,它又分为APB1和APB2,它的总线架构不像 AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。APB桥就是连接AHB和APB中间的玩意。 APB1最大时钟频率为36MHz APB2最大时钟频率为72MHz 看下图 在STM32F1中,不同的外设接在不同的APB总线上,以下是详细的分布: #define RCC_APB1Periph_TIM2 ((ui
[单片机]
<font color='red'>STM32</font>之AHB与APB总线
再造STM32---第十七部分:USART—串口通讯
本章参考资料:《STM32F4xx 中文参考手册》 USART 章节。 学习本章时,配合《STM32F4xx 中文参考手册》 USART 章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。 特别说明, 本书内容是以 STM32F42xxx 系列控制器资源讲解。 17.1 串口通讯协议简介: 物理层: 规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。其实就是硬 件部分。 协议层: 协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。其实就是软件部分。 1-RS232标准: RS232标准串口通讯结构图: 1、 RS232标准串口主要用于工业设备直接通信 2、电平转换芯片一般有M
[单片机]
再造STM32---第十七部分:USART—串口通讯
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved