STM32单片机:直接访问寄存器的方法

今天讲一下STM32单片机直接访问寄存器的方法,这是开发STM32的必备技能,以后各模块的控

制操作都是通过读写寄存器来实现。本文通过操作寄存器来完成PA口读写数据,来展示访问寄存

器的步骤。

STM32内部具有众多的设备,PA口是属于GPIO设备的一部分,掌握了PA口的操作方法,其他设

备就按同样的方法去操作。

要实现对PA口寄存器的访问,首先要得到PA口寄存器的基地址,可以通过查阅上节所说的器件手

册得到:

定义一个PA口基地址的宏定义

// GPIO PA口基地址的宏定义

#define GPIOA_BASE            ((uint32_t)0x48000000)

另外,从编程手册查到PA口,有若干个寄存器来控制其工作,这是其寄存器的名称以及相对于PA

口基地址的地址偏移量:

// MODER  0x00  端口工作模式      此寄存器相对于基地址的地址偏移量 = 0x00

// OTYPER  0x04  输出模式            此寄存器相对于基地址的地址偏移量 = 0x04  下同...

// OSPEEDR  0x08  输出速度

// PUPDR  0x0C  上下拉设置

// IDR  0x10  输入数据

// ODR  0x14  输出数据

// BSRR  0x18  端口某位的置位/复位控制

// LCKR  0x1C  端口配置锁定

// AFRL  0x20  端口功能复用配置(低8位)

// AFRH  0x24  端口功能复用配置(高8位)

// BRR  0x28  端口某位的复位控制

根据这些寄存器的偏移量,定义一个结构类型:

typedef struct

{

     volatile    uint32_t    MODER;

     volatile    uint32_t    OTYPER;

     volatile    uint32_t    OSPEEDR;

     volatile    uint32_t    PUPDR

     volatile    uint32_t    IDR;

     volatile    uint32_t    ODR;

     volatile    uint32_t    BSRR;

     volatile    uint32_t    LCKR;

     volatile    uint32_t    AFRL;

     volatile    uint32_t    AFRH;

     volatile    uint32_t    BRR;

} GPIO_TypeDef;

注意这里的变量需要用volatile来声明,因为寄存器操作是直接针对硬件设备的,必须要具备实时

性,用volatile声明后,寄存器操作不会通过硬件高速缓存Cache,写入的数据将会立即生效,读出

的数据会是寄存器里当前最新的值,这点很重要。

再定义一个结构指针指向PA口的基地址:

 #define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

通过对结构内变量的访问,即可完成对端口PA的读写:

// 向PA口写数据 

GPIOA ->ODR = 0x12345678;

// 从PA口读数据 

uint32_t    PA_DataIn;

PA_DataIn = GPIOA ->IDR;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

btzhy

您的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值