结构体作用(STM32)

结构体作用(STM32)

来源:正点原子

MDK 中很多地方使用结构体以及结构体指针,下面总结一下其使用结构体的主要作用。

1.结构体是将不同的数据类型整合为一个有机整体,方便数据管理,增加代码的可读性

2.结构体指针作函数入口参数,提高程序的可扩展性。在我们单片机程序开发过程中,经常会遇到要初始化一个外设比如串口,它的初始化状态是由几个属性来决定的,比如串口号,波特率,极性,以及模式。对于这种情况,在我们没有学习结构体的时候,我们一般的方法是:
-void USART_Init(u8 usartx,u32 u32 BaudRate,u8 parity,u8 mode);
但是如果我们这个函数的入口参数是随着开发不断的增多,就要不断的修改函数的定义,这时使用到结构体就能解决这个问题**,将串口有关的参数组合到一个结构体里面,在函数定义时将入口参数改为此结构体类型的形参,这样就可以在不改变入口参数的情况下,只需要改变结构体的成员变量,就可以达到上面改变入口参数的目的。**这样的好处是不用修改任何函数定义就可以达到增加变量的目的。

3.在STM32中用于寄存器地址名称映射。

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;

#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)//GPIOA 是将 GPIOA_BASE 强制转换为 GPIO_TypeDef 指针,这句话的意思是,
                                           //GPIOA 指向地址 GPIOA_BASE,GPIOA_BASE 存放的数据类型为 GPIO_TypeDef。
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000)

GPIOA 的 7 个寄存器都是 32 位的,所以每个寄存器占有 4个地址,一共占用 28 个地址,地址偏移范围为(000h~01Bh)。这个地址偏移是相对 GPIOA的基地址而言的。GPIOA 的基地址是怎么算出来的呢?因为 GPIO 都是挂载在 APB2 总线之上,所以它的基地址是由 APB2 总线的基地址+GPIOA 在 APB2 总线上的偏移地址决定的。APB2 总线的基地址又是总的外设基地址+APB2在其上的偏移决定。

补充:51 单片机开发中会引用一个 reg51.h 的头文件,其中名字和寄存器的联系是这样定义的:

sfr P0 =0x80;//sfr 也是一种扩充数据类型,占用一个内存单元,值域为 0~255。
//利用它可以访问 51 单片机内部的所有特殊功能寄存器。

然后我们往地址为 0x80 的寄存器设值的方法是:

P0=value;

STM32 中也可以通过同样的方式来做,但是 STM32 因为寄存器太多,如果一一以这样的方式列出来,那要好大的篇幅,既不方便开发,也显得太杂乱无序的感觉。所以 MDK 采用的方式是通过结构体来将寄存器组织在一起。

你可能感兴趣的:(单片机学习总结)