从代码理解寄存器与库函数
学习DMA传输的时候注意到一点:
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)(&USART1->DR);//外设地址为串口1的数据寄存器
DMA_InitStructure.DMA_PeripheralBaseAddr我们应该给它DMA传输的外设地址。
OK!现在开始解析
①为什么要u32 ? 这是因为外设地址寄存器CPAR为32位填入有效(如下图)
②为什么要有&(取址)符号? 因为后面是一个结构体指针,指向结构体内的成员,他的数据类型为成员变量的数据类型!所以我们这里用取址符号来取其地址,不然数据类型就是成员变量的数据类型了。看不懂先看下面的内容,慢慢你就明白了
、、那么DR这个结构体成员的数据类型是什么呢? 它是一个16位的数据类型(如下图)----因此我们需要进行第一步的数据转换
但是实际上DR是一个八位的读写寄存器(如下图)—在这里库函数为了方便将其定义为16位的数据类型。
总结:
、、、硬件的寄存器每个位都有值,因此将其在软件上的寄存器设置为u16(16位的数据类型)或者设置为u32(32位的数据类型),我们可以在编程上设置软件寄存器上的每一个值来控制硬件寄存器上的功能。
(突然感觉硬件和软件的连接好牛,还有设计芯片的工程师们好厉害)
哈哈,大家加油!