笔记:STM32中寄存器地址与指针的转换

1.STM32中的存储器映射地址(查STM32F429数据手册)

/*片上外设基地址*/
#define PERIPH_BASE             ((unsigned int)0x40000000)

 /*AHB1总线基地址*/
#define AHB1PERIPH_BASE         (PERIPH_BASE + 0x00020000)

 /*GPIOB基地址*/
#define GPIOB_BASE              (AHB1PERIPH_BASE + 0x0400)

2.将寄存器地址转换成指针

#define GPIOB_MODER            *(unsigned int*)(GPIOB_BASE+0x00)

#define GPIOB_OTYPER           *(unsigned int*)(GPIOB_BASE+0x04)
    (unsigned int*)(GPIOB_BASE+0x00)    把地址强制转换成指针类型
    *(unsigned int*)(GPIOB_BASE+0x00)   把地址强制转换成指针类型并指向该地址
    
     “*”作用是解引用,引用指针指向的变量值,引用其实就是引用该变量的地址。

3.封装寄存器时,需要用volatile修饰

 #define __IO    volatile

关键字“ volatile”在 C 语言中该关键字用于表示变量是易变的,要求编译器不要优化,每次使用这些变量的时候,都要求 CPU 去该变量的地址重新访问。若没有这个关键字修饰,在某些情况下,编译器认为没有代码修改该变量,就直接从CPU 的某个缓存获取该变量值,但该缓存中的是陈旧数据,导致数据访问有出入。

解引用:百度百科

猜你喜欢

转载自blog.csdn.net/sinat_42731525/article/details/106275525