• 正文
  • 相关推荐
申请入驻 产业图谱

学单片机,有必要寄存器吗?

05/07 10:55 来源:strongerHuang
1454
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

有小伙伴好奇,现在有很多工具,可以“一键生成工程”,还有必要学习和了解寄存器吗?

今天就来简单聊聊这个话题。

为什么需要学习寄存器?

单片机,为什么需要学习寄存器?

网上有一部分人,其实在吐槽HAL等库函数执行效率低、难理解、代码量大、占用内存多等一系列问题。

那么,直接操作寄存器在一定程度上就能解决这些问题。反过来说,学习寄存器就有与之对应的诸多好处:

1、直接控制硬件

使用寄存器可以直接控制硬件,这个在早期的单片机(比如51、MSP430等)特别明显,大多数都是直接寄存器编程。

比如51点灯直接操作寄存器:

#include <reg51.h>
sbit led = P1^0;
void main(void){while(1)	{		led = 0;	}}

2、理解底层原理

还是那点灯、关灯来说,很多做上层应用、或者小程序、物联网开发的工程师,他只知道发一条指令控制灯泡开/关。但你要问他灯泡究竟是如何实现开和关的,他其实是不知道的。

如果你学了寄存器、学了电子电路,你就能很轻松的回答这个问题。

学习寄存器能帮助你理解单片机如何工作(例如中断如何触发、定时器如何计数),这对调试复杂问题(如时序冲突、资源竞争)至关重要。

3、优化代码

如果你单片机的Flash、RAM资源有限,你会发现使用寄存器的多么的重要。

直接操作寄存器可以绕过库函数的中间层,减少代码体积、提升执行效率,这在资源受限的嵌入式系统中尤为重要。

使用过SMT32CubeMX的小伙伴应该知道,它的库函数有HAL和LL两种,你会发现LL库生成的代码量要比HAL小很多

之前我还分享过一篇文章:STM32 LL 为什么比 HAL 高效?

4、更加灵活和可控

单片机的某些高级功能(如特定时序生成、低功耗模式配置)可能无法通过库函数实现,直接操作寄存器就能实现。

也就是说,直接操作寄存器可以“定制化”一些需要的功能,即更加灵活和可控。

不学寄存器行不行?

寄存器是单片机的关键,如果不学,就掌握不到单片机的精髓。

1、业余爱好者可以不学

如果你只是一个临时的业余爱好,只是想快速完成一个简单项目(如点亮LED、驱动显示屏),可以使用现成的库函数(如Arduino、STM32 HAL库)快速上手,可以不用深入理解寄存器。

2、单片机开发者一定要学,且要深入

用单片机做过大型项目的工程师,绝大多数都是学习过寄存器的,而且深入掌握寄存器底层原理。

为什么这么说?有很多bug是需要理解并掌握寄存器才能解决的,过来人才会更加理解其中的道理。包括上面说的执行效率低、难理解、代码量大、占用内存多等这些问题。

如何学习寄存器?

以前51单片机的寄存器相对较少,现在Cortex-M内核单片机的寄存器很多,学不完、背不完,该怎么办?

寄存器不需要我们死记硬背,在你需要的时候查阅手册即可。

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、如果你做上层应用开发,只是发送指令控制底层硬件,可以不用深入理解寄存器。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

作者黄工,从事嵌入式软件开发工作8年有余,高级嵌入式软件工程师,业余维护公众号『strongerHuang』,分享嵌入式软硬件、单片机、物联网等内容。