STM32的GPIO控制寄存器开发

server/2025/3/14 16:38:29/

寄存器GPIO控制

寄存器地址在这里插入图片描述

寄存器地址计算

某个寄存器地址,由三个参数决定:1、总线基地址(BUS_BASE_ADDR);2,外设基于总线基地址的偏移量(PERIPH_OFFSET);3,寄存器相对外设基地址的偏移量(REG_OFFSET)。可以表示为:
寄存器地址 = BUS_BASE_ADDR + PERIPH_OFFSET + REG_OFFSET

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

相关寄存器

APB2外设时钟使能寄存器(RCC_APB2ENR)

  • 复位和时钟控制(RCC) 0x4002 1000 - 0x4002 13FF

  • 偏移地址:0x18 ;其地址为0x4002 1018

  • 复位值:0x0000 0000

在这里插入图片描述

端口配置低寄存器(GPIOx_CRL) (x=A…E)

控制GPIOx的0-7针脚

  • 偏移地址:0x00 复位值:0x4444 4444

在这里插入图片描述

端口配置高寄存器(GPIOx_CRH) (x=A…E)

控制GPIO的8-15针脚

  • 偏移地址:0x04 复位值:0x4444 4444

在这里插入图片描述

端口输入数据寄存器(GPIOx_IDR) (x=A…E)

  • 地址偏移:0x08 复位值:0x0000 XXXX

在这里插入图片描述

端口输出数据寄存器(GPIOx_ODR) (x=A…E)

  • 地址偏移:0Ch 复位值:0x0000 0000

在这里插入图片描述

端口位设置/清除寄存器(GPIOx_BSRR) (x=A…E)

  • 地址偏移:0x10 复位值:0x0000 0000

在这里插入图片描述

端口位清除寄存器(GPIOx_BRR) (x=A…E)

  • 地址偏移:0x14 复位值:0x0000 0000

在这里插入图片描述

端口配置锁定寄存器(GPIOx_LCKR) (x=A…E)

  • 地址偏移:0x18 复位值:0x0000 0000
  • 当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。

在这里插入图片描述

2.简单GPIO控制

每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。 根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。

  • 输入浮空
  • 输入上拉
  • 输入下拉
  • 模拟输入
  • 开漏输出
  • 推挽式输出
  • 推挽式复用功能
  • 开漏复用功能
  • 每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。
//#define GPIOB_CRH_addr  0X40010C04
//#define GPIOB_IDR_addr  0X40010C08
//#define GPIOB_ODR_addr  0X40010C0C
//#define GPIOB_BSRR_addr 0X40010C10
//#define GPIOB_BRR_addr  0X40010C14
//#define GPIOB_LCKR_addr 0X40010C18
//#define RCC_APB2ENR_addr    0X4002 1018  //偏移0x18//#define GPIOB_CRL       (*(unsigned int *)(0X40010C00))
//#define GPIOB_CRH       (*(unsigned int *)(0X40010C04))
//#define GPIOB_IDR       (*(unsigned int *)(0X40010C08))
//#define GPIOB_ODR       (*(unsigned int *)(0X40010C0C))
//#define GPIOB_BSRR      (*(unsigned int *)(0X40010C10))
//#define GPIOB_BRR       (*(unsigned int *)(0X40010C14))
//#define GPIOB_LCKR      (*(unsigned int *)(0X40010C18))
#define RCC_APB2ENR     (*(unsigned int *)(0X40021018))
#define GPIOB_BASE_addr  0X40010C00    typedef struct{volatile unsigned int CRL;volatile unsigned int CRH;volatile unsigned int IDR;volatile unsigned int ODR;volatile unsigned int BSRR;volatile unsigned int BRR;volatile unsigned int LCKR;
}GPIO;GPIO *GPIO_B=(GPIO*)(GPIOB_BASE_addr);
//由于结构体连续分配内存,并且GPIO配置寄存器也是连续的相隔4个字节,故寄存器地址能完整映射到结构体。int main()
{ RCC_APB2ENR=8;// GPIOB_CRL = 0XD00000;//00000000 10110000 00000000 0000000; // 配置PB5为复用推挽输出模式速度为50MHz//GPIOB_ODR = 0X10; // //GPIOB_ODR= 0; // GPIO_B->CRH=0X0011;GPIO_B->CRL=0Xd00000;//GPIO_B->ODR|=(1<<5);//低电平驱动LEDGPIO_B->ODR|=(1<<8);//高电平驱动有源蜂鸣器while(1);  }

http://www.ppmy.cn/server/9909.html

相关文章

ChatGPT在线网页版(与GPT Plus会员完全一致)

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

MongoDB的UTCDateTime如何使用

使用MongoDB的UTCDateTime类来存储当前的UTC日期和时间。UTCDateTime对象在MongoDB中表示一个日期&#xff0c;但是它不是PHP的DateTime类。如果你想把UTCDateTime对象格式化为可读的字符串需要先把UTCDateTime对象转换成PHP的DateTime类 方法 (new MongoDB\BSON\UTCDateTime…

设计模式之桥接模式

1、详细介绍 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与其实现部分分离&#xff0c;使它们可以独立变化。桥接模式通过引入抽象层和实现层的概念&#xff0c;允许用户在不改变抽象接口的前提下&#xff0c;动态地选择或替…

医学影像增强:空间域方法与频域方法等

医学影像图像增强是一项关键技术,旨在改善图像质量,以便更好地进行疾病诊断和评估。增强方法通常分为两大类:空间域方法和频域方法。 一、 空间域方法 空间域方法涉及直接对医学影像的像素值进行操作,以提高图像的视觉质量。以下是一些常用的空间域方法: 对比度调整:通过…

描述一下PHP与HTML和CSS的关系

描述一下PHP与HTML和CSS的关系 PHP、HTML和CSS在Web开发中各自扮演着不同的角色&#xff0c;它们之间的关系密切而互补&#xff0c;共同构建了一个完整且富有动态性的Web应用程序。下面我将详细阐述PHP与HTML和CSS之间的关系。 首先&#xff0c;HTML&#xff08;HyperText Ma…

个人网站的SEO优化系列——如何实现搜索引擎的收录

如果你自己做了一个网站&#xff0c;并且想让更多的人知道你的网站&#xff0c;那么无非就是两种途径 一、自己进行宣传&#xff0c;或者花钱宣传 二、使用搜索引擎的自然流量 而如果搜索引擎都没有收录你的站点&#xff0c;别说是自然流量&#xff0c;就算是使用特定语句【sit…

pyCharm导入pyspark中的sparkconf和sparkcontext错误

背景&#xff1a;学习黑马程序员python课程的pyspark实战部分时按照下图导入pysark包时发现sparkconf和sparkcontext无法导入和运行。 首先想到是不是在CMD窗口下载的pySpark路径及安装是否正确&#xff1f; 通过下图发现第三方库都安装正确&#xff0c;然后就考虑库的路径&a…

7.Prism框架之对话框服务

文章目录 一. 目标二. 技能介绍① 什么是Dialog?② Prism中Dialog的实现方式③ Dialog使用案例一 (修改器)④ Dialog使用案例2(异常显示窗口) 一. 目标 1. 什么是Dialog?2. 传统的Dialog如何实现?3. Prism中Dialog实现方式4. 使用Dialog实现一个异常信息弹出框 二. 技能介…