从CW32L010看HAL库封装方式

原创 云深之无迹 2024-12-30 06:36
各家的HAL库都差不多,你学懂了我这篇文章,看别的库也是手到擒来,加油,这个投资不错,不过TI的库有点抽象,先骂为敬!

我们嵌入式软件究竟在写什么?我想聊聊这个东西,现在MCU几乎都是ARM的天下了,学通一个百样不愁。

抛开体系繁杂的东西不谈,其实最该明白的一点就是地址,当你明白就在操作地址,查,改,写的时候,你就会觉得不过如此。

首先你要知道对于CPU的视角看这些东西,都是取指令,处理,传出去,它其实是分不出来到底是一个SPI和UART或者一块内存。


就这个样子的

看这个框图,ARM内核和中断这些是最核心的东西,接着通过AHB这个总线连接了下面 APB1和2 ,就是从高速到低速,一级一级的控制。看SOC最重要的就是这个图。

抽象成这样

再看一个LPC1100,NXP的M0+的,也是这样的

这个图就是这样,从最高到最低囊括了一切,从总线到外设到内存:

地址分配

那上面这么多的器件,就被都抽象成了地址,只要对这个地址操作就行了。

更加详细的地址分配,这样看就分的更细致了

这个是STM32的

我们这里ADC在MCU里面的绝对地址是这个

接下来继续看,这个地址里面还有VC和LVD,每个外设都享有一些地址。那我们要办法再人性化一些!

首先我们知道起始的地址在这里

我们再把这个地址分块,分成一个一个的小格子BASE+address,就是对ADC这个外设的功能块进行了编码:

就是这样

ST家会写明这个偏移量是多少

我们看到这个CR到START之间有32bit,每个bit的作用是什么呢?

可以看到这些功能是什么样的!

代码里面如何做的?

我们使用C语言里面的结构体,把这段控制的地址进行一个封装,甚至说是映射吧。

这样就可以顺着地址进行一一的编码对应地址,union在内存里面的地址是连续的。

上面是对地址进行了编码,接下来就是操作这每一个位,我们还需要一些封装,其实不是封装,而是为了位运算的方便做的设计。

用于在同一块内存空间中存放不同的数据类型,以便能够通过不同的方式访问同一段内存。

联合体(union)是一种数据结构,它允许多个成员共享相同的内存空间。联合体中的所有成员都占用同一段内存,只是通过不同的方式来访问同一块内存。
在此代码中,CR 和 CR_f 共享同一块内存。CR 是一个 32 位的变量,而 CR_f 是一个结构体,结构体中的每个字段代表 CR 的不同部分。
CR 变量:
CR 是一个 32 位的 uint32_t 类型的变量,表示一个完整的 32 位寄存器,可以通过该变量直接访问整个寄存器。
使用 CR 变量时,可以一次性读写整个寄存器(32 位)。

因为地址空间一样,所以可以这样写

共享同一内存空间:联合体中的所有成员都共享同一块内存空间。换句话说,CR 和 CR_f 只是对同一段内存的不同访问方式。CR 变量允许直接访问整个 32 位的寄存器,而 CR_f 结构体则允许按位访问该寄存器。

CW_SYSCTRL->CR = 0x12345678;  // 设置整个寄存器的值uint32_t value = CW_SYSCTRL->CR;  // 读取整个寄存器的值

整个地址都拿走了。

CW_SYSCTRL->CR_f.EN = 1;  // 设置寄存器的 EN 位uint32_t clk_value = CW_SYSCTRL->CR_f.CLK;  // 读取寄存器的 CLK 位

单个位段是这样的。

简化代码:联合体使得通过不同的访问方式(整个寄存器或按位字段)来控制硬件寄存器变得更加简单和清晰。
内存节省:因为联合体中的所有成员共享同一块内存,因此它可以有效地节省内存空间。在嵌入式系统中,内存通常非常宝贵,使用联合体可以帮助减少内存占用。

每一位给了掩码和位置

ADC_CR_BGREN_Pos:这是一个位位置(bit position)的宏。它表示 ADC_CR 寄存器中 BGREN 位的位位置。

1UL 是一个无符号长整型常量,值为 1。UL 是指 unsigned long 类型,因此该宏定义表示 BGREN 位在寄存器中的位置是第 1 位(从 0 开始计数)。

这个宏用于定位 BGREN 位在寄存器中的具体位置,方便在位运算中使用。

看第二个:

ADC_CR_BGREN_Msk:这是一个位掩码(bit mask)宏。它表示与 BGREN 相关的位掩码。
0x2UL 是一个无符号长整型常量,值为 2。用二进制表示为 0000 0010,即第 1 位是 1,其他位是 0。这个二进制的编码是最重要的
用途:在位操作中,ADC_CR_BGREN_Msk 用于操作 BGREN 位。比如,在设置或清除 BGREN 位时,这个掩码可以帮助隔离 BGREN 对应的那一位。

位位置(Pos):表示位字段的位偏移。通过这些位置,开发者可以知道哪个位置表示某个功能。

位掩码(Msk):通过掩码,可以单独操作寄存器中的某一位。

在这个宏里面使用:

也就是我们要先获得CR这个寄存器

在这个地址里面做处理,就是我们把ADC_BASE后面的32个地址进行了强制的地址转换,其实就是给这片地址上了身份证。

我们要把CR控制器里面的BGREN使能

就是这样

这就是直接对位操作,但是这样看起来还是得看参考手册,还是不彻底。接下来就是要开始进一步封装,HAL库就要来了。

每一个外设都有一个头和具体的操作文件

这个先摆一下,反正就知道大部分都封装成了这样

我们先看这个:

定义了一系列位掩码宏(bitmask macros),用于操作一个 uint32_t 类型的变量中每一位。

它通过宏 bv(n) 定义了从第 0 位到第 31 位的每一个位掩码。这些宏可以用来设置、清除、检测或修改整数中相应位的值。

  1. bv(n) 宏通过将常量 1 左移 n 位来创建一个位掩码。这个掩码仅在第 n 位上为 1,其他所有位都是 0。
  2. 1u 表示无符号整数 1,<< (n) 表示将 1 左移 n 位。
  3. 例如,bv(0) 产生 0x00000001,即二进制 00000000000000000000000000000001,表示只有第 0 位为 1。
bv(n) 宏:这是一个通用的宏,用来生成单个位置为 1 的位掩码。
bv0 到 bv31:这些宏分别定义了从第 0 位到第 31 位的掩码,适用于特定位操作。

有了上面的知识就可以看这个了

这个宏定义了 ADC 的一种转换模式 Once(一次性模式),其值为 0。
ADC_ConvertMode_Once 表示 ADC 在该模式下执行一次转换后停止。
第二个宏:定义了 ADC 的另一种转换模式 Continuous(连续模式),其值为 bv3。
bv3 是先前定义的宏,它表示将值 1 左移 3 位,即 0x00000008(二进制:0000000000001000),相当于在寄存器中第 3 位上设置为 1。
ADC_ConvertMode_Continuous 用于启用 ADC 的连续转换模式,使得 ADC 在一次转换后继续进行下一次转换,直到被手动停止。
第三个是什么?用于检查给定的 MODE 是否是有效的 ADC 转换模式。
宏内部使用了 ||(逻辑或)运算符,检查 MODE 是否等于 ADC_ConvertMode_Single ADC_ConvertMode_Continuous
如果 MODE 是这两种模式之一,宏将返回 true(即检查通过);否则返回 false(检查失败)。
(MODE == ADC_ConvertMode_Single):检查 MODE 是否为单次转换模式。
(MODE == ADC_ConvertMode_Continuous):检查 MODE 是否为连续转换模式。
知识就是这么多,接下看具体的实现:

看一个失能,其实是对时钟进行了操作

我们看几个函数,学习一下

首先是我们初始化

ADC_InitStruct:这是一个指向 ADC_InitTypeDef 结构体的指针,该结构体包含了 ADC 初始化所需的配置参数。

也就是说,H文件定义了一些结构。

然后在C文件里面具体操作和封装。

先学一个宏:

REGBITS_MODIFY(Reg, Mask, Value)
修改寄存器 Reg 中与 Mask 对应的位为 Value 的值。
公式:(Reg) = ((Reg) & (~(uint32_t)(Mask))) | (Value)
(Reg) & (~(uint32_t)(Mask)):先清除 Mask 对应的位。
| (Value):将 Value 写入 Mask 对应的位置。

选择CR这个大地址里面,然后就是要清三个位置,接着赋值进去,是不是很简单。

接着这个,就是我上面写的

就是这样

在编程的时候其实就是库函数和对寄存器的直接读写混合的使用

总之的一切的起点就是地址,每一位都是一个开关。我们通过C语言的结构体来把相关外设的寄存器组织在一起方便控制。

接着我们又给了每一位的位置宏和掩码宏,来方便位运算控制。

最后进一步抽象,给出了对应的头文件里面的结构体,是对外设的进一步抽象。最后把前面的单条寄存器操作和一些校验放一起就是库函数了。一级一级的封装。

我想起来了大概14年的时候一些工程师天天骂ST的HAL库,死守标准库,现在看来真是愚蠢。都是封装罢了,有什么好吵的。

评论
  • 从无到有:智能手机的早期探索无线电话装置的诞生:1902 年,美国人内森・斯塔布菲尔德在肯塔基州制成了第一个无线电话装置,这是人类对 “手机” 技术最早的探索。第一部移动手机问世:1938 年,美国贝尔实验室为美国军方制成了世界上第一部 “移动” 手机。民用手机的出现:1973 年 4 月 3 日,摩托罗拉工程师马丁・库珀在纽约曼哈顿街头手持世界上第一台民用手机摩托罗拉 DynaTAC 8000X 的原型机,给竞争对手 AT&T 公司的朋友打了一个电话。这款手机重 2 磅,通话时间仅能支持半小时
    Jeffreyzhang123 2025-01-02 16:41 72浏览
  • 2024年之前国际国内大品牌芯片,是电子产品生产主流供应产品,国际和国内大品牌电子芯片,产品质量有保证,质量过硬,芯片各项参数满足电子产品需求,但价格高,交货慢,工厂接了急单,国内外大品牌产品短期内交不出来,交出芯片,价格太高。目前来看,以美国为首国外势力,对我们国家一些高端芯片,不出货,不卖给我们,我们要生产电器产品,一定要自己研发芯片,替代进口芯片,低价格芯片替代高价格芯片。国外买家对电子产品,价格压的太低,用国内外知名品牌电子芯片,那电子产品成本高过了卖价,工厂没有利润,工厂无法生存,芯片
    开发工匠 2025-01-01 11:49 88浏览
  • 2层PCB设计时候回路的寄生电感计算方式。由两个平面构成电流路径的回路电感,取决于每个平面路径的局部自感和它们之间的局部互感。平面越宽,电流分布就越扩散开,平面的局部自感就越小,从而回路电感也就越小。平面越长,局部自感就越大,从而回路电感也就越大。平面间距越小,平面之间的互感就越大,从而回路电感也就越小。当该区域为正方形,即长度等于宽度时,无论边长是多少,长和宽之比始终等于1。令人惊奇的是,一对平面上的边长为100mil的正方形区域和边长为1in的正方形区域的回路电感相同。平面对上的任一正方形区
    tao180539_524066311 2025-01-02 13:51 35浏览
  • 常见通信标准无线通信标准蜂窝移动通信标准:如 2G(GSM)、3G(WCDMA、CDMA2000、TD - SCDMA)、4G(LTE)以及 5G 等。以 5G 为例,其具有高速率、低时延、大容量等特点,为智能交通、工业互联网和物联网等领域提供支持。无线局域网标准:主要是 IEEE802.11 标准,也就是我们常说的 Wi - Fi。例如 IEEE802.11ac 和 IEEE802.11ax(Wi-Fi 6)等标准,不断提升无线局域网的传输速度和稳定性。短距离无线通信标准:包括蓝牙(Bluet
    Jeffreyzhang123 2025-01-02 14:33 37浏览
  • 国际标准IPC 标准:IPC-A-600:规定了印刷电路板制造过程中的质量要求和验收标准,涵盖材料、外观、尺寸、焊接、表面处理等方面。IPC-2221/2222:IPC-2221 提供了用于设计印刷电路板的一般原则和要求,IPC-2222 则针对高可靠性电子产品的设计提供了进一步的指导。IPC-6012:详细定义了刚性基板和柔性基板的要求,包括材料、工艺、尺寸、层次结构、特征等。IPC-4101:定义了印刷电路板的基板材料的物理和电气特性。IPC-7351:提供了元件封装的设计规范,包括封装尺寸
    Jeffreyzhang123 2025-01-02 16:50 81浏览
  •  在这个日新月异的科技时代,智能家居正以前所未有的速度融入我们的日常生活,从智能灯光到温控系统,从安防监控到语音助手,每一处细节都透露着科技的温度与智慧。而在这场智能化浪潮中,一个看似不起眼却至关重要的组件——晶体管光耦,正扮演着连接物理世界与数字世界的隐形桥梁角色,默默推动着智能家居行业的发展与革新。 晶体管光耦——智能家居的“神经递质”晶体管光耦,作为一种能够将电信号转换为光信号,再通过光信号控制另一侧电路开关的电子元器件,其独特的工作原理使得它在隔离传输、抗干扰及保护电
    晶台光耦 2025-01-02 16:19 48浏览
  • 早期概念与探索阶段(19 世纪以前):在古代,人类就对自动机械充满了想象,如古希腊时期的希罗发明的自动门、水钟等自动装置,中国古代的指南车、木牛流马等,虽然这些装置不能称之为真正的机器人,但为后来机器人的发展奠定了思想基础。从概念走向实践阶段(19 世纪~20 世纪初):随着工业革命的到来,自动机概念开始与实际机械设计结合,出现了具有实际功能的自动机械,例如雅卡尔提花机等,可通过穿孔卡片控制编织图案,为后续可编程控制的机器人发展提供了灵感。现代机器人产业萌芽期(1920 年代~1950 年代):
    Jeffreyzhang123 2025-01-02 14:53 75浏览
  • 前言近年来,随着汽车工业的快速发展,尤其是新能源汽车与智能汽车领域的崛起,汽车安全标准和认证要求日益严格,应用范围愈加广泛。ISO 26262和ISO 21448作为两个重要的汽车安全标准,它们在“系统安全”中扮演的角色各自不同,但又有一定交集。在智能网联汽车的高级辅助驾驶系统(ADAS)应用中,理解这两个标准的区别及其相互关系,对于保障车辆的安全性至关重要。ISO 26262:汽车功能安全的基石如图2.1所示,ISO 26262对“功能安全”的定义解释为:不存在由于电子/电气系统失效引起的危害
    广电计量 2025-01-02 17:18 69浏览
  • 在科技飞速发展的今天,5G 通信技术无疑是最耀眼的明星之一。它如同一场数字革命的风暴,以其前所未有的速度、极低的延迟和强大的连接能力,为我们的生活、经济和社会带来了翻天覆地的变化,开启了一个万物互联的崭新时代。5G 技术的卓越特性5G,即第五代移动通信技术,相比其前辈们,有着诸多令人瞩目的特性。首先是超高速率。5G 网络的理论峰值下载速度可达 10Gbps,这意味着下载一部高清电影只需短短几秒钟,而 4G 网络可能需要几分钟甚至更长时间。这种高速率让高清视频流、云游戏等对带宽要求极高的应用变得流
    Jeffreyzhang123 2025-01-02 14:18 56浏览
  • 起源与诞生:AI 技术的起源可以追溯到 20 世纪 40 年代,随着计算机技术的兴起,科学家们开始思考如何让机器具备类似人类的智能。1950 年,英国数学家艾伦・图灵提出了著名的 “图灵测试”,为 AI 技术的发展奠定了理论基础。1956 年,美国达特茅斯学院举行了一次人工智能研讨会,标志着 AI 作为一门独立学科的诞生。符号主义阶段(20 世纪 50 年代 - 70 年代):研究人员主要关注如何使用符号逻辑和推理规则来模拟人类思维,试图通过构建复杂的逻辑系统来解决各种问题。然而,由于这种方法的
    Jeffreyzhang123 2025-01-02 15:15 70浏览
  • 在科技飞速发展的今天,机器人已经逐渐深入到我们生活和工作的各个领域。从工业生产线上不知疲倦的机械臂,到探索未知环境的智能探测机器人,再到贴心陪伴的家用服务机器人,它们的身影无处不在。而在这些机器人的背后,C 语言作为一种强大且高效的编程语言,发挥着至关重要的作用。C 语言为何适合机器人编程C 语言诞生于 20 世纪 70 年代,凭借其简洁高效、可移植性强以及对硬件的直接操控能力,成为机器人编程领域的宠儿。机器人的运行环境往往对资源有着严格的限制,需要程序占用较少的内存和运行空间。C 语言具有出色
    Jeffreyzhang123 2025-01-02 16:26 68浏览
  • 随着全球汽车行业向更加清洁、可持续的能源转型,燃料电池汽车(FCV)作为一种具有广阔前景的技术,正逐渐受到业界的广泛关注。这类氢能源车辆通过燃料电池中的电化学反应,将氢气转化为电能,并仅产生水作为副产品,展现出显著的环境效益。然而,氢气的易燃性也为燃料电池汽车的安全带来了挑战,因此,高效的氢气泄漏检测系统和残氢排放监控技术对于确保车辆的安全性和可靠性至关重要。 ‌一、氢能源车氢气泄漏检测技术‌为了确保燃料电池汽车的安全性,氢气传感器被广泛应用于氢气泄漏检测中。这些传感器能够集成到车辆的
    锂电小助手 2025-01-02 10:05 45浏览
  • 近日,紫光展锐正式推出高性能4G 智能穿戴平台W377E。该产品面向不同的应用场景,拥有丰富特性和超低功耗,进一步壮大紫光展锐的智能穿戴产品组合。紫光展锐面向中高端和海量的智能穿戴市场,持续提供技术先进、高效安全、高质可靠的解决方案。 紫光展锐W377E采用四核A53架构,支持13M摄像头,video 1080P 30fps,集成了Wi-Fi、蓝牙和GPS功能。W377E搭载Android 8.1系统,提供更加丰富多样的APP体验,支持在线好友聊天、支付宝等功能,且支持64位系统的AP
    紫光展锐 2024-12-31 16:26 156浏览
  • 很荣幸收到富芮坤 FR3068x-C低功耗开发板,参加测评。断断续续看了一些资料,今天有时间把开发环境初步搭建好了,能下载程序了。记录一下,给大家分享一下。1、找不到ARMCM33_DSP_FP。安装Keil。我之前安装的Keil版本低,下载了重新安装了5.41,安装完成后,在工程配置页面的Device页面没有找到官方说的ARMCM33_DSP_FP,下图为官方文档内的截图,没有关系,注意右边涂黄色部分,Pack 的信息。打开keil的Pack Installer,找到ARM::CMSIS,找到
    王晓明 2025-01-01 15:38 83浏览
  •  近年来,消费电子行业难言景气,长期处于萎靡不振的状态。其中,作为明星品类的智能手机同样被寒意所笼罩,出货量持续下跌。据IDC发布的报告显示,2023年全年,中国智能手机市场出货量约2.71亿台,同比下降5.0%,创近10年以来最低出货量。不过,在智能手机行业整体低迷之际,折叠屏手机却表现亮眼,成为智能手机市场唯一实现增长的品类。据IDC发布的跟踪报告显示,2023年,中国折叠屏手机市场出货量约700.7万台,同比增长114.5%。而这也是自2019年首款产品上市以来,出货量连续4年同
    刘旷 2025-01-02 11:27 36浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦