为何微控制器的编程如此困难?
可以说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(硬件抽象层)的激增。这可能表现为图形化硬件配置工具,如MPLAB和Simplicity Studio中的那些。Arduino及类似工具将继续被使用。有像这样针对ST Microelectronics STM32设备的全面HAL和底层驱动程序。STM文档显示构建HAL的方法多种多样。STM32非常接近SFR。我个人发现,将此文档与特定STM32处理器的数据手册对照阅读很有帮助。要明白,如果我们用性能更强的设备替换任何给定的微控制器,代码仍然有效。
技术提示 :在教育方面,我们需要理解学习者和专家之间的区别。人们很容易想教会学习者使用与专家相同的工具。现在和未来,HAL将占据主导地位,因为这些工具可靠且能缩短开发时间。同时,我们需要追问专家最初是如何成为专家的。极有可能每位微控制器专家都至少深入理解过一款微控制器。他们会告诉你一个故事:某个深夜排查那个出错的SFR,终于在凌晨3点发现问题时的肾上腺素激增。
结论
教育需要采取平衡的方法。或许这就是为何我偶尔会遇到对HAL独家教学法爱憎分明的教授们。这两种情况都过于极端,忽略了学习者与专家之间必要且非线性的过渡。
请点击此链接获取相关Arduino教育内容。