一定要把这个库函数吃透,才能灵活掌握ARM单片机!
从CW32L010看HAL库封装方式 我之前写过一个,但是今天看的时候发现还有我不懂的,再总结一下。
从最近看的BTIM开起~
嘿
然后映射
BTIM_TypeDef 结构体对应于 MCU 基本定时器(Base Timer,BTIM) 的 寄存器映射,起始地址为 0x40004800,总大小为 48 字节(0x30)。
注意这里是现
这是一段
对比数据手册是倒着封装的
就是功能位
CR1_f
这三个是空
14,13,12,三位
继续看这个联合体里面有结构体
这个是完整的
这个是位域结构体
用 CR1 读取整个 32 位寄存器 用 CR1_f 直接操作寄存器的具体位
就是这个样子
regValue 用于整体访问寄存器 regBits 用于操作寄存器的单个位 无论修改 regValue 还是 regBits,它们都指向同一块内存,所以修改一个变量,另一个变量也会同步变化。
我们使用的时候可以这样,深入进去可以改位
如果 CR1 直接赋值 0x01,它会覆盖整个寄存器的所有位。 如果 CR1_f.EN = 1,它 只会修改 EN 位,而不会影响其他位。
所以这个东西就是这样的
typedef 定义新类型名,简化数据结构的使用。也就是把BTIM1给定义了一次 struct 定义数据结构,组织多个变量。 union 使不同访问方式共享同一块内存,提高寄存器操作的灵活性。
对比一下
名字叫BTIM
首先定义一个TIM的初始化结构体
这个就是里面要操作的东西
然后就可以通过结构体的方法来把要设置的值写进去
然后我们对定时器初始化,传一个外设的结构体和对应的设置结构体。
一开始函数里面判断这个参数对不对
后面这个IS开头的就是这个功能
参数ok的话,开始更改。
后面的是我们的设置结构体,给到了前面外设结构体的位域里面。
里面还有修改寄存器的位
#define REGBITS_MODIFY(REG, MASK, VALUE) ((REG) = ((REG) & ~(MASK)) | (VALUE))
先清除再写入
先是寄存器,然后是要修改的位置,然后是新值。
我们再看一个使能定时器的
NewState ? A : B 是 C 语言的三元运算符(三目运算符)
就是这样的
展开后的样子
再看看这个
这就是第一个寄存器组
在这里
|= 按位或(OR)运算:将 CR1 的 Bit 0 位置 1(启用定时器)。