
经常都会收到小伙伴关于“要不要学寄存器”的问题。
因为有些小伙伴比较好奇,现在有很多工具(比如STM32CubeMX、e2 studio、AT32_Work_Bench等)可以“一键生成软件工程”帮你配置寄存器。
还有像 Arduino 有很多现成的库代码,上层应用只需要一两行代码就能搞定。有了这些“高级的工具”,还有必要学习和了解寄存器吗?
今天就来简单聊聊这个话题。
为什么需要学习寄存器?
搞MCU,为什么需要学习寄存器?
网上有一部分人,其实在吐槽HAL等库函数执行效率低、难理解、代码量大、占用内存多等一系列问题。
那么,直接操作寄存器在一定程度上就能解决这些问题。反过来说,学习寄存器就有与之对应的诸多好处:
1、直接控制硬件
使用寄存器可以直接控制硬件,这个在早期的单片机(比如51、MSP430等)特别明显,大多数都是直接寄存器编程。
比如51单片机通过直接操作寄存器控制点灯:
#include <reg51.h> sbit LED = P1^0; void main(void) { while(1) { LED = 0; } }
2、理解底层原理
还是拿LED点灯/关灯来说,很多做上层应用、或者小程序、物联网开发的工程师,他只知道发一条指令控制灯泡开/关。但你要问他灯泡究竟是如何实现开和关的,他其实不知道的为什么。
如果你学了寄存器、学了电子电路,你就能很轻松的回答这个问题。
学习寄存器能帮助你理解单片机如何工作(例如单片机中断如何触发、定时器如何计数),这对调试复杂问题(如时序冲突、资源竞争)至关重要。
3、优化代码
如果你项目用到的单片机的Flash、RAM资源很少,且非常有限,你会发现使用寄存器的重要性。
直接操作寄存器可以绕过HAL库函数“中间转换”,减少代码体积、提升执行效率,这在资源受限的单片机项目中尤为重要。
使用过SMT32CubeMX的小伙伴应该知道,它的库函数有HAL和LL两种,你会发现LL库生成的代码量要比HAL小很多
4、更加灵活和可控
单片机的某些高级功能(如生成特定时序、低功耗模式配置)可能无法通过库函数实现,直接操作寄存器就能轻松实现。
也就是说,直接操作寄存器可以“定制化”一些特定的功能,即更加灵活和可控。
不学寄存器行不行?
寄存器是单片机的关键,如果不学,就掌握不到单片机的精髓。
1、业余爱好者可以不学
如果你只是一个临时的业余爱好者,只是想快速完成一个简单项目(如点亮LED、驱动显示屏),可以使用现成的库函数(如Arduino、STM32 HAL库)快速上手,可以不用深入理解寄存器。
2、单片机开发者一定要学,且要深入
用单片机做过大型项目的工程师,绝大多数都是学习过寄存器的,而且深入掌握寄存器底层原理。
为什么这么说?有很多bug是需要理解并掌握寄存器才能解决的,过来人才会更加理解其中的道理。包括上面说的执行效率低、难理解、代码量大、占用内存多等这些问题。
如何学习寄存器?
以前51单片机的寄存器非常少,而现在Cortex-M内核单片机的寄存器,光一个外设就有很多的寄存器,而且bit位数很多,代表的意思也是很多。
这么多寄存器对于新手来说,根本学不完、背不完,该怎么办?
寄存器不需要我们死记硬背,在你需要的时候查阅手册即可。
1、要学会查阅单片机手册(Datasheet)
比如STM32参考手册,手册中会详细描述每个寄存器的功能、位定义和操作等。
2、掌握C语言位操作
掌握位掩码(Bit Mask)、移位(Shift)、与或非操作等。
比如:以STM32为例,将PA5设置为输出模式
GPIOA->MODER &= ~(0x3 << 10); // 清空原有配置 GPIOA->MODER |= (0x1 << 10); // 设置为输出模式
3、学会调试查看寄存器
使用调试器(如J-Link、ST-Link)实时查看寄存器值,验证配置是否正确等。
最后
1、如果你想坚持走单片机开发这条路线,你一定要学寄存器,而且要深入理解。这对你将来解决复杂硬件问题能起到关键作用(同时,这也是你的一项核心竞争力)。
2、如果你只是简单玩玩,又想快速上手,可以选择性的学习和了解寄存器。
3、如果你做上层应用开发,只是发送指令控制底层硬件,可以不用深入理解寄存器。
来源:公众号strongerHuang(作者 | strongerHuang)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。