b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

c语言内存分配对应 嵌入式C语言开发(5)

电脑杂谈  发布时间:2018-02-07 23:20:47  来源:网络整理

}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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 朝比奈薰
      朝比奈薰

      你具备了当省长的水平

      • 铃木达央
        铃木达央

        这么些年发展成果着实不易

    热点图片
    拼命载入中...