嵌入式大杂烩周记 | 第 8 期

大家好,我是杂烩君。

上周,有位小伙伴推荐了:

3eb7dc58e4415df3fe3208bca4b6daa6.png

这周我们就来简要分享AMetal。

嵌入式大杂烩周记主要是一些实用项目学习分享,每周一篇,每篇一个主题。

内容主要来源于我们之前收集的资料:

https://gitee.com/zhengnianli/EmbedSummary

本期主角:AMetal

AMetal 是芯片级的裸机软件包,定义了跨平台的通用接口,使得不同厂商、型号的 MCU外设都能以通用接口操作。

AMetal 为用户提供了与具体芯片无关、仅与外设功能相关的通用接口,屏蔽了不同芯片底层的差异性。

AMetal 的特点 :

  • 外设功能标准化,提供了一系列跨平台 API,使应用程序可以跨平台复用;

  • 不依赖于操作系统服务;

  • 开放外设所有功能;

  • 独立的命名空间 am_,可以避免与其它软件包冲突;

  • 能独立运行,提供工程模板与 demo,用户在此基础上快速开发应用程序;

  • 封装时将效率和变化部分放在第一位,用户不看手册也能使用;

  • 上层系统基于 AMetal 开发外设驱动,无需针对各种繁杂外设分别开发驱动;

AMetal 仓库链接:

作者:周立功科技

链接:https://github.com/zlgopen/ametal

AMetal 配套书籍电子版:

https://www.zlg.cn/ametal/down/index.html

license:LGPL-2.1。

关于开源软件协议相关文章:常用的开源协议有哪些?

AMetal的学习

从上面的仓库链接下载得到AMetal(本文基于 AMetal 1.1.2 版本),其源码目录结构如下:

95e7b5c57afeedd60ada6a9b1ccccb21.png

其中,AMetal_Sel.exe为AMetal的分包软件。AMetal源码中包含了许多与具体芯片相关的源码,比如board、examples、soc文件夹下的代码都按芯片进行分类,每一类有对应的文件夹。

AMetal目前支持的芯片如下:

4bd8a3c756692d79fc4c62722d2ac0fb.png

b938e78237779708c20cbb72edb5371e.png

board是自定义的,则可以将芯片对应的任意一个board作为模板,稍作改动即可使用。

通过分包软件,我们可以提取出只包含某一款芯片的AMetal源码,方便我们进行学习。比如,我们提取出stm32f103rbt6 SDK开发包:

1ca8841505e4d6b9c8a34da3ec8f274d.png

提取得到:

90600ed51f484445a1c9a76cdc9bed69.png

这也是一个完整的基于AMetal的stm32f103工程,我们想要基于AMetal进行STM32的应用开发,则在这个工程上进行修改即可。

下面我们基于stm32f103rbt6 SDK开发包来学习AMetal。

AMetal的板级工程提供了eclipse及keil5工程。此处,我们使用keil5工程。

AMetal_stm32f103rbt6_core的keil5工程文件在如下路径:

AMetal_stm32f103rbt6_core\board\stm32f103rbt6_core\project_example\projects_keil5

4fe01fb93ad7e14032dc082334d57145.png

13ecd84575fb52691256d84739a590a2.png

user_code就是放我们的应用代码,基于AMetal来开发应用,用户主函数是 am_main

b5bb21d6935a814c3927928f400b43af.png

am_main函数被真正的main函数(user_config/am_prj_config.c文件)调用,如:

6172f9ef374bd18db3dac4aad49d5375.png

下面我们从一个简单的led demo来了解AMetal的抽象出来的服务。接着上面的 am_main 函数一层一层往下看:

c65212df285eb600b650e36a9b5eaffa.png

998bcb1b5c88f040a9b9b549087dbeba.png

可以看到,这个demo实现了一个led的闪烁。控制led使用了如下接口:

  • am_led_on

  • am_led_off

这也是AMetal高度抽象出来的接口,屏蔽了硬件相关的操作,我们应用开发不用关心底层,调用这些高度抽象的接口真正实现了应用与硬件分离。

下面看一下AMetal的架构图:

3902d5637bb02b266db008bf3c187dc4.png

AMetal 共分为 3 层, 硬件层、驱动层和标准接口层 。

  • 硬件层:对芯片外设寄存器操作进行封装。

  • 驱动层:驱动层在硬件层的基础上,进一步封装,简化外设操作。根据外设是否特殊,分为标准驱动与非标准驱动。

  • 标准接口层:这一层是是AMetal高度抽象出来的一套接口,使用这一套接口可以更好地实现应用与硬件分离。

硬件外设的作用是为系统提供某种功能,AMetal基于外设的共性,对同一类外设功能进行了高度的抽象,由此形成了“服务”的抽象概念,即各种硬件外设可以为系统提供某种服务 。

服务是抽象的,不与具体硬件绑定。同时,为了使应用程序使用这些服务,AMetal还定义了一系列标准化的软件接口,即AMetal地标准接口层。

由于服务是对某一类功能高度抽象的结果,与具体芯片、外设、器件及实现方式均无关。即使底层硬件千变万化,都可以使用一套简洁的接口使用相应的外设。

比如,上面的led demo就是使用了标准接口层的api函数对led进行操作。

简要分析:

4a44559936741dd728d5059b7f3a6838.png

led例程入口函数中,其操控了LED0:

8cecdc410f16f795460bdb7c52b56fe2.png

LED0宏只是简单的数字标号,怎么知道对应着哪个引脚呢?

其实引脚也是需要我们用户自己指定的,在user_config/am_hwconf_led_gpio.c文件中:

ab69f12e04effad37b5c4db46bedf1c6.png

这里定义了两个LED,引脚分别为PC9、PA8。

总结下来就是,我们需要使用某个硬件设备时,我们需要在user_config文件夹对该硬件进行一些简单的设备信息初始化即可很方便地使用这个设备。因为调用了高度抽象地标准接口层API函数,即使更换硬件平台,应用也不需要修改。

AMetal的标准设备服务接口有很多类:

dbf8bf0866e92c189b1a8ad2530260fb.png

601249a391da32ead5ef34f89edc227a.png

具体的使用说明可查阅其API参考手册。

以上就是本次关于AMetal的简要分享。AMetal不仅仅给我们的应用开发提供了一个有效的开发框架,同时,其也是一手很好的学习资料,从中,可以学习到很多编程思想与编程技巧。后续,我们也抽取一些模块来剖析学习、分享。

以上就是本次的分享,文章如有错误,欢迎指出,谢谢!

咱们下期见~

温馨提示

由于微信公众号近期改变了推送规则,如果您想经常看到我们的文章,可以在每次阅读后,在页面下方点一个「赞」或「在看」,这样每次推送的文章才会第一时间出现在您的订阅列表里。

往期推荐:

嵌入式大杂烩周记 | 第 7 期 zlog

嵌入式大杂烩周记 | 第 6 期 FlexibleButton

嵌入式大杂烩周记 | 第 5 期 smartlink

嵌入式大杂烩周记 | 第 4 期 cola_os

嵌入式大杂烩周记 | 第 3 期 sys/queue.h

嵌入式大杂烩周记 | 第 2 期 llgui

嵌入式大杂烩周记 | 第 1 期 gear-lib

在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总。

点击阅读原文,查看更多分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式大杂烩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值