ST 已经推出了三种库函数,用以方便客户快速开发STM32系列的 MCU。从最早的标准外设驱动库,到后来的 Cube HAL , 再到 Cube LL,还有直接写寄存器。这几种库的代码效率到底如何呢?本文将针对这个问题进行分析和对比,最后提供对比数据供大家参考。
问题分析
我们以 GPIO 翻转、tiM PWM 输出、ADC DMA数据采集和 DMA M2M 这四个常用功能,通过不同的库函数来实现,最终来对比各个库函数的性能。四个工程代码的内容简述如下:
GPIO 翻转:切换 GPIO 的输出电平,其中包含了系统时钟初始化和 GPIO 翻转的代码。
TIM PWM 输出:通过 TIM1 的通道 1 输出频率是 36KHz 的 PWM,循环修改其占空比从 25%到 50%,其中包含了系统时钟初始化、TIM1 的初始化和切换占空比的代码。
ADC DMA 数据采集:通过 ADC 的模拟通道 1,采集 100 次 ADC 的结果,并使用 DMA 传输到到用户缓冲区,其中包含了系统时钟初始化、ADC 初始化和 DMA 的初始化的代码。
DMA M2M:使用 DMA1 的通道 1,从 Flash 中传输 100 字节的数据到片内的 SRAM 中。其中包含了系统时钟的初始化和 DMA的初始化代码。
主要对比三个参数:Flash 占用量、SRAM 占用量和执行代码的效率。
Flash 和 SRAM 的占用量可以通过查看 IAR 生成的*.map 文件了解到。
在*.map 文件中,会有如上图的内容,其中的 readonly code memory 加上 readonly data memory 的和,就是 Flash 的占用量。而 Readwrite data memory 的大小即为 SRAM 的占用量。那么上图所示的 Flash 占用量即为 3204=3174+30,SRAM 占用量即为 1032。因用户堆(Cstack)我们设置的为 1024,所以真正应用代码所占用的 SRAM 量为 8=1032-1024.
代码的运行效率部分,我们是通过 IAR 提供的内核运行周期数(CYCLECONTER)来计算的。在功能函数的开始处和结束处分别设置断点,两次内核运行周期数的差值,就是此处代码的运行周期。
测试硬件选用了 Nucleo-F302 评估板。软件环境和库函数详情如下:
• IAR V7.60
• Optimizations Level High (Size)
• STM32CubeMX V4.17
• Create Project with Copy the necessary library files
• STM32CubeF3 V1.60
• STM32F30x_DSP_StdPeriph_Lib_V1.2.3
• STM32F3xx CMSIS V2.3.0
测试结果如下:
总结:
总体来看,代码效率与移植性成反比的规律是明显的。但与 Cube HAL 相比, Cube LL 的效率优势还是很明显的,几乎和直接写寄存器的效率相差无几。而且目前 STM32cubeMX 已经开始支持直接生成使用 Cube LL 的工程,对于以后追求效率的开发应用人员来说,非常值得推荐给大家使用。
关键字:STM32 库函数 性能对比
引用地址:
关于STM32库函数的代码性能对比
推荐阅读最新更新时间:2024-11-07 20:06
记一次在STM32开发踩过得坑(ADC采集、电流大小的影响)
**写在开头,本人本科对单片机还是比较熟悉的,8/16/32的单片机都玩过(寄存器的配置,库函数的调用),最近接了个很小的项目,以为1~2天就搞完了,结果弄了好几天,因此将该问题记录下来,大家以后碰到可以参考。 ** 项目中:一个功能是通过STM32103ZET6的串口(UART1)与一个数字传感器进行通信获取数据,第二个功能通过12位ADC单通道采集模拟传感器数据,最终将二者数据进行屏显,并通过键盘进行阈值大小设置,声光报警功能。 坑1:ADC采集问题 我当时写的代码在我的一个开发板(芯片:STM32VET6)上是可以正常ADC采集数据的,当时通过串口将数据发至串口助手上打印查看,发现是OK的,(这里提一下,为了防止摸黑
[单片机]
8051单片机和STM32单片机的编程环境对比
单片机编程是一门实战性的技术,程序要在单片机平台上跑起来才能看到效果、才能积累编程经验。在学校学习单片机课程时,可能会感觉到一直有一种脱节的感觉,因为一直没有用武之地。其实学习单片机很简单,第一步就是搞清楚编程环境。 入门单片机时,我们常用51型8051单片机和STM32单片机。这两种单片机比较典型,因为学校里单片机课程是基于51单片机的,而STM32的单片机则具有较多的学习资料。下面就这两种单片机介绍一下编程环境。 1、单片机常用的编程环境 比较流行的单片机环境有keil和IAR,这两种环境可以覆盖市面上90%的单片机型号,而且都提供了函数库。根据单片机位数不同,这两个编程环境也有不同的版本。 1.1 Keil的常用版本
[单片机]
STM32学习笔记—通信容易出错的情况
I²C:全称为Inter-Integrated Circuit(内部集成电路),是一种串行通讯总线,常用于嵌入式电子产品中。 I²C是飞利浦公司在1980年为了让各种低速设备(飞利浦芯片)连接起来而研发的一种通信总线。目前,I²C依然是最常见的通信总线之一,现在绝大部分MCU都内部集成了I²C控制器,STM32也不例外,至少有一个I²C控制器,有的型号甚至多达6个。 STM32 I2C基础内容 I²C总线协议有多个版本,有的STM32遵循的是第2版本,有的是第3版本。所以,不同型号的 STM32 中I²C 可能存在一些差异,但基本功能相似。 1. 主从模式特性 主模式特性: 时钟生成 起始位和停止位生成 从模式特
[单片机]
STM32编译错误Error:A1067E
tartup_stm32f10x_hd.s: Error: A1067E: Output file specified as 'startup\startup_stm32f10x_hd.s', but it has already been specified as '.\obj\startup_stm32f10x_hd.o' 只需在Device中选定你所用的芯片,如果显示Device已经选定过,还出现该错误,就更新一下。
[单片机]
STM32自带的IIC配置
以下是main.c中的内容: //********************************************************** // 使用STM32F103自带的IIC,利用IIC2实现STM32与EEPROM芯片 // AT24C02间的数据传输。传输成功在LCD上显示。 // 试验平台为正点原子的ALIENTEK战舰开发板 //********************************************************** #include sys.h #include delay.h #include usart.h #include lcd.h #i
[单片机]
stm32快速学习6——SysTick 定时1s控制LED
设置使用外部8M晶振 设置引脚功能 设置systick为1s中断 利用systick中断就可以得到1s时间 //////////////////////////////////////////////////////////////////////////前言///////////////////////////////////////////////////////////////////////////////////////// stm32的systick通过少数的程序设置,当使用systick_config()函数之后,其载入值就是你的参数,并且自动打开中断,并将中断设为最低的优先级,将其时钟设为HCLK即系统时钟7
[单片机]
STM32串口通信过程详解
按照数据传送方向分类: 单工:数据传输只支持数据在一个方向上传输; 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口; 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。 分别如下图中的a、b、c所示: 按照通信方式分类: 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口; 异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线; 在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数
[单片机]
CubeMX 5.5 修改HAL库库函数版本
最初我是按照软件推荐,自动按安装的1.15的。 为了和正点原子的例程统一库函数版本,就下载了1.11。 但是在工程配置界面始终没有办法修改 hal库 版本的选择: 关闭CubeMX,使用记事本打开工程文件: 修改版本号: 重新打开工程,库版本修改成功: 工程生成成功:
[单片机]