0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SPL2LL转换器实现标准库代码迁移为LL库的方法与内容

电子工程师 来源:嵌入式专栏 作者:strongerHuang 2021-04-24 09:30 次阅读

早期开发STM32,大部分工程师都是基于标准库进行开发,如果要换成LL库,且需要复用以前代码,该怎么办呢?

下面就来给大家分享一下使用【SPL2LL转换器】实现标准库代码迁移为LL库的方法,以及相关内容。

1关于LL库

LL库,即STM32Cube Low-Layer,也叫Cube LL、Cube底层库等。

开发STM32通常有四种“库”,可以阅读之前分享的文章进一步了解。

早在2014年,ST推出了STM32CubeMX这款工具,同步推出了对应的STM32Cube HAL库。

但是,HAL存在一些问题:代码量大、执行效率低等缺点。

因此,在2017年,ST推出了STM32Cube LL库,目的就是为了解决的HAL库的缺点,让开发STM32的工程师有更多的选择。

之前有工程师总结了的代码性能:

6FrIny.jpeg

针对上图(Flash、 SRAM 占用量和执行代码的效率这三项指标对比测试)简单讲几点:

1.ROM代码和RAM占用量最小的属于直接操作寄存器WED,对于ROM资源较小的芯片具有优势;

2.执行效率最高的也属于WED,但是代码编辑、移植性和可读写都较差。(其实汇编语言比这还有优势,一般没有特殊要求,不建议使用该寄存器编程

3.三项指标中,除了WED之外,SPL和Cube LL相近(不相上下),也相比Cube HAL就有优势。所以,SPL和Cube LL是四种之中最佳选择的两种。

4.SPL和Cube LL各有特点:SPL库成熟,可读性(特别针对初学者)很好,查找问题也方便;Cube LL可以使用STM32CubeMX图形化工具直接生产初始化代码和工程,在这方便也具有明显优势。

2为什么要用LL库?

上面讲述了关于LL库,以及其他几种库的内容,你会发现,几种库开发STM32各有各的优势。

1.对于RAM和Flash这种资源比较少的STM32,除了用标准外设库之外,LL库就是一个很好的选择。

2.使用LL库配置的代码,相对自己参考寄存器手册配置的代码,LL库API接口更规范,更具有移植性。

3.有些芯片,没有标准外设库,只有早期推出的STM32才有标准外设库,包含F0、 F1、 F2、 F3、 F4、 L1:

M7BNZr.jpeg

新出来的(像F7、L4、G0等)这些芯片只能使用目前的HAL、LL库,或者你自己参考手册配置寄存器(不是特殊情况,我不建议自己配寄存器)。

3利用SPL2LL工具转换代码

SPL2LL,即标准外设库转LL库的转换器工具。

SPL2LL主要特点:

免费

显示源代码迁移状态

生成C代码,适用于IAR,Keil和GCC编译器

支持Windows、Linux和MacOS操作系统

网址包含相关文档和SPL2LL工具。

1.ActivePerl下载安装 在使用SPL2LL工具之前,需要安装【ActivePerl】这个工具,不然会提示错误:

Error : cannot find perl, please verify that you have perl (》5.24.1) installed and added to path

Then restart the application

YrIJNf.png

如果觉得下载麻烦,可以在我网盘:

https://pan.baidu.com/s/1_R21S93V9hzlJ8ZL1D4dKA

提取码: cp37

(包含SPL2LL和ActivePerl工具)

2.安装

SPL2LL工具不需要安装,直接点开即可使用,但前提需要安装【ActivePerl】工具。

【ActivePerl】安装比较简单,一路Next下去即可。

3YzqUz.png

aUBVna.png

ARBJ3m.png

QfIFZ3.png

3.使用SPL2LL

SPL2LL使用方法很简单,选在源和目标的型号、路径,然后执行即可。

IVza63.png

选择好之后,点击“Migrate”即可执行转换。

AjMfuy.png

这里需要耐心等待,比较费时间,原理就是遍历你源码中标准库,然后转换成LL库。

4.转化代码前后对比

RZz6Zr.png

你会发现,即使被屏蔽的代码也进行了SPL转LL。
编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 转换器
    +关注

    关注

    27

    文章

    8172

    浏览量

    141609
  • STM32
    +关注

    关注

    2239

    文章

    10665

    浏览量

    348530
  • 代码
    +关注

    关注

    30

    文章

    4553

    浏览量

    66668
收藏 人收藏

    评论

    相关推荐

    STM32F0的SPL能在STM32G0上用吗?

    原来用的STM32F0系列,使用的V3.5.0的标准外设。现在改用STM32G0系列,发现官网提供的固件是STM32CubeG0,里面是HAL和LL
    发表于 04-08 08:29

    使用LL生成STM32H7代码时存在报错是什么原因导致的?

    使用LL生成STM32H7代码时存在的BUG
    发表于 04-03 07:33

    STM32L0 LLIIC发送不出我想要的数据是怎么回事?

    LL_I2C_HandleTransfer() 这个函数,则能发出来波形,但是这个函数会自动调整R/W位,所以不能在第一个字节使用。 使用这个方法未能实现我需要的功能。 方法二:利用手
    发表于 04-03 07:30

    STM32F1的LL,RTC怎么不能设置日期?

    STM32F1的LL,RTC 怎么不能设置日期,只能设置时间。
    发表于 03-29 07:02

    请问HAL和LL分别在什么场合使用?

    请问HAL和LL分别在什么场合使用?LL简单明了,为啥不是主流使用啊?还有为啥L03的例程中有较多的LL
    发表于 03-25 08:08

    STM32L471RE同样的硬件使用LL和HAL编译的工程运行功耗不一样?为什么?

    项目在使用STM32L471RE开发,涉及到低功耗的处理。在测试过程中发现同样的硬件结构(PCB上仅焊接mcu的最小系统),使用LL和HAL生产的两个工程运行功耗不一样,工程配置时钟
    发表于 03-21 06:17

    为什么STM32F103 LL清除某个标志位都是使用WRITE_REG(REG, VAL)呢?

    大佬们,最近看LL比较贴合寄存编程,但是LL清除某个标志位都是通过WRITE_REG(REG, VAL)这个来写整个寄存
    发表于 03-18 06:10

    基于LL实现STM32U5 LPTIM功能

    有人打算使用STM32U5系列片内LPTIM做低功耗模式唤醒。基于STM32 LL库组织代码,折腾几天后似乎连中断都进不了,想找找是否有现存LL库例程可以参考。
    的头像 发表于 01-07 14:12 685次阅读
    基于<b class='flag-5'>LL</b>库<b class='flag-5'>实现</b>STM32U5 LPTIM功能

    ST的LL的函数接口是和HAL兼容的吗?

    ST 的LL的函数接口是和HAL兼容的吗
    发表于 10-11 06:45

    ST的LL和HAL可以混合使用吗?

    ST的LL和HAL可以混合使用吗
    发表于 10-09 07:59

    ST的LL在使用的过程中需要注意些什么地方?

    ST的LL在使用的过程中需要注意些什么地方
    发表于 10-09 06:48

    求助,关于LLLL_USART_ReceiveData9函数问题

    data=LL_USART_ReceiveData9(USART3​); 串口发送两个字节的数据(01 FF),但是打印输出的值却不对​​
    发表于 09-22 07:32

    STM32标准外设库迁移至STM32Cube底层库

    成功迁移到使用STM32Cube LL API所需的所有最重要信息。它包含三个部分。• STM32 SPL与STM32Cube LL架构概述:介绍两种解决方案以及二者之间的比较。• S
    发表于 08-31 10:25 0次下载

    为什么G4系列、G0系列的FDCAN没有LL,只有HAL

    为什么G4系列、G0系列的FDCAN没有LL,只有HAL。同时也没有flash的LL。各位大神可否解答一下
    发表于 08-09 08:21

    为什么STM32F103 LL清除某个标志位都是通过WRITE_REG(REG, VAL)来实现的?

    大佬们,最近看LL比较贴合寄存编程,但是LL清除某个标志位都是通过WRITE_REG(REG, VAL)这个来写整个寄存
    发表于 08-07 07:59