stm32库中地址映射

摘要:分析stm32库中如何找到GPIOA寄存器的地址。

关键字:stm32;库;地址映射

一、预备知识

在编写ARM9裸机的程序时,读写某个寄存器可用如下代码实现:

例如,要读写UART_ULCON1寄存器的值,查找ARM9的用户手册就可已得到该寄存器地址。

#define UART_ULCON1 (volatile unsigned int *)(0x50004000)

写寄存器:

*UART_ULCON1 = 0X00FF;

读寄存器:

unsigned int temp;

temp = *UART_ULCON1;

二、stm32库中地址映射

在stm32用户手册中找不到绝对的寄存器地址,需要进行换算。例如要找GPIOA中GPIOA_CRL寄存器地址:

第一步:在stm32f10x_reference文档中可查找到GPIOx_CRL的偏移地址。注意对stm32芯片中所有GPIO口的GPIOx_CRL寄存器有相同的偏移。

第二步:只有偏移量不能找到GPIOA_CRL的地址。还需获得GPIOA的地址与GPIOx_CRL偏移量相加后,才可得到最终GPIOA_CRL的地址。

从上图中可以看出GPIOA挂接在APB2总线上

从图中可以看到GPIOA的基地址为 0X4001 0800

那么GPIOA_CRL的地址等于 GPIOA的基地址 加上 GPIOx_CRL偏移量。

下面分析stm32库中如何获取GPIOA_CRL寄存器地址:

stm32f10x.h (stm32f10x_stdperiph_lib_v3.5.0\libraries\cmsis\cm3\devicesupport\st\stm32f10x)

GPIOA基地址获取:

GPIOA基地址 = 外设基地址 + APB2总线基地址 + 0x0800

#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)

#define PERIPH_BASE           ((uint32_t)0x40000000)

各寄存器偏移量获取:

GPIOx_CRL偏移地址为 0x00

typedef struct

{

__IO uint32_t CRL;

__IO uint32_t CRH;

__IO uint32_t IDR;

__IO uint32_t ODR;

__IO uint32_t BSRR;

__IO uint32_t BRR;

__IO uint32_t LCKR;

} GPIO_TypeDef;

GPIOA_CRL寄存器地址 = GPIOA基地址 + GPIOx_CRL偏移地址

= 外设基地址 + APB2总线基地址 + 0x0800 + GPIOx_CRL偏移地址

= 0X4001 0800

时间: 2024-12-30 02:44:16

stm32库中地址映射的相关文章

STM32库中 __IO 修饰符(volatile修饰符)

STM32例子代码中会有像这样的代码 static __IO uint32_t TimingDelay; 这里边的__IO修饰符不好理解,单从字面可以看出是为IO相关,查其标准库可以得知这个__IO原来是在Core_cm3.h中被重定义,其实就是volatile,句子如下 /* IO definitions (access restrictions to peripheral registers) */ #ifdef __cplusplus #define   __I     volatile

关于STM32库中 __IO 修饰符(volatile修饰符,反复无常的意思)

STM32例子代码中会有像这样的代码 static __IO uint32_t TimingDelay;  这里边的__IO修饰符不好理解,单从字面可以看出是为IO相关,查其标准库可以得知这个__IO原来是在Core_cm3.h中被重定义,其实就是volatile,句子如下 /* IO definitions (access restrictions to peripheral registers) */ #ifdef __cplusplus #define   __I     volatile

STM32库中关于GPIO_PinRemapConfig函数的使用

对于初学习者来说为什么用到PB3和PB4时无法控制输出呢? 下面就这一问题进行分析讲解. 首先,STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能.有时我们为了充分利用MCU I/O口的资源,会把这些端口设置为普通I/O口.具体方法如下:在GPIO_Configuration(); // 配置使用的 GPIO 口: GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);// 改变指定管脚的映射 GPI

结构体在固件库中的应用

上次介绍了一般结构体的定义以及引用方法,那么接下来将对结构体在官方固件库是如何具体使用的做出简单说明. 结构体指针成员变量引用方法是通过“→”符号来实现,比如要访问student1结构体指针指向的结构体的成员变量name,那么方法是: stuednt1—>name; 如在STM32官方固件库中对端口使用模式结构体定义如下: typedef enum { GPIO_Mode_AIN = 0x0, //模拟输入模式 GPIO_Mode_IN_FLOATING = 0x04, //浮空输入模式 GPI

CAML获取SharePoint文档库中除文件夹外所有文档

方法一: ? 1 2 3 4 <QueryOptions>         <ViewAttributes Scope="Recursive" />     </QueryOptions> </query> 方法二: ? 1 2 3 4 5 <View Scope="RecursiveAll">     <Query>         <Where>...</Where>

MySQL生产库中添加修改表字段引起主从崩溃的问题总结

上周末和开发人员对线上库中的部分表的在线DDL和update,这过程中出现了一些意料之外的问题,现将过程.分析和解决方案在这里总结一下 一. 需求背景: 要在如下表中添加字段(modified_at)并且更改默认值 table_name { baby_compbaby_comp_statusbaby_usrbaby_ad_userbaby_campbaby_ordbaby_acc_eva } 每张表执行如下操作ALTER TABLE `$table_name` ADD COLUMN `modif

Boost库中shared_ptr(上)

1.共享性智能指针(shared_ptr) 引用计数型指针 shared_ptr是一个最像指针的"智能指针",是boost.smart_ptr库中最有价值,最重要,也是最有用的.  shared_ptr实现的是引用技术型的智能指针,可以被拷贝和赋值,在任意地方共享它,当没有代码使用(此时引用         计数为0)它才删除被动态分配的对象.shared_ptr也可以被安全的放到标准容器中: 2.怎么使用shared_ptr 举一个操作的例子: #include<iostrea

[C++11笔记001]修改通用库中的XDynamicArray,使它可以支持C++11的初始化列表和for循环

今天,有空翻了一下<C++Primer plus(第六版)>,看到里面有介绍新的for循环和初始化列表,但是我实现的动态数组XDynamicArray不支持这些新特性,没办法,只好进行改造了. 首先是for循环,如下面的样式 for(auto e:stList) { cout<<e<<endl; } 是于就各种google,和查找C++11的array的源代码,总结:就是提供一个标准的iterator和begin,end这两个方法,就可以了. 是于定义了一个iterat

maven无法下载私有库中的jar包

前两天同事遇到一个问题: 同一个工程,依赖私有库中的一个jar包,其他同事的项目都能成功下载,但只有他的项目无法正常下载依赖,最后虽然找到原因了,但还是在这里备注一下: 1.maven依赖管理 maven通过GAV坐标对项目依赖进行管理,如果有公司内部有私有库存在的话,依赖查找的顺序是这样的:本地仓库-->私有仓库-->中央仓库(这是没有配置mirror拦截的情况):如果在setting中配置了mirror,且mirrorOf配置为*,url指向私有库路径,则查找顺序是这样的本地仓库-->