首页 > 其他分享 >03.寄存器

03.寄存器

时间:2022-10-10 09:35:26浏览次数:58  
标签:03 GPIOB 地址 BASE 寄存器 GPIO define

寄存器

STMF10xx系统框架图

存储器映射

序号 用途 地址范围
Block 0 Code 0x0000 0000 ~ 0x1FFF FFFF(512MB)
Block 1 SRAM 0x2000 0000 ~ 0x3FFF FFFF(512MB)
Block 2 片上外设 0x4000 0000 ~ 0x5FFF FFFF(512MB)
Block 3 FSMC 的 bank1 ~ bank2 0x6000 0000 ~ 0x7FFF FFFF(512MB)
Block 4 FSMC 的 bank3 ~ bank4 0x8000 0000 ~ 0x9FFF FFFF(512MB)
Block 5 FSMC 寄存器 0xA000 0000 ~ 0xCFFF FFFF(512MB)
Block 6 没有使用 0xD000 0000 ~ 0xDFFF FFFF(512MB)
Block 7 Cortex-M3 内部外设 0xE000 0000 ~ 0xFFFF FFFF(512MB)

总线基地址

总线名称 总线基地址 相对外设基地址的偏移
APB1(低速) 0x4000 0000 0x0
APB2(高速) 0x4001 0000 0x0001 0000
AHB(高速) 0x4001 8000 0x0001 8000

GPIO 端口置位/复位寄存器说明

偏移地址
偏移地址是指本②寄存器相对于这个外设的基地址的偏移。本寄存器的偏移地址是 0x18,从参考手册中我们可以查到 GPIOA 外设的基地址为 0x4001 0800 ,我们就可以算出 GPIOA的这个 GPIOA_BSRR 寄存器的地址为:0x4001 0800+0x18 ;同理,由于 GPIOB 的外设基地址为 0x4001 0C00,可算出 GPIOB_BSRR 寄存器的地址为:0x4001 0C00+0x18 。其他GPIO 端口以此类推即可。

C语言对寄存器封装示例

/* 外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)

/* 总线基地址 */
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000)

/* GPIO 外设基地址 */
/#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)

/* 寄存器基地址,以 GPIOB 为例 */
#define GPIOB_CRL (GPIOB_BASE+0x00)
#define GPIOB_CRH (GPIOB_BASE+0x04)
#define GPIOB_IDR (GPIOB_BASE+0x08)
#define GPIOB_ODR (GPIOB_BASE+0x0C)
#define GPIOB_BSRR (GPIOB_BASE+0x10)
#define GPIOB_BRR (GPIOB_BASE+0x14)
#define GPIOB_LCKR (GPIOB_BASE+0x18)

/* 使用指针控制寄存器 */

/* 控制 GPIOB 引脚 0 输出低电平(BSRR 寄存器的 BR0 置 1) */
*(unsigned int *)GPIOB_BSRR = (0x01<<(16+0));

/* 控制 GPIOB 引脚 0 输出高电平(BSRR 寄存器的 BS0 置 1) */
*(unsigned int *)GPIOB_BSRR = 0x01<<0;

unsigned int temp;

/* 使用结构体对GPIO寄存器组进行封装 */

/* 读取 GPIOB 端口所有引脚的电平(读 IDR 寄存器) */
temp = *(unsigned int *)GPIOB_IDR;

typedef unsigned int uint32_t; /*无符号 32 位变量 /
typedef unsigned short int uint16_t; /
无符号 16 位变量 */

/* GPIO 寄存器列表 /
typedef struct {
uint32_t CRL; /
GPIO 端口配置低寄存器 地址偏移: 0x00 /
uint32_t CRH; /
GPIO 端口配置高寄存器 地址偏移: 0x04 /
uint32_t IDR; /
GPIO 数据输入寄存器 地址偏移: 0x08 /
uint32_t ODR; /
GPIO 数据输出寄存器 地址偏移: 0x0C /
uint32_t BSRR; /
GPIO 位设置/清除寄存器 地址偏移: 0x10 /
uint32_t BRR; /
GPIO 端口位清除寄存器 地址偏移: 0x14 /
uint16_t LCKR; /
GPIO 端口配置锁定寄存器 地址偏移: 0x18 */
} GPIO_TypeDef;

/* 使用 GPIO_TypeDef 把地址强制转换成指针 */

#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)

/* 使用定义好的宏直接访问 */

/* 访问 GPIOB 端口的寄存器 */
GPIOB->BSRR = 0xFFFF; //通过指针访问并修改 GPIOB_BSRR 寄存器
GPIOB->CRL = 0xFFFF; //修改 GPIOB_CRL 寄存器
GPIOB->ODR =0xFFFF; //修改 GPIOB_ODR 寄存器

uint32_t temp;
temp = GPIOB->IDR; //读取 GPIOB_IDR 寄存器的值到变量 temp 中

/* 访问 GPIOA 端口的寄存器 */
GPIOA->BSRR = 0xFFFF;
GPIOA->CRL = 0xFFFF;
GPIOA->ODR =0xFFFF;

uint32_t temp;
temp = GPIOA->IDR; //读取 GPIOA_IDR 寄存器的值到变量 temp 中

标签:03,GPIOB,地址,BASE,寄存器,GPIO,define
From: https://www.cnblogs.com/xuanchi/p/16774497.html

相关文章

  • 【做题笔记】洛谷P5584 【SWTR-01】Sunny's Crystals
    ProblemP5584【SWTR-01】Sunny'sCrystals题目大意:给你一个长度为\(n\)的序列,每次可以删掉下标为\(2\)的非负整数次幂的数,删掉一个数后他后面的数会往前补,问删掉所......
  • ERP项目笔记—Day03
    关于通用抽取思路:(dao层) 关于抽取思想解读,首先要有一个通用的接口(右上角红色框里的内容),在接口里边已经定义了通用的方法,比方说是分页查询的方法,CRUD的方法,等。这些方法之......
  • 03@shell数据类型及变量值的操作总结
    文章目录​​基本数据类型与值操作​​​​一、数据类型介绍​​​​1、什么是数据​​​​2、编程语言划分(shell的划分)​​​​二、基本数据类型​​​​1、数字​​​​......
  • 03@Dockerfile构建镜像
    文章目录​​Dockerfile构建镜像​​​​一、Dockerfile的简述​​​​二、Dockerfile使用参数(参数编写为大写)​​​​1、FROM​​​​2、MAINTAINER​​​​3、RUN​​​......
  • 03-02 platfrom of LED
    8.platform驱动分离1.总线设备驱动模型这一部分的主要内容可参考上述博客1.1platformdev和drv匹配机制首先匹配device中的driver_override与drv中name是否匹配......
  • Bob's Problem - trees, greedy
    Bobwasintrouble.Herubbedthemagicringonhisfinger,andyoucameoutoftheground.Youaregivenanundirectedgraph GG whichcontains nn vertices......
  • 02.st-link 与 stm32 f103 c8t6 对接
    st-link与stm32f103c8t6对接1.接线对接说明:st-linkV2stm323.3V3.3VSWDIOSWIOSWCLKSWCLKGNDGND如图:安装驱动链接:https://pan.baidu......
  • Mysql 插入中文错误:Incorrect string value: '\xE7\xA8\x8B\xE5\xBA\x8F...' fo
     今天mysql遇到了一点问题。 首先我说一下,mysql安装的话默认编码方式是拉丁文。不是 UTF-8. 这个错误原因就是因为编码格式不一致造成的。  简单粗暴一点,重新建一个......
  • Python学习实验报告03——序列
    实验要求:完成课本实例部分及实战部分实验内容:Part1实例:实例01:创建一个文件命名为tips,导入日期时间类,定义一个包含七条励志文字的列表,获取当前星期作为索引输出每日一......
  • Kerberos 认证错误 :Can't get Kerberos realm
    原始代码为:org.apache.hadoop.security.UserGroupInformation.setConfiguration(conf)出现错误:Can'tgetKerberosrealm 原因:程序读取不到krb5.conf 解决办法......