切换到宽版
  • 3202阅读
  • 21回复

[ARM]STM32 ARDUINO HALMX  进阶(一) [复制链接]

上一主题 下一主题
离线huaweiwx
 

发帖
1094
M币
7666
专家
39
粉丝
180
序:
自从帖子: 移植 STemWin 至arduino,支持stm全系列芯片,全新配置隆重推出|http://bbs.mydigit.cn/read.php?tid=2160961  发布以来,得到许多坛友的鼓励,为了方便坛友立马上手用上,便写了个帖子:
STM32 ARDUINO HALMX  起步|http://bbs.mydigit.cn/read.php?tid=2168292
本来该贴只是想,写一点如何解决安装和配置的问题,短短的一个多月时间,出乎我的意料,到现在为止竟然已近7千次点击浏览;按计划我将写一些在stm32系列上使用ARDUINO的方法和技术细节,这样能帮助使用者能了解用好arduino这个强大的工具和丰富应用程序和库;


STM32 ARDUINO 是比标准ARDUINO更为复杂的系统,只是因为stm32   ARM的复杂性比 ATmega AVR系列要复杂得多。好在STM为我们准备硬件层的库代码,可以让我们方便的使用,在此我们作个回顾:

/*-------------------------------------------------------------------分割线-------------------------------------------------------------------------*/

以下部分摘自 http://blog.csdn.net/zcshoucsdn/article/details/54613202
到目前为止,ST为开发者提供了 标准外设库(STD库)、HAL库、LL库 三种,还有一个支持芯片较少的STM32Snippets 。前两者都是常用的库,后面的LL库是ST最近才添加,各库如下所示:


其中,STD库和HAL库两者相互独立,互不兼容。几种库的比较如下:

目前几种库对不同芯片的支持情况如下:

上图中,LL库有部分芯片不支持,由于这个图片老了点,至今为止ST官方已经全部支持LL库,在我的ARDUINO中也已经包含了全部最新的库代码。

STM32Snippets
  它是代码示例的集合,直接基于STM32外设寄存器,可在文档和软件包中使用。由于处在最底层,因此需要开发者直接操作外设寄存器,对开发者要求比较高,通常针对于对汇编程序比较了解的资深嵌入式工程师!
注意:
1. 目前只在STM32F0和L0系列中有提供
2. 代码在不同ST芯片间没有可移植性

标准外设库(Standard Peripheral Libraries)
  标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。这应该是目前使用最多的ST库。几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。
  相对于HAL库,标准外设库仍然接近于寄存器操作,主要就是将一些基本的寄存器操作封装成了C函数。开发者需要关注所使用的外设是在哪个总线之上,具体寄存器的配置等底层信息。

注意:不支持从STM32 L0,L4和F7开始的之后的STM32系列芯片

  ST为各系列提供的标准外设库稍微有些区别。例如,STM32F1x的库和STM32F3x的库在文件结构上就有些不同,此外,在内部的实现上也稍微有些区别,这个在具体使用(移植)时,需要注意一下!但是,不同系列之间的差别并不是很大,而且在设计上是相同的。STM32的标准外设库涵盖以下3个抽象级别:
•包含位,位域和寄存器在内的完整的寄存器地址映射
•涵盖所有外围功能(具有公共API的驱动器)的例程和数据结构的集合。
•一组包含所有可用外设的示例,其中包含最常用的开发工具的模板项目。

STM32Cube
  ST为新的标准库注册了一个新商标:STMCube™。并且,ST专门为其开发了配套的桌面软件STMCubeMX,开发者可以直接使用该软件进行可视化配置,大大节省开发时间。
  这其中就包含了HAL库和最近新增的LL库。如下图:

从上图不难看出,LL库和HAL库两者相互独立,只不过LL库更底层。

HAL库
  HAL是Hardware Abstraction Layer的缩写,中文名:硬件抽象层。HAL库是ST为STM32最新推出的抽象层嵌入式软件,可以更好的确保跨STM32产品的最大可移植性。该库提供了一整套一致的中间件组件,如RTOS,USB,TCP / IP和图形等。
  HAL库是基于一个非限制性的BSD许可协议(Berkeley Software Distribution)而发布的开源代码。 ST制作的中间件堆栈(USB主机和设备库,STemWin)带有允许轻松重用的许可模式, 只要是在ST公司的MCU 芯片上使用,库中的中间件(USB 主机/设备库,STemWin)协议栈即被允许随便修改,并可以反复使用。至于基于其它著名的开源解决方案商的中间件(FreeRTOS,FatFs,LwIP和PolarSSL)也都具有友好的用户许可条款。
  可以说HAL库就是用来取代之前的标准外设库的。相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。HAL库是ST未来主推的库,从前年开始ST新出的芯片已经没有STD库了,比如F7系列。目前,HAL库已经支持STM32全线产品。

LL库
  LL库(Low Layer)是ST最近新增的库,与HAL捆绑发布,文档也是和HAL文档在一起的。
  LL库更接近硬件层,对需要复杂上层协议栈的外设不适用,直接操作寄存器。其支持所有外设。使用方法:
•独立使用,该库完全独立实现,可以完全抛开HAL库,只用LL库编程完成。
•混合使用,和HAL库结合使用。

/*----------------------------------------------------------------分割线---------------------------------------------------------------------------*/

至今为止,大部分芯片在CubeMX 可以指定生成LL库应用代码(F1提供库,但还不自动生成);


在STM32 ARDUINO HALMX 中 基于 HAL, 当然也支持使用LL库,其核心部分 如部分sysinit、 gpio操作等已经使用LL库代码,正由于HAL/LL是主推并支持ST全系列,因而这个STM32 ARDUINO HALMX 也就支持ST全系,包含目前ST尚未推出的芯片;只也是我放弃以前一直玩的 基于maple 及std 和HAL的三个arduino构架,转向这个全新的arduino实现方案;

在arduino中:
  stm32 片上外设,由于是固定的,因此大部分均放在核心(core)部分封装,每次都会将其全部代码编译并在链接时链接用到的代码,对各不同芯片的差异,通过 variants来配置;
  对于片外的外设,由于并不固定也并不一定存在,每个具体的板子都有差异,因此,通过arduino库方式来提供,好处是只有用到的才编译,缺点是用户需要自己用 #include <xxxx.h>将其包含,;这也是一个可用户配置的,通用代码在库中,具体板子连接方式通过一个配置文件放在特定板子文件夹内(位于variants)


定制自己的板子 :12楼



[ 此帖被huaweiwx在2017-08-24 11:13重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共4条打赏M币+25
o00100 M币 +1 謝謝分享 09-01
zhaocz M币 +8 優秀文章 08-23
cao57508 M币 +8 優秀文章 08-22
66ok66 M币 +8 多谢老大的教育, 诚意的有请继续教育下去,  这样我才能成长,谢谢~ 08-22
离线huangjingjie

发帖
33
M币
265
专家
0
粉丝
1
只看该作者 1楼 发表于: 08-22
楼主辛苦,强烈支持
本帖最近打赏记录:共1条打赏M币+9
huaweiwx M币 +9 - 08-22
离线66ok66

发帖
969
M币
1732
专家
4
粉丝
11
只看该作者 2楼 发表于: 08-22
多谢老大的教育, 诚意的有请继续教育下去,  这样我才能成长,谢谢~
本帖最近打赏记录:共1条打赏M币+9
huaweiwx M币 +9 - 08-22
离线zxy882266

发帖
321
M币
-269
专家
0
粉丝
9
只看该作者 3楼 发表于: 08-22
十二万分感谢啊,一直在找stm32 arduino有关,先学习下,我刷的是网上的固件,可是USB用了一次就连不上了
本帖最近打赏记录:共1条打赏M币+9
huaweiwx M币 +9 - 08-22
离线zxy882266

发帖
321
M币
-269
专家
0
粉丝
9
只看该作者 4楼 发表于: 08-22
我用的是淘宝STM32F103C8T6 系统板,请教楼主如何使用,原来arduino里的定义好像和这个不一样
离线huaweiwx

发帖
1094
M币
7666
专家
39
粉丝
180
只看该作者 5楼 发表于: 08-22
回 zxy882266 的帖子
zxy882266:我用的是淘宝STM32F103C8T6 系统板,请教楼主如何使用,原来arduino里的定义好像和这个不一样 (2017-08-22 14:31) 回 zxy882266 的帖子

你贴个图片给我看看,其实STM32F103C8T6系统板只有一个差异,就是LED接在那个口上。
常见的两种: BLUEPILL 和maple mini
你可以自己改一下 LED_BUILTIN 的定义;
离线cao57508

发帖
1951
M币
3402
专家
7
粉丝
62
只看该作者 6楼 发表于: 08-22
我去,大神又一篇新作,好高的效率。
本帖最近打赏记录:共1条打赏M币+9
huaweiwx M币 +9 - 08-22
离线yanghc

发帖
105
M币
125
专家
1
粉丝
8
只看该作者 7楼 发表于: 08-22
关注,跟着学习着。
本帖最近打赏记录:共1条打赏M币+9
huaweiwx M币 +9 - 08-22
离线laodayu

发帖
340
M币
2881
专家
2
粉丝
10
只看该作者 8楼 发表于: 08-22
这个教程非常详细,支持楼主。
离线wllzhk
发帖
251
M币
114
专家
0
粉丝
1
只看该作者 9楼 发表于: 08-23
长见识了
只会用标准外设库 ,各种东西基本都有,官方Example也很方便
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个