如果您爱好微控制器,如何以及为何阅读数据表

如果您爱好微控制器,如何以及为何阅读数据表

得益于神奇的Arduino,微电子成为近年来的时尚爱好。 但问题是:只要有足够的兴趣,您就可以很快超越 DigitalWrite(),但下一步该做什么并不完全清楚。 Arduino 开发人员投入了大量精力来降低进入其生态系统的门槛,但在其生态系统之外,仍然存在着一片由严酷电路组成的黑暗森林,业余爱好者无法进入。

例如,数据表。 似乎他们拥有一切,拿走并使用它。 但他们的作者显然并没有给自己设定普及微控制器的任务;他们的目标是普及微控制器。 有时 似乎他们在描述简单事物时故意滥用难以理解的术语和缩写,以尽可能地迷惑外行。 但并非一切都那么糟糕;如果需要的话,棺材可以打开。

在本文中,我将分享一位人文学科专家出于业余爱好而与数据表进行交流的经验。 本书面向那些从 Arduino 裤子中长大的业余爱好者;它假设读者对微控制器的工作原理有一定的了解。

我将从传统开始

Arduino 上的 LED 闪烁

并立即给出代码:

void setup() {
DDRB |= (1<<5);
}

void loop() {
PINB = (1<<5);
for (volatile uint32_t k=0; k<100000; k++);
}

“这是什么? ——有经验的读者会问。 – 为什么要向 PINB 输入寄存器写入内容? 仅供阅读!” 真的吗, Arduino 文档与互联网上的大多数教育文章一样,声明该寄存器是只读的。 我自己也是这么认为的,直到我重读它 数据表 Atmega328p,准备这篇文章。 还有:

如果您爱好微控制器,如何以及为何阅读数据表

这是一个相对较新的功能,Atmega8 上没有它,不是每个人都知道它,或者由于向后兼容性的原因没有提及。 但它非常适合展示数据表值得阅读的想法,以便使用芯片的所有功能,包括鲜为人知的功能。 这并不是唯一的原因。

为什么还要阅读数据表?

通常,Arduino 工程师在充分使用了 LED 和 AnalogWrites 后,开始将各种模块和芯片连接到板上,这些模块和芯片已经编写了库。 迟早,图书馆会出现无法正常工作的情况。 然后业余爱好者开始修​​理它,然后......

那里发生了一些完全无法理解的事情,所以你必须去谷歌,阅读大量教程,提取某人合适的代码的一部分,最终实现你的目标。 这给人一种强烈的成就感,但实际上这个过程就像通过逆向工程摩托车重新发明轮子一样。 而且,对这辆自行车如何工作的理解并没有增加。 我知道,因为我自己也这样做了很长一段时间。

如果我不花几天时间研究 Atmega328 文档,而不是进行这项令人兴奋的活动,我会节省大量时间。 毕竟,这是一个相当简单的微控制器。

因此,您至少需要阅读数据表才能想象微控制器通常如何工作以及它可以做什么。 并进一步:

  • 检查和优化其他人的库。 它们通常是由重新发明轮子的业余爱好者编写的。 或者,相反,作者故意让它们过于简单。 让它大三倍,慢一点,但肯定能行;

  • 能够在没有人编写库的项目中使用芯片;

  • 让您更轻松地从一个 MK 系列迁移到另一个 MK 系列;

  • 最终优化不适合 Arduino 的旧代码;

  • 了解如何直接通过寄存器控制任何芯片,而无需费心研究其库的结构(如果有)。

为什么有HAL和LL就直接写寄存器呢?

词汇表
HAL,高抽象层 – 用于控制具有高抽象级别的微控制器的库。 如果您需要使用 SPI1 接口,您只需配置并启用 SPI1,无需考虑哪些寄存器负责什么。
LL,低级 API – 包含带有寄存器地址的宏或结构的库,允许您按名称访问它们。 Atmega 上的 DDRx、PORTx、PINx 为 LL。

关于 Habré 的评论中经常出现关于“HAL、LL 或寄存器”主题的争议。 不声称可以获得星体知识,我只是分享我的业余经验和想法。

在或多或少了解了 Atmega 并阅读了有关 STM32 奇妙之处的文章后,我购买了六块不同的板 - Discovery 和 Blue Pills,甚至只是用于我自制产品的芯片。 它们都在一个盒子里收集了两年的灰尘。 有时我对自己说:“就是这样,这个周末我要掌握 STM”,启动 CubeMX,生成 SPI 设置,查看生成的文本墙,慷慨地添加 STM 版权,并认为这有点太多了。

如果您爱好微控制器,如何以及为何阅读数据表

当然,你可以弄清楚CubeMX这里写了什么。 但同时很明显,记住所有措辞然后手写是不现实的。 为了调试这个,如果我不小心忘记选中立方体中的复选框,那完全没问题。

两年过去了,我还在舔嘴唇 ST MCU 查找器 各种好吃的,但超出我理解的薯条,无意间碰到了 精彩的文章,虽然是关于STM8。 和 突然 我意识到我一直在敲一扇敞开的门:STM 的寄存器的排列方式与任何其他 MK 的寄存器相同,而 Cube 不需要与它们一起工作。 有可能吗?...

HAL(特别是 STM32CubeMX)是为与 STM32 芯片密切合作的专业工程师提供的工具。 主要特点是高度抽象,能够快速从一个 MCU 迁移到另一个 MCU,甚至从一个内核迁移到另一个内核,同时保持在 STM32 系列范围内。 爱好者很少遇到这样的问题 - 我们对微控制器的选择通常仅限于速卖通品种,而且我们经常在完全不同的芯片之间迁移 - 我们从 Atmega 迁移到 STM,从 STM 迁移到 ESP,或者我们中国朋友的任何新事物扔向我们。 HAL 在这里没有帮助,研究它会占用很多时间。

LL 仍然存在 - 但从它到寄存器还有半步。 就我个人而言,我发现用寄存器地址编写宏很有用:我更仔细地研究数据表,我思考我将来需要什么和我绝对不需要什么,我更好地构建我的程序,一般来说,克服有助于记忆。

此外,流行的STM32F103还有一个细微差别——它有两个不兼容的LL版本,一个来自STM官方,另一个来自Leaf Labs,用于STM32duino项目。 如果你写一个开源库(而且我确实有 这样的任务),您必须制作两个版本,或者直接访问寄存器。

最后,在我看来,消除 LL 可以简化迁移,特别是如果您从项目一开始就计划这样做的话。 夸张的例子:让我们在Atmel Studio中编写没有LL的Arduino Blink:

#include <stdint.h>

#define _REG(addr) (*(volatile uint8_t*)(addr))

#define DDR_B 0x24
#define OUT_B 0x25

int main(void)
{
    volatile uint32_t k;

    _REG(DDR_B) |= (1<<5);

    while(1)
    {
        _REG(OUT_B) |= (1<<5);
        for (k=0; k<50000; k++);
        _REG(OUT_B) &= ~(1<<5);
        for (k=0; k<50000; k++);
    } 
}

为了让此代码在带有 STM8(来自 ST Visual Desktop)的中国板上闪烁 LED,只需更改其中的两个地址即可:

#define DDR_B 0x5007
#define OUT_B 0x5005

是的,我使用了将 LED 连接到特定板上的功能,它会闪烁得很慢,但它会发生!

有哪些类型的数据表?

在俄语和英语的文章和论坛中,“数据表”是指芯片的任何技术文档,我在本文中也是如此。 从形式上来说,它们只是此类文档的一种类型:

产品规格书 – 性能特征、战术和技术特征。 对于任何电子元件都是强制性的。 保留在手边的背景信息很有用,但其中没有太多值得深思熟虑的内容。 然而,较简单的芯片通常仅限于数据表,以免产生不必要的文档; 在这种情况下 参考手册 包含在这里。

参考手册 – 说明书本身,一本 1000 多页的健康书。 详细描述了芯片中填充的所有内容的工作原理。 掌握单片机的主要文档。 不像 数据表,指令是为各种 MK 编写的;它们包含有关您的特定型号中不可用的外围设备的大量信息。

编程手册 или 指令集手册 – 独特的微控制器命令的说明。 专为那些使用汇编语言编程的人而设计。 编译器作者积极使用它来优化代码,因此一般情况下我们不需要它。 但查看此处对于一般理解、退出中断等某些特定命令以及主动使用调试器很有用。

应用笔记 – 解决特定问题的有用技巧,通常带有代码示例。

勘误表 – 非标准芯片行为情况的描述以及解决方案选项(如果有)。

数据表中有什么内容

直接到 产品规格书 我们可能需要以下部分:

设备摘要 – 数据表的第一页简要描述了该器件。 当您在某处发现芯片(在商店中看到它、焊接它、偶然提及)并想了解它是什么时,这非常有用。

一般描述 – 该系列芯片功能的更详细描述。

引脚分配 – 所有可能的芯片封装的引脚图(哪个引脚位于哪个引脚上)。

引脚说明 – 每个引脚的用途和功能的描述。

内存映射 – 我们不太可能需要内存中的地址映射,但有时它还包括寄存器块地址表。

注册地图 – 通常,寄存器块的地址表位于数据表中,并且在 参考手册 – 仅轮班(地址偏移量).

电气特性 – 在本节中我们主要感兴趣的是 绝对最大额定值,列出每个芯片的最大负载。 与坚不可摧的 Atmega328p 不同,大多数 MK 不允许您将严重负载连接到引脚,这对 Arduinists 来说是一个令人不快的惊喜。

包装信息 – 可用案例的图纸,在设计电路板时很有用。

参考手册 结构上由专门针对标题中所示的特定外围设备的部分组成。 每章可分为三部分:

概述, 介绍, 特征 – 外围设备功能概述;

功能说明, 使用指南 或者只是该部分的主要部分 - 外围设备原理及其使用方法的详细文字描述;

寄存器 – 控制寄存器的描述。 在简单的情况下,例如 GPIO 或 SPI,这可能足以开始使用外设,但通常您仍然需要阅读前面的部分。

如何阅读数据表

出于习惯,数据表的数量和大量难以理解的单词会吓到你。 事实上,如果你知道一些生活窍门,一切都没有那么可怕。

好的PDF阅读器。 数据表是按照纸质说明书的光荣传统编写的;它们非常适合打印、插入塑料书签和缝纫。 其中的超文本是微量的。 幸运的是,至少文档的结构是用书签设计的,所以一个合适的、易于导航的阅读器是非常有必要的。

该数据表不是 Stroustrup 的教科书;它包含 无需阅读所有内容。 如果您使用了之前的建议,只需在书签栏中找到所需的部分即可。

数据表,特别是 参考手册,可以描述不是特定芯片的功能,但是 整条线。 这意味着一半甚至三分之二的信息与您的芯片无关。 在研究TIM7寄存器之前,先检查一下 一般描述 , 你有吗?

要知道 английский 足够了 基本水平。 数据表由一半普通母语人士不熟悉的术语和一半简单的连接结构组成。 中文英文中也有优秀的中文数据表,其中一半也是术语,后半部分是一组随机单词。

如果你遇见 不熟悉的词,不要尝试使用英俄词典翻译它。 如果你感到困惑 磁滞现象,那么翻译“滞后”不会让你更温暖。 使用 Google、Stack Overflow、维基百科、论坛,其中所需的概念将在其中 用简单的语言和例子解释.

理解你所读内容的最好方法是 检查行动。 因此,请随身携带您熟悉的调试板,或者最好是两个,以防您仍然误解某些内容并看到魔法烟雾。

当您使用数据表时,将数据表放在手边是一个好习惯 阅读某人的教程 或研究别人的图书馆。 您很有可能会在其中找到更优化的解决方案来解决您的问题。 反之亦然 - 如果您无法从数据表中了解寄存器的实际工作原理,请用谷歌搜索:很可能,有人已经用简单的文字描述了所有内容,或者在 GitHub 上留下了清晰的代码。

词汇表

一些有用的单词和符号可帮助您快速熟悉数据表。 这两天想到的,欢迎补充和指正。

电力
VCC, 真的 – “加”,食物
VS, V型 – “减”,地球
当前 - 当前的
电压 - 电压
灌电流 – 作为外部负载的“接地”
源电流 – 为外部负载供电
高灌/源引脚 – 具有更高负载“公差”的引脚

IO
H,高 – 在 Vcc 引脚上
L,低 – 在 Vss 引脚上
高阻抗, 高阻抗, 漂浮的 – 引脚上没有任何东西,“高电阻”,外界几乎看不到它。
弱上拉, 弱下拉 – 内置上拉/下拉电阻,大约相当于 50 kOhm(参见数据表)。 例如,它用于防止输入引脚悬在空中,导致误报。 - 因为很容易“打断”他。
推拉 – 引脚输出模式,在该模式下,它在 и – Arduino 的常规输出。
漏极开路 – 输出模式的指定,其中引脚可以是 高阻抗/浮动。 此外,这几乎总是不是“真正的”开漏;有保护二极管、电阻器等等。 这只是接地/无模式的指定。
真正的漏极开路 - 但这是真正的开漏:如果引脚开路,则引脚直接接地,如果引脚闭合,则保持处于不稳定状态。 这意味着,如果需要,可以通过大于 Vcc 的电压,但最大值仍然在数据表中指定 绝对最大额定值/电压.

接口
系列化 – 串联
连锁 – 使用串行连接将芯片组装成链,增加输出数量。
转移 – 移位,通常表示位移位。 分别, 移入 и 移出 – 逐位接收和传输数据。
– 当位通过缓冲区移位时覆盖缓冲区的锁存器。 传输完成后,阀门打开,钻头开始工作。
打卡上班 – 执行逐位传输,将所有位移到正确的位置。
双缓冲, 影子寄存器, 预载寄存器 – 历史指定,此时寄存器必须能够接受新数据,但将其保留到某个时刻。 例如,为了使 PWM 正确工作,其参数(占空比、频率)在当前周期结束之前不应更改,但新参数已经可以传输。 因此,当前的保持在 影子寄存器,新的落入 预载寄存器,被写入相应的芯片寄存器。

各种各样的事情
预分频器 – 频率预分频器
设置一点 – 将位设置为 1
清除/重置一点 – 将位重置为 0 (重置 – STM 数据表功能)

接下来是什么

总的来说,这里计划了一个实践部分,演示 STM32 和 STM8 上的三个项目,这些项目是使用数据表专门为本文制作的,包括灯泡、SPI、定时器、PWM 和中断:

如果您爱好微控制器,如何以及为何阅读数据表

但文字较多,所以项目发到第二部分。

阅读数据表的技能将有助于您的爱好,但它不太可能取代在论坛和聊天中与其他爱好者的实时交流。 为此,你首先还是需要提高你的英语水平。 因此,读完的人将获得特别奖励:使用代码支付首笔费用即可获得两节Skyeng免费课程 HABR2.

来源: habr.com

添加评论