对平时外设进行地址映射分为五级:总线、分线、端口、寄存器、位。下面是各个寄存器的起始地址


值得注意的是只在小容量、中容量和大容量的产品中才有这个共享的SRAM区域,互联型产品中没有这个区域。
为了方便操作,将各个地址进行映射有一定英文含义的宏。
#define PERIPH_BASE 0x4000 0000
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE+0x00010000)
#define AHBPERIPH_BASE (PERIPH_BASE+0x00020000)
#define GPIOC_BASE (APB2PERIPH_BASE+0x00001000)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDH *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODH *(unsigned int*)(GPIOC_BASE+0x0C)
#define RCC_BASE (AHBPERIPH_BASE+0x1000)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)
在最后的生成的代码
main.h文件
#define PERIPH_BASE 0x4000 0000
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE+0x00010000)
#define AHBPERIPH_BASE (PERIPH_BASE+0x00020000)
#define GPIOC_BASE (APB2PERIPH_BASE+0x00001000)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDH *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define RCC_BASE (AHBPERIPH_BASE+0x1000)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)
main.c文件
#include "main.h"
int main(void){
RCC_APB2ENR |= 1<<4;
GPIOC_CRH &=~(0x0F<<(4*5));
GPIOC_CRH |=(1<<(4*5));
GPIOC_ODR &=~(1<<13);
while(1);
}
void SystemInit(){
}