stm32f103自己写寄存器映射,寄存器映射点亮LED

这篇博客详细介绍了如何在嵌入式系统中通过寄存器映射来控制LED。首先,定义了寄存器外设、APB1和APB2的基地址,接着设置了RCC(复用功能时钟控制器)和GPIOB(通用输入输出)的基地址。然后,通过RCC_APB2ENR寄存器使能GPIOB时钟,并配置GPIOB的CRL和ODR寄存器来点亮PB0口的LED。最后,解释了ODR、BSRR和BRR寄存器的用途。
摘要由CSDN通过智能技术生成

首先,寄存器外设的基地址为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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值