重庆付费网站推广,旅游网页模板素材,微信开发者工具的介绍,2015做那些网站能致富一、寄存器结构体详解
对于STM32而言#xff0c;使用一个结构体将一个外设的所有寄存器都放到一起
二、修改驱动
1、添加清除bss段代码 2、添加寄存器结构体
在寄存器结构体中添加寄存器的时候一定要注意地址的连续性#xff0c;如果地址不连续的话#xff0c;要添加占位… 一、寄存器结构体详解
对于STM32而言使用一个结构体将一个外设的所有寄存器都放到一起
二、修改驱动
1、添加清除bss段代码 2、添加寄存器结构体
在寄存器结构体中添加寄存器的时候一定要注意地址的连续性如果地址不连续的话要添加占位数组 #define CCM_BASE (0x020c4000) /*CCM外设基地址*/
/*CCM外设*/ typedef struct { volatile unsigned int CCR; volatile unsigned int CCDR; volatile unsigned int CSR; volatile unsigned int CCSR; volatile unsigned int CACRR; volatile unsigned int CBCDR; volatile unsigned int CBCMR; volatile unsigned int CSCMR1; volatile unsigned int CSCMR2; volatile unsigned int CSCDR1; volatile unsigned int CS1CDR; volatile unsigned int CS2CDR; /* data */ }CCM_Type;
#define CCM ((CCM_Type*)CCM_BASE)
结构体指针
#include stdio.h
#include stdlib.h
//结构体化寄存器并将寄存器地址定义为结构体指针
//(1)编写外设结构体我定义了一个结构体结构体里的变量用于存放什么
typedef struct
{//volatile的意义为什么需要搞清楚volatile unsigned int CCR;volatile unsigned int CCDR;
}CCM_Type;
//(2)定义寄存器的基地址
#define CCM_BASE (0X020C4000)
//(3)定义访问指针此时结构体和基地址之间并无关系
#define CCM ((CCM_Type *)CCM_BASE)
//能否理解为在CCM地址范围内分配了struct CCM_Type结构体变量进行存储呢
//CCM_Type是一个结构体CCM_BASE的数值指向,CCM_TPye结构类型表示什么CCM_Type结构体的指针指向 CCM_BASE吗
//例如:int *p; p的指针是int型 p是指针变量存放地址
/*网上找的一个感悟#define GPIOA((GPIO_typedef)GPIOA_BASE基地址结构体指针#define GPIOA((GPIO typedef*)GPIOA BASE此预处理将GPIOA变成GPIOtypedef类型的结构体指针默认指向了GPIOA的基地址首。在调用-指向不同结构体成员时指针就会根据成员变量类型的大小跳不同的步进进而访问到不同的成员地址对不同成员地址(其实就是GPIO的各功能寄存器)赋值处理就完成操作 GPIO。这是我最近理解结构体指针的感悟。结构体压入地址中
*/
int main()
{//定义结构体变量return 0;
}
1
2
3
4
5
6
7
8
9
10
11
1
通过自己的理解我觉得这是一个最好不过的总结了值得反复读取几遍通过宏定义使用typedef定义的结构体其指针指向基地址读写寄存器状态结构体中变量保证与寄存器地址对齐。 2.#define IOMUXC_GPIO1_IO03_GPIO1_IO03 0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U 的解释 #define IOMUXC_GPIO1_IO03_GPIO1_IO03 0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U扩展到: 0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U 此段代码最好理解需要看函数 IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0); /* 复用为GPIO1_IO03 */函数参数通过define完成了参数的简化 * param muxRegister The pin mux register.* param muxMode The pin mux mode.* param inputRegister The select input register.* param inputDaisy The input daisy.* param configRegister The config register.* param configValue The pin config value.*/
static inline void IOMUXC_SetPinConfig(uint32_t muxRegister,uint32_t muxMode,uint32_t inputRegister,uint32_t inputDaisy,uint32_t configRegister,uint32_t configValue)通过这样即可理解为应该是常量替换要不参数太多了可读性变差整个0x02290000U, 0x5U, 0x00000000U, 0x0U, 0x02290044U理解成一个常量随着函数传参直接带入降低传参个数 初始化IO复用为GPIO引脚的代码和下面初始化GPIO的代码就是利用结构体指针控制寄存器。