Corter - M0存储器映射
SOC中CPU访问各个外部部件是通过每个部件的编号(地址)访问的;
CPU给各个部件分配地址的过程称之为映射;
Corter - M0 为32位,所以其给部件分配的地址范围为0 - 4Gb(2^32);
4GB的空间会有相应分段,相应部件在对应分段内
STM32存储器映射
如何访问寄存器
以GPIOA寄存器组为例,如何读取ODR寄存器?
已知GPIOA的起始地址为0x48000000,个寄存器的偏移地址为:
寄存器 地址偏移量
MODER; /*Address offset: 0x00 */
OTYPER; /*Address offset: 0x04 */
OSPEEDR; /*Address offset: 0x08 */
PUPDR; /*Address offset: 0x0C */
IDR; /*Address offset: 0x10 */
ODR; /*Address offset: 0x14 */
BSRR; /*Address offset: 0x18 */
LCKR; /*Address offset: 0x1C *
寄存器访问方式1:
对地址进行宏定义;
#define GPIOA_BASE ((unsigned int) 0x48000000)
#define GPIOA_ODR (GPIOA_BASE + 0x14
//读操作
val = *(unsigend int*)GPIOA_ODR;
//写操作
*(unsigend int*)GPIOA_ODR = val;
/*改进**/
#define GPIOA_ODR (*(unsigned int *)(GPIOA_BASE + 0x14))
val = GPIOA_ODR;
GPIOS_ODR = VAL;
访问寄存器方式2
用结构体封装寄存器;
typedef struct {
uint32_t MODER; /*Address offset: 0x00 */
uint32_t OTYPER; /*Address offset: 0x04 */
uint32_t OSPEEDR; /*Address offset: 0x08 */
uint32_t PUPDR; /*Address offset: 0x0C */
uint32_t IDR; /*Address offset: 0x10 */
uint32_t ODR; /*Address offset: 0x14 */
uint32_t BSRR; /*Address offset: 0x18 */
uint32_t LCKR; /*Address offset: 0x1C */
} GPIO_TypeDef;
#define GPIOA_BASE ( (unsigned int ) 0x48000000 )
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
注:我们访问GPIOA的控制寄存器组时、直接使用宏定义好 GPIO_TypeDef 类型的指针,而且指针指向 GPIOA端口的首地址,这样我们直接用宏GPIOA访问改外设的任意一个寄存器
GPIOA->MODER = 0x20 ;
GPIOA->OSPEEDR = 0x16 ;
STM32启动文件分析
注:Cortex-M0 的程序映像通常是从地址 0x00000000 开始的、系统复位后,处理器首先读取向量表中的前两个字(8 个字节),第一个字存入 MSP,第二个字为复位向量,它表示程序执行的起始地址(复位处理)
STM32F0启动模式
启动模 | 式选择 | ||
BOOT1 | BOOT0 | 启动模式 | 说明 |
x | 0 | 主闪存存储器 | 主闪存存储器选为启动区域 |
1 | 1 | 系统存储器 | 系统存储器选为启动区域 |
0 | 1 | 内置SRAM | 内置SRAM选为启动区域 |
根据启动模式的不同,用户闪存、系统闪存和SRAM都可以映射到0x0的低端地址;