当前位置:首页 >> 计算机软件及应用 >>

Stm32里经常出现的结构体


Stm32 里经常出现的结构体
在 c 语言中结构体有如下 Struct typename { Int a; Int b; Int c; }bianliang; Typename 为结构名 表示这个结构体的 bianliang 为变量名 表示这个结构体变量

一.当我们只在程序中定义一次结构体变量时 typename 可以省略 如:
Struct { Int a; Int b; Int c; }bianliang; 如果这样做的话 你就不能方便的再在下面再定义该结构体变量 除非全部重新写如: Struct { Int a; Int b; Int c; }bianliang1; Struct { Int a; Int b; Int c; }bianliang2; Struct { Int a; Int b; Int c; }bianliang3; 这样就定义了结构体变量 bianliang1,bianliang2,bianliang3

二.如果要多次定义结构体变量最好不要省略 typename 如:

Struct typename { Int a; Int b; Int c; }bianliang; 如果要多次定义结构体变量 可以这样 如: Struct typename bianliang1; Struct typename bianliang2; Struct typename bianliang3; 这样就可以方便定义 bianliang1,bianliang2,bianliang3 比上面简单多了 (先不考虑 这样定义 Struct typename bianliang1,bianliang2,bianliang3;因为大多数官 方头文件都是按通用规则来写的 它们并不知道 你要定义的变量 当然万万不可修改官方 文件因为如果出错了 你都不知道哪里错了 上一列子同样 所以就必须分开定义)

三.再说一种更方便的定义也就是 stm32 头文件里经常用到的一种方法 typedef
Typedef struct { Int a; Int b; Int c;

如:

}newtype; Typedef 的作用就是重定义新类型 如 typedef int newint ; 就是把 int 重定义为 newint 此时 你就可以在程序中 newint 来定义整型变量了 如 newint a; 就是定义了一个整型 的 a。 定义新变量时 一定要用 typedef 不要用#define 因为#define 只是简单的做字符替 换 在程序中简单的做字符替换是会出错的 如: #define fp int* fp d ,f; 的意思就是 int* d,f; 此时 d 为指针 f 为整型变量 不是你想的那样 定义了 d f 两个指针。 如果用 typedef 则 Typedef int* fp; fp d ,f; 不是简单的替换 fp 被编译器认为是个新类型 依然是 定义了两个 指针。 Typedef struct { Int a; Int b; Int c;

}newtype; 则把结构体这个类型定义为 newtype 了 也就是说 newtype 替换了 struct { Int a; Int b; Int c; }; 此时就是省略 typename 结构体名 但没关系 复杂的结构体内部全部被 newtype 替换了 依 然可以简单的这样定义 如: Newtype bianliang1; Newtype bianliang2; Newtype bianliang3; 此时的方法和第一种方法一样 使用 Typedef 把它弄的更简单。

四.而在 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 GPIOB ((GPIO_TypeDef *) GPIOB_BASE) 就是把 GPIOB_BASE 这个值 强制转化为 GPIO_TypeDef 类型的地址 然后用 GPIOB 来替 换它 我们就可以方便的使用这个地址 GPIOB 了 注意地址可以理解为指针 也就是实质 GPIOB 就是个指针 指向这个 GPIO 寄存器组的首地址。 在头文件中有 #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) 这样个定义 再经上面的强制转换就是把这个地址开始的后面属于该寄存器的地址全部打包为一整体 GPIOB 这个结构体指针 也就是 GPIOB 被指定只能访问该寄存器组。 下面就可用指针指向运算符来访问该寄存器组里的寄存器了 如: GPIOB-> CRH=0x00000000;// 向寄存器 CRH 里写 0; 上面的定义意思可以理解为在 GPIOB 这个基地址上偏移 4 字节地址单位来得到 CRH 寄存 器的地址(因为__IO uint32_t CRL;占用四字节 结构体里的存储空间是线性排列的)


相关文章:
STM32系列常见问答集锦
名字是 GPIO_InitStructure,结构体原型由 GPIO_InitTypeDef 确定,stm32 里 面...就是即使不使能溢出等其他错误中断的情况下,若发生溢 出错误,仍进入中断,...
stm32知识点最终版!
将 PPP_InitTypeDef 结构中的参数设为缺省值; PPP...中断控制器 1.STM32F103 的中断系统由嵌套中断向量...中断发生与否 11TIM 中断配置 void TIM3_config ...
献给新手:解析STM32的库函数
结构体中的成员 GPIO_Pin,可以在“stm32f10x_gpio.h”文件中找到对 GPIO_...#define _GPIOA 这表示编译器会将代码中出现的 GPIOA 全部替换为((GPIO_TypeDef...
STM32中使用GPIO的总结(超强)
STM32中使用GPIO的总结(超强)_计算机软件及应用_IT/计算机_专业资料。STM32 ...二.推挽结构一般是指两个三极管分别受两互补信号的控制,是在一个三极管导通...
STM32的存储器
4 STM32 存储器结构首先,我们对比一下 Cortex-M3 存储器结构STM32 存储器结构: 图可以很清晰的看到,STM32 的存储器结构和 Cortex-M3 的很相似,不 同...
STM32F4xx系列DMA结构体初始化
STM32F4xx系列DMA结构体初始化_计算机软件及应用_IT/计算机_专业资料。DMA_Init...对应定义的数据流为优先级 DMA_Priority_High 对应定义的数据流为高优先级 ...
STM32通用定时器原理及应用
下图是STM32参考手册上时钟分配图中,有关定时器时钟...实际上只是改动了结构体成员NVIC_IRQChannel的值,...的是需要经过TIM_Period次计数后才会发生一次更新或...
关于STM32的存储器
4 STM32 存储器结构首先,我们对比一下 Cortex-M3 存储器结构STM32 存储器结构: 图可以很清晰的看到,STM32 的存储器结构和 Cortex-M3 的很相似,不 同...
STM32的嵌套中断系统NVIC详细整理_图文
2、开关中断 在 STM32/Cortex-M3 中是通过改变 CPU 的当前优先级来允许或...定义NVIC的结构体变量:NVIC_InitTypeDef NVIC_InitStructure; 选择要进行NVIC设置...
第七节 结构体与联合体
对这个结构体不陌生,STM32 固件函数库就 是这样,通过“大行其肆”的结构体和指针实现对一大堆寄存器的配置,在_map.h 这个头文 件,定义很多这样的结构体。...
更多相关标签: