教育中的微控制器硬件抽象层 (HAL)

为何微控制器的编程如此困难?

可以说C语言编程本身并不难,复杂的是那些特殊功能寄存器(SFR)。由于关联硬件日益复杂,微控制器的编程难度也随之增加。这要求程序员先理解硬件功能,再操控硬件。
需知微控制器硬件由众多SFR控制,其中许多寄存器对硬件的影响微妙且不符合直觉。例如使用模数转换器(ADC)时,程序员必须设置或清除参考电压、转换时钟、通道选择和数据对齐(左/右)等SFR。资深程序员还会配置SFR,使ADC转换完成时触发中断。对于高性能微控制器,程序员可能需配置直接内存访问(DMA)机制,使ADC结果处理独立于主CPU。

这种SFR的复杂度可通过数据手册的厚度来衡量。以新款8位Microchip PIC16F13145T-I/SO为例。其数据手册长达604页,仅ADC部分就占46页。相比之下,瑞萨R7FA6M5BH2CBG#AC0硬件用户手册达2276页,其中ADC章节占85页。显然,这两个例子代表了微控制器光谱的两端。但核心观点很明确。微控制器硬件极其复杂。数据手册内容密集,稍有不慎遗漏某个SFR就会导致模块失效或性能下降。硬件抽象层正是为缓解这种复杂性而设计。

Arduino 为何如此成功?

Arduino可能是最知名的微控制器硬件抽象层(HAL)。查阅Arduino语言参考时,可见其HAL分为数字I/O、模拟I/O、高级I/O、时间、中断和通信等类别。这些知名函数将程序与底层SFR隔离,大幅简化开发流程。此外,Arduino HAL代理能适配所有系列产品。因此从最小的ATtiny到最大的系统模块(如PORTENTA Pro H7),都能使用相同函数编程。这种跨平台兼容性和HAL的吸引力,甚至延伸至工业级可编程逻辑控制器(PLC)等非Arduino设备。你会发现Arduino、树莓派与工业控制器之间的界限正趋于模糊,共同倾向是简化编程并缩短开发周期。

技术提示 :ATtiny与RA6M5体现了Arduino HAL实现的通用性。它们也展现了局限性。ATtiny比“标准Arduino”低一个级别。例如,您的ATtiny可能不具备运行串行和SPI接口所需的硬件。可能需要软件技术来实现这些功能。另一方面,RA6M5这款性能强大的芯片拥有比“标准”Arduino多得多的硬件和功能。最近一篇关于解锁PORTENTA Pro C33部分PWM功能的文章就是例证。

关键信息是程序员必须保持警惕,充分了解特定微控制器的硬件和能力,但不一定要深入到SFR级别。这也暗示了一种教育路径:所有工程师、技术专家和技术员都应至少深入探索一款微控制器到SFR级别。深入理解一款微控制器将有助于更好地理解所有微控制器。在本文中,我主张使用微控制器谱系中较低端的设备,如经典的8051、MSP430、Z8、AVR和PIC。

我们在微控制器软件开发中看到了哪些趋势?

毫无疑问,我们看到HAL(硬件抽象层)的激增。这可能表现为图形化硬件配置工具,如MPLABSimplicity Studio中的那些。Arduino及类似工具将继续被使用。有像这样针对ST Microelectronics STM32设备的全面HAL和底层驱动程序。STM文档显示构建HAL的方法多种多样。STM32非常接近SFR。我个人发现,将此文档与特定STM32处理器的数据手册对照阅读很有帮助。要明白,如果我们用性能更强的设备替换任何给定的微控制器,代码仍然有效。

技术提示 :在教育方面,我们需要理解学习者和专家之间的区别。人们很容易想教会学习者使用与专家相同的工具。现在和未来,HAL将占据主导地位,因为这些工具可靠且能缩短开发时间。同时,我们需要追问专家最初是如何成为专家的。极有可能每位微控制器专家都至少深入理解过一款微控制器。他们会告诉你一个故事:某个深夜排查那个出错的SFR,终于在凌晨3点发现问题时的肾上腺素激增。

结论

教育需要采取平衡的方法。或许这就是为何我偶尔会遇到对HAL独家教学法爱憎分明的教授们。这两种情况都过于极端,忽略了学习者与专家之间必要且非线性的过渡。

请点击此链接获取相关Arduino教育内容

感谢分享这篇深入剖析微控制器编程痛点的文章!作为一名偶尔捣鼓嵌入式项目的爱好者,我深有同感——那些SFR确实像个“黑箱迷宫”,一不小心就踩坑。举个例子,我上次用PIC18F系列调试ADC时,忽略了数据对齐位,结果读出的值全乱套,花了半天时间才在数据手册里扒拉出来。
文章对Arduino HAL的跨平台魅力描述得特别到位,它确实让入门门槛低了很多,让我们这些“周末工程师”能快速上手原型。但正如你提到的局限性,ATtiny上的软件SPI实现总让我觉得像在“曲线救国”。未来趋势部分也让我眼前一亮,尤其是STM32的HAL生态——我最近在试Simplicity Studio的图形配置工具,效率提升明显,但还是会偶尔深挖SFR来优化性能。
教育平衡这点,我完全赞同。或许可以试试“螺旋式”教学:先用HAL快速上手项目,再逐步剥洋葱到底层硬件。
期待更多这样的技术分享。

1 个赞

我讲下我入门嵌入式的经历。先是学习了stm32的标准库,勉强能点个灯,后面做项目发现用hal库能省很多事,也简单易懂,没有系统的去学全部的内容,基本上就是项目用到什么就去学一下对应的内容。

但有时也会因为不太明白其具体原理而感到困扰,所以最近又想着重新深入学习一下标准库。

不知道我这种学习路线是否走了很多弯路,欢迎各位大佬提提意见

我说一下我对微控制器硬件抽象层的一个理解,我们一开始中国的这个教育大都是从8051来进行教学的,我们都是直接来操作这个寄存器,AT89C51寄存器的量非常的小,我们操作起来非常的一个容易,到了这些32位机和现在拓展型的51单片机它的内容就是非常的多了,那么多寄存器记不过来,那么有了这样的的一个硬件抽象层有助于我们理解操作寄存器,HAL其实本质上还是去操作寄存器,但是有了C语言这个这个函数,还有一些注释,相等为我们实现了一部分的代码,但是有一些的函数操作他没有完全把微控制器的一些细节的操作完全的展现出来,就比如作者提到的Arduino封装得太过彻底,反而不利于微控制器它作为控制的目的,发挥板卡或芯片的全部功能,再谈论教育,像我们学习一本书,看一本书不可能看他的头两页,我们一定是要把整本书都要学一遍都要读一遍,那么就像这样的一个HAL教育者都在教育我们怎么用这个HAL库但是没有教育我们如何的实现自己的HAL库,关键的问题这个芯片HAL扩展性和完善性欠缺,教育者不侧重于如何的让我们实现这个HAL库或者完善它,我们如果解决芯片问题还是要操作寄存器。所以教育的过程是不能省略,如果只会用别人的代码而不能自己实现代码,那你的能力是会遭到挑战的