
得益于神奇的Arduino,微电子学是近年来的一种时尚爱好。 但是麻烦在于:如果有足够的兴趣,DigitalWrite()可能会迅速增长,但是下一步的工作尚不完全清楚。 Arduino开发人员已经做出了很多努力来降低进入其生态系统的门槛,但是在其外部,仍然有一片黑暗的电路粗糙的丛林,业余爱好者无法进入。
例如,数据表。 似乎他们拥有了一切,接受并使用它。 但是,只有他们的作者显然没有为自己设定普及微控制器的任务。 有时,他们似乎在描述简单事物时有意滥用晦涩的术语和缩写,以尽可能地混淆未成年人。 但是并不是一切都那么糟糕,如果需要的话,箱子会打开。
在本文中,我将分享出于兴趣爱好将人文与数据表进行交流的经验。 本文针对的是那些从Arduino裤子成长而来的Arduino裤子的爱好者,它为微控制器的工作原理提供了一些见识。
我将从传统的
Arduino上的LED闪烁
然后立即执行代码:
void setup() { DDRB |= (1<<5); } void loop() { PINB = (1<<5); for (volatile uint32_t k=0; k<100000; k++); }
“那是什么? -问老练的读者。 -为什么要在PINB输入寄存器中写入内容? 他只供阅读!” 实际上,与Internet上大多数培训文章一样, Arduino文档也声称该寄存器是只读的。 我本人是这么认为的,直到我重新阅读Atmega328p的数据表以准备本文为止。 那里:

这是一个相对较新的功能,它不是在Atmega8上提供的,不是所有人都知道或出于向后兼容性的原因而没有提及它。 但这很适合用来证明数据表值得一读的知识,以便使用芯片的所有功能,包括鲜为人知的功能。 这不是唯一的原因。
为什么还要阅读数据表
通常,已经在LED和AnalogWrite'ami上玩够了的arduino驱动程序开始将各种模块和芯片连接到板上,为此已经编写了程序库。 迟早会出现无法正常运行的库。 然后业余爱好者开始选择它进行修复,然后...
而且发生了一些完全不可理解的事情,因此您必须去Google那里,阅读大量的教程,整理一些合适的代码,最后按自己的方式做。 这给人以强烈的成就感,但实际上,该过程使人联想起通过对摩托车进行反向工程而发明的自行车。 而且,了解这辆自行车的工作原理并不会增加。 我知道,因为我本人已经做了很长时间了。
如果我花了几天时间研究Atmega328的文档,而不是进行这种有趣的活动,那我将节省大量时间。 最后,它是一个相当简单的微控制器。
因此,至少有必要阅读数据表,以设想微控制器的总体布置方式以及其功能。 并且:
- 检查和优化其他人的图书馆。 它们通常是由发明自行车的恋人所写。 或者相反,作者故意使他们免受愚弄。 让它变大和变慢三倍,但绝对可以。
- 能够在没有人写过库的项目中使用芯片;
- 促进从一条MK线迁移到另一条MK线的任务;
- 最终优化他们的旧代码,而Arduin则不适合;
- 学习如何直接通过其寄存器管理任何芯片,而不必费心研究其库的设备(如果有)。
当存在HAL和LL时,为什么要直接写入寄存器?
词汇量
HAL,硬件抽象层 -用于控制具有高抽象水平的微控制器的库。 如果您需要使用SPI1接口,我们只需配置并启用SPI1,而不必担心哪个寄存器负责什么。
LL,低级API-一个包含具有寄存器地址的宏或结构的库,允许您按名称访问它们。 Atmega上的DDRx,PORTx,PINx是LL。
关于“ HAL,LL或寄存器”主题的争议经常出现在对Habré的评论中。 在不要求获得星体知识的情况下,我将仅分享我的业余经验和想法。
我或多或少地与Atmega进行了梳理,并阅读了有关漂亮的STM32的文章,然后我买了六块不同的板子-还有Discovery和“ Blue Tablets”,甚至只是自制产品的芯片。 他们都在盒子里撒了两年灰尘。 有时我会对自己说:“我这个周末要掌握STM,” CubeMX推出了,为SPI生成了一个安装程序,查看了结果的文字墙,并用STM版权进行了丰富的修饰,然后决定它太多了。

当然,您可以了解CubeMX在这里写的内容。 但是同时记住所有的公式是不现实的,以便以后可以用手编写它们。 而且,如果我不小心忘记在古巴打勾,请出价-嗨。
两年过去了,我仍然舔着各种各样的美味,但据我所知,我看不到ST MCU Finder中的芯片,偶然发现了一篇关于STM8的精彩文章 。 突然间,我意识到我一直都在敲门:STM寄存器的排列方式与其他任何MK相同,并且Cube是与它们一起工作的可选项。 所以有可能吗?
HAL,尤其是STM32CubeMX是面向与STM32芯片紧密合作的专业工程师的工具。 主要特征是高度抽象,能够从一个MK快速迁移到另一个MK,甚至从一个内核迁移到另一个内核,同时仍保留在STM32系列之内。 业余爱好者很少遇到这样的任务-我们对MK的选择通常仅限于速卖通的范围,并且我们经常在根本不同的芯片之间进行迁移-我们从Atmega转到STM,从STM转到ESP,或者对我们的中国朋友来说是什么新鲜事。 HAL在这里无济于事,其研究将花费大量时间。
仍然有LL-但从那里到半步寄存器。 就我个人而言,我发现用寄存器地址编写宏很有用:我更加仔细地研究了数据表,我认为将来会需要它,而绝对不是,我可以更好地构建程序,总体而言,克服会有助于记住。
此外,流行的STM32F103也有细微差别-因为它有两个不兼容的LL版本,一个是STM的官方版本,另一个是STM32duino项目中使用的Leaf Labs。 如果您编写了一个开放源代码库(而我刚刚完成了这样的任务 ),则必须创建两个版本,或者直接访问寄存器。
最后,我认为拒绝LL可以简化迁移,特别是如果您从项目工作的一开始就依靠它。 夸张的例子:在没有LL的Atmel Studio中写Arduin的眨眼:
#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连接到特定板上的功能,它会非常缓慢地闪烁,但是会!
什么是数据表
在俄语和英语的文章和论坛中,“数据表”是指芯片的任何技术文档,我在本文中也是如此。 形式上,它们只是此类文档的一种:
数据表 -TTX 战术上 技术规格。 确保具有任何电子组件。 参考信息对您有所帮助,但尤其是其中没有仔细阅读的信息。 但是,较简单的芯片通常仅限于数据表,以免产生不必要的文档。 在这种情况下,此处包括参考手册 。
参考手册 -实际手册,一本健康的书,有1000多页。 压入芯片的所有东西的工作都被详细绘制。 开发微控制器的主要文件。 与数据表不同,指令是针对广泛的MK编写的,它们包含许多有关外围设备的信息,而这些信息在您的特定型号中不可用。
编程手册或指令集手册 -有关微控制器独特命令的指令。 专为在汇编器中编程的人设计。 编译器的作者积极地使用它来优化代码,因此通常我们将不需要它。 但是,在一些特定的命令(例如退出中断)以及积极使用调试器之后,进行一般性理解后,在此处进行浏览非常有用。
应用笔记 -解决特定问题的有用技巧,通常带有代码示例。
勘误表 -带有旁路选项(如果有)的非标准芯片行为情况的描述。
数据表中的内容
直接在数据表中,我们可能需要以下部分:
设备摘要 -数据表的第一页简要介绍了该设备。 如果您在某个地方找到了芯片(在商店中看到了,vypayali,碰到了提要)并且想了解它是什么,这将非常有用。
概述 -对生产线上芯片功能的更详细描述。
引脚排列-适用于所有可能的芯片盒的引脚排列方案(该引脚具有引脚)。
引脚说明 -每个引脚的用途和功能的描述。
内存映射 -我们几乎不需要内存中的地址映射,但是有时它还包括一个寄存器块地址表。
寄存器映射 -寄存器块的地址表,通常位于数据表中,而在《 参考手册》中 ,仅地址偏移量 。
电气特性 -在本节中,我们主要关注绝对最大额定值 ,列出芯片上的最大负载。 与不可抗拒的Atmega328p不同,大多数MK不允许您将重负载连接到销钉上,这对于arduino玩家来说是不愉快的惊喜。
封装信息 -可负担得起的外壳图纸,可用于设计电路板。
参考手册在结构上由标题中指明的特定外围部分组成。 每章可分为三个部分:
概述 , 简介 , 功能 -外围功能的概述;
功能说明 , 使用指南或仅主要部分-外围设备原理及其使用方式的详细文字描述;
寄存器 -控制寄存器的描述。 在诸如GPIO或SPI这样的简单情况下,这足以开始使用外设,但通常您仍必须阅读前面的部分。
如何阅读数据表
习惯中的数据量使他们的数量和大量难以理解的单词吓跑了。 实际上,如果您知道一些生活技巧,一切都不会那么可怕。
安装一个好的PDF阅读器 。 Datashits是以光彩的纸质说明书写的,非常好将它们打印,用塑料书签放置并缝制。 它们中的超文本以痕量被观察到。 幸运的是,至少文档的结构已添加了书签,因此非常需要具有便捷导航功能的良好阅读器。
Datashit不是Straustrup的教科书, 您不必阅读其中的所有内容 。 如果您使用了上一个技巧,则只需在书签栏中找到该部分。
数据表,尤其是参考手册 ,可能没有描述特定芯片的功能,而是描述了整个产品线 。 这意味着一半甚至三分之二的信息与您的芯片无关。 在学习TIM7寄存器之前,请检查“ 通用说明”中是否有一个。
具备基本的 英语知识就足够了。 Datashits的一半由不熟悉普通母语的人组成,另一半由简单的连接结构组成。 仍然有漂亮的中文英文数据表,其中一半也是术语,后半部分是一组随机单词。
如果遇到不熟悉的单词 ,请不要尝试使用英俄词典将其翻译。 如果磁滞使您感到困惑 ,那么翻译“磁滞”将不会使您变暖。 使用Google,Stack Overflow,Wikipedia,论坛,其中必要的概念将通过示例简单地说明 。
理解所读内容的最佳方法是行动起来 。 因此,请把您熟悉的调试板放在手边,最好是两个,以防万一您仍然误解了一些东西并看到了魔力。
阅读某人的教程或研究某人的图书馆时,最好保留数据表。 有可能在其中找到针对您的问题的最佳解决方案。 反之亦然-如果您无法从数据表中了解寄存器的工作原理,请用google搜索:很可能有人已经用简单的文字描述了所有内容,或者在github上留下了易于理解的代码。
词汇量
一些有用的词语和符号可以帮助您更快地习惯数据表。 过去几天记住的内容,欢迎添加和更正。
电学
Vcc , Vdd -Plus,电源
Vss , Vee- “减号”,地面
当前 -当前
电压 -电压
吸收电流 -为外部负载“接地”
提供电流 -提供外部负载
高接收器/源极引脚 -具有更高的负载公差的引脚
IO
H,高电平 -引脚Vcc
L,低电平 -在Vss引脚上
高阻抗 , 高阻 , 浮动 -引脚上没有“高阻抗”,实际上它是外界看不见的。
弱上拉 , 弱上拉 -内置上拉/ 下拉电阻器,模拟量约为50 kOhm(请参见数据表)。 例如,它用于防止输入引脚悬空,导致误报。 弱 -因为很容易“杀死”他。
推挽 -引脚输出模式,在该模式下,它可以在Arduino的高和低 -正常输出之间切换。
开漏 -输出模式的指定,其中该引脚可以为低 阻抗或高阻抗/浮动引脚。 而且,几乎总不是一个真正的开漏,而是有保护二极管,电阻器等。 它只是地面/无模式的名称。
真正的露天排水管 -但这已经是一个真正的露天排水管:如果销子是开放的,则直接引至地面;如果销子是闭合的,则处于不稳定状态。 这意味着,如有必要,可以允许大于Vcc的电压通过它,但最大值仍在数据表的“ 绝对最大额定值/电压”部分中指定。
介面
串联 - 串联
链接 -通过串行连接以链接方式收集芯片,从而增加输出数量。
shift -shift,通常表示位的移位。 因此, 要移入和移出 -一点一点地接收和发送数据。
闩锁 -当位在缓冲区中移动时覆盖缓冲区的阀。 传输完成后,阀门打开,钻头开始工作。
计时 -执行按位传输,将所有位移至所需位置。
double buffer , shadow寄存器 , preload寄存器 -寄存器应能够接受新数据但保留到一定时间时的历史记录名称。 例如,为使PWM正常工作,在当前周期结束之前,其参数(占空比,频率)不应更改,但已经可以传输新参数。 因此,当前的寄存器将保留在影子寄存器中 ,而新的寄存器将落入预加载寄存器中 ,并记录在相应的芯片寄存器中。
每一个
预分频器 - 分频器
设置位 -将位设置为1
清除/重置位 -将位重置为0( 重置 -STM数据表芯片)
切换位 -将位值更改为相反的值(请参见本文开头的示例)
接下来是什么
总的来说,这里计划了实践部分,以演示STM32和STM8上的三个项目,这些演示是使用数据表专门针对本文而设计的,包括灯泡,SPI,定时器,PWM和中断:

但是文本太多了,因此将项目发送到第二部分。
阅读数据表的技能将有助于您的业余爱好,但不太可能取代论坛和聊天室中的同伴爱好者进行实时交流。 对于他来说,首先要加强英语。 这就是为什么我要读完这本书的原因-一个特别的奖项:使用HABR2
代码在首次付款时在Skyeng中获得两次免费课程。