STM32学习笔记
Posted 杀不死的程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32学习笔记相关的知识,希望对你有一定的参考价值。
STM32
1.32位即表示32个二进制位(0/1),有可为八个十六进制位(0~F);
2.以最低位即第0位为例,它对应的配置位为CNF0和MODE0,MODE0【1:0】设为00(即最低两位二进制位均为0)时,IO0为输入模式,此时CNF0【1:0】设为01即为浮空输入模式。
CNF0【1:0】MODE0【1:0】连起来即为0100,即十六进制的数字4,。
.CRH和CRL均为32位寄存器,每四位控制一个IO口,所以CHR,CRL各控制八个IO口,分为高八位和低八位构成了它的十六个IO口;
/////
在数据手册上,BSRR的偏移地址为0X18,然后手册讲完BSRR后直接讲LCKR了,并且LCKR的偏移地址是 OX1C 。所以根据 OX1C-0X18=0X04 就知道BSRR是32位寄存器了。因为一个地址里面有一个字节的内容,一个字节是8位。好了,我看固件库里面的BSRRL的偏移地址是 0X18,而BSRRH的偏移地址是0X1A。不用多说了,两个都是16位的寄存器,BSRRL和BSRRH相隔两个字节,BSRRH和LCKR相隔两个字节,哦呵呵~~~发现后,我测试了一下把 BSRRL和BSRRH 编程时都试下这样: 1<<16 ,左移16位,果然报错了哈~~证明我说的没错。
也就是说,现在BSRR 这个32位寄存器 分成了两部分,两个16位的寄存器,一低一高。然后我编程,然后成功了~~~哈哈~~~
////typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
回到 GPIO_TypeDef 这段代码,这个代码用 typedef 关键字声明了名为 GPIO_TypeDef 的结构体类型,结构体内又定义了 7 个 __IO uint32_t 类型的变量。这些变量每个都为 32 位,也就是每个变量占内存空间 4 个字节。在 c 语言中,结构体内变量的存储空间是连续的,也就是说假如我们定义了一个 GPIO_TypeDef ,这个结构体的首地址(变量 CRL 的地址)若为 0x4001 1000, 那么结构体中第二个变量(CRH)的地址即为 0x4001 1000 +0x04 ,加上的这个 0x04 ,正是代表 4 个字节地址的
其实就是将一片存储空间,用来代表寄存器,从某个特定的地址开始,每4个字节代表一个寄存器,寄存器就是这个特定的地址的昵称,你访问这个寄存器,其实就是访问这个地址,说白了,还是地址
*ARM 处理器对存储器空间的访问分辨率以字节为最小单位;ARM 处理器还支持 16bit 数据(2 字节)的存储器访问和 32bit数据(4 子节)的存储器访问。在ARM 中将32 位的数据称之为‘字’,将 16 位的数据称之为‘半字
*51系列单片机是一个8位的单片机,因为只能执行8位宽的指令。Arm是一个32位的结构,不但可以执行32位的指令(称为arm指令集),也可以执行16位的指令(称为Thumb指令集)。
*8位二进制数称为字节,32位二进制数称为字,16位二进制数称为半字。
以上是关于STM32学习笔记的主要内容,如果未能解决你的问题,请参考以下文章