}GPIO_TypeDef;
这段代码用typedef 关键字声明了名为GPIO_TypeDef 的结构体类型,结
构体内有7 个成员变量,变量名正好对应寄存器的名字。C 语言的语法规定,
结构体内变量的存储空间是连续的,其中32 位的变量占用4 个字节,16 位的变
量占用2 个字节。
也就是说,我们定义的这个GPIO_TypeDef ,假如这个结构体的首地址为
0x4001 1000(这也是第一个成员变量CRL 的地址),那么结构体中第二个成员
变量CRH 的地址即为0x4001 1000 +0x04 ,加上的这个0x04 ,正是代表CRH
所占用的4 个字节地址的偏移量,其它成员变量相对于结构体首地址的偏移,
在上述代码右侧注释已给出。
这样的地址偏移与STM32 GPIO 外设定义的寄存器地址偏移一一对应,只要
给结构体设置好首地址,就能把结构体内成员的地址确定下来,然后就能以结构
体的形式访问寄存器了,比如我们还是将GPIOC0 输出低电平,具体代码如下:
GPIO_TypeDef * GPIOx; //定义一个GPIO_TypeDef 型结构体指针GPIOx
GPIOx = GPIOC_BASE; //把指针地址设置为宏GPIOC_BASE 地址
GPIOx->BSRR =(1<<(16+0)); //通过指针访问并修改GPIOC_BSRR 寄存器
这段代码先用GPIO_TypeDef 类型定义一个结构体指针GPIOx,并让指针指
向GPIOC 基地址GPIOC_BASE,地址确定下来,然后根据C 语言访问结构体的内
容,用GPIOx->BSRR 写寄存器。为了操作更简便灵活,我们直接使用宏定义好
GPIO_TypeDef 类型的指针,而且指针指向各个GPIO 端口的首地址,使用时我
们直接用该宏访问寄存器即可。具体代码如下:
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
GPIOC->BSRR = (1<<(16+0));
我们这里仅仅以GPIO 这个外设为例,给大家讲解了如何使用C 语言对寄存
器封装,对于其他的外设也是使用同样方法。c语言内存分配对应其实到了后面的实验程序的编写,
我们都是使用ST 公司提供的固件库,他们把STM32 所有外设都已经封装好了,
我们只需要调用即可。我们这里分析这个封装过程只是想让大家更加清楚理解如
何使用C 来封装寄存器的。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-66178-5.html
这么些年发展成果着实不易
你具备了当省长的水平