问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32单片机系列教程:直接访问寄存器的方法

创作时间:
作者:
@小白创作中心

STM32单片机系列教程:直接访问寄存器的方法

引用
CSDN
1.
https://m.blog.csdn.net/btzhy/article/details/145634136

本文将详细介绍STM32单片机直接访问寄存器的方法,这是开发STM32的必备技能。通过操作寄存器,可以实现对PA口的数据读写,掌握这一方法后,可以按相同的方式操作其他设备寄存器。

今天讲一下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 端口某位的复位控制
根据这些寄存器的偏移量,定义一个结构类型:
typedefstruct
{
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;

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号