首先,寄存器外设的基地址为0x40000000
#define PERIRH_BASE ((unsigned int)0x40000000)
APB1的基地址就是寄存器外设的基地址
#define APB1PERIRH_BASE PERIRH_BASE
APB2的基地址是在寄存器外设的基地址前提下+0x10000 即0x40010000
#define APB2PERIRH_BASE (PERIRH_BASE + 0x10000)
AHB的基地址虽然是0x4001800,但平常会将它设置成0x40020000,即在APB2的基地址上再+0x10000 SDIO的地址我们会单独映射出来
#define AHBPERIRH_BASE (PERIRH_BASE + 0x20000)
点亮LED我们要使能时钟
那么我们就需要先设置RCC的基地址
RCC的基地址是在AHB的基地址上+0x1000 即0x40021000
#define RCC_BASE (AHBPERIRH_BASE + 0x1000)
我们点亮LED用到的是PB0,那么我们要设置GPIOB的基地址
它是在APB2的基地址上+0x0C00 即0x40010C00
#define GPIOB_BASE (APB2PERIRH_BASE + 0x0C00)
接下来就是真正意义上的使能时钟定义
RCC_APB2 是在RCC的基地址上偏移0x18 即RCC_BASE+0x18
在使用时我们要强制类型转化,这时我们将其包含在RCC_APB2的宏定义里使其更美观
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE + 0x18)
定义CRL寄存器,在GPIOB的基地址上偏移0x00
#define GPIOB_CRL *(unsigned int*)(GPIOB_BASE + 0x00)
定义ODR寄存器,在GPIOB的基地址上偏移0x0C
#define GPIOB_ODR *(unsigned int*)(GPIOB_BASE + 0x0C)
**************************************************************************************************************
ODR、BSRR、BRR寄存器用法
ODR寄存器,控制管脚的高、低电平,低16位有效,写1高电平,写0低电平;
BSRR寄存器,控制管脚的高、低电平,32位有效,低16位写1高电平,高16位写1低电平;
BRR寄存器,控制管脚的低电平,低16位有效,写1低电平;
**************************************************************************************************************
这时候就可以用寄存器映射来点亮led
//打开GPIOB端口的时钟
RCC_APB2ENR |= ( (1)<<3 );
//配置IO口为输出
GPIOB_CRL &=~ ( (0x0f)<<(4*0) );
GPIOB_CRL |= ( (1)<<(4*0) );
//控制ODR寄存器
GPIOB_ODR &=~(1<<0);