GPIO的使用--存储系统与位带操作理解

目录

存储系统与位带操作

1、对GPIO的操作函数

2、计算机对地址的管理

3、板子地址

4、什么是位带操作

5、位带地址好处


存储系统与位带操作

1、对GPIO的操作函数

//方案一
GPIO_WriteBit(GPIOF,GPIO_Pin_9,0);//方案二
GPIO_Write(GPIOF,0x0000);//方案三
GPIOF->ODR = 0x0000;//寄存器操作//方案四
*((volatile uint32_t*)(0X40021414))=0x0000;//方案五
*((volatile uint32_t*)(0x42000000 + 0x21414*32 + 9*4)) =1;			//方案六
PFout(9)=0;	

其中

GPIO_Write(GPIOF,0x0600);

GPIO_Write()本质上是对寄存器的操控:即

GPIOF ->ODR = 0x0600;

而寄存器本质上是一块存贮空间,可以理解上面代码是对于一块地址写入 0x0600.

*((volatile uint32_t*)(0X40021414)) = 0x0600;

但是对于STM32f407系列的板子,还有一种写法:

*((volatile uint32_t*)(0x42000000 + 0x21414*32 + 9*4)) = 1;
*((volatile uint32_t*)(0x42000000 + 0x21414*32 + 10*4)) = 1;

上面这个地址能实现对于LED的控制,是硬件工程师做了特殊处理,该解决方案 叫做“位带操作”。要想理解这个中方案,需要对计算机地址访问有着深刻理解。

2、计算机对地址的管理

从C语言角度理解内存:拿到地址,找到地址中的数据并返回

从计算组成理解的存储结构示意图

假设cpu中有3根地址线,那么它进过译码器后组合出来(扩展)的结果表示8根线(再多的都表示不了),进而控制8个内存单元。每一个内存单元即就是一个字符型(char)。

内存申请和释放的最小单元, 实际申请的是地址资源,而一个地址刚好对应一个字符存储空间。因此字符空间 (char)是内存分配的最小单元。【bool型实际不存在,它是变相的char】

内存不可以无限扩展,受制于机器位数,管理不了那么多的内存单元。32位机器 最多管理2^32个地址单元。64位机器可以管理2^64个地址单元。 

3、板子地址

为什么 ((volatile uint32_t)(0X40021414)) = 0x0600,是可以控制LED灯?

 首先我们机器是32位的地址线。这些地址线提供了2的32次方的地址。这些地址 我们机器没有用完,有剩余的。我们机器上的用在了这些地方:程序存储器, 数据存储器,IO端口和寄存器

存储器:内存。

IO端口:端口地址。网络通信里面要选端口。USB插口。CPU使用IO来通信。

寄存器:这个和内存使用起来很像,但是具体物理实现和计算机所处位置不同。

stm32给与GPIOF组的寄存器分配的地址如下

从地址:0X4002 1400 - 0X4002 17FF.总共有0x3FF+1的空间给与了GPIOF组使用。我们之前所有的操纵函数本质上都是操作了F组的寄存器的地址。给与这个地址写入0或者1。而寄存器的数据决定了引脚上的电压为高/低

操作函数GPIO_WriteBit();也是在操作寄存器,给寄存器写入0或1,完成灯的控制。

 GPIOF组的地址如下

地址跳转步骤

GPIOF组地址为:GPIO_BASE = 0x4000 0000 + 0x0002 0000 + 0x1400 = 0x4002 1400

输出寄存器:ODR寄存器,偏移地址 = 0x14。

GPIOF->ODR = GPIOF_BASE +0x14 = 0x40021414 ,给与这根地址线-->0x40021414,写数据。相当于配置ODR寄存器,相当于调用 GPIO的操控函数。

这几个位对应的是:

 PF15,PF14,PF13,PF12,PF11,PF10,PF9,PF8,PF7,PF6,PF5,PF4,PF3,PF2,PF1,PF0,每一个位对应F组16个引脚的每一个,故此数据是 0XFFFF--0X0000。

4、什么是位带操作

了解更多点击这里-->位带(位段)操作<--

我的通俗理解:一块内存可以用两个地址来访问,一个是内存地址,一个是硬件工程师在寄存器内接的,该地址与原来PF9的输出寄存器的地址(GPIOF->ODR = 0x40021414)地位平等。

上图:红色线路是原有的地址,属于这个寄存器的,因此可以访问整个寄存器。 绿色线路是位带区域,硬件接上去的,这个地址仅仅属于这个寄存器的一个特定的位。

那么这块区域的操作有两种路线:

红色路线1:GPIOF->ODR = 0XFFFF FFFF。我们计算好第9的数据位的数据,赋 值给ODR寄存器。 

绿色路线2:获取单独分给ODR的第9根的数据位的地址,并给与这根地址赋值 1/0.

位带操作可以让我们更好地理解底层存储,但也知识理解一下就好了,现有一个简化位带操作的封装函数,BitBand.h,可以简化书写

#ifndef __BITBAND_H__
#define __BITBAND_H__#define BITBAND(addr,bitnum)       0x42000000+ (addr & 0xFFFFF)*32 + bitnum *4
#define MEM_ADDR(addr)             *((volatile uint32_t*)(addr))
#define BIT_ADDR(addr,bitnum)      MEM_ADDR(BITBAND(addr,bitnum))#define GPIOA_IDR_ADDR             (GPIOA_BASE + 0x10)
#define GPIOA_ODR_ADDR             (GPIOA_BASE + 0x14)#define GPIOB_IDR_ADDR             (GPIOB_BASE + 0x10)
#define GPIOB_ODR_ADDR             (GPIOB_BASE + 0x14)#define GPIOC_IDR_ADDR             (GPIOC_BASE + 0x10)
#define GPIOC_ODR_ADDR             (GPIOC_BASE + 0x14)#define GPIOD_IDR_ADDR             (GPIOD_BASE + 0x10)
#define GPIOD_ODR_ADDR             (GPIOD_BASE + 0x14)#define GPIOE_IDR_ADDR             (GPIOE_BASE + 0x10)
#define GPIOE_ODR_ADDR             (GPIOE_BASE + 0x14)#define GPIOF_IDR_ADDR             (GPIOF_BASE + 0x10)
#define GPIOF_ODR_ADDR             (GPIOF_BASE + 0x14)#define GPIOG_IDR_ADDR             (GPIOG_BASE + 0x10)
#define GPIOG_ODR_ADDR             (GPIOG_BASE + 0x14)#define GPIOH_IDR_ADDR             (GPIOH_BASE + 0x10)
#define GPIOH_ODR_ADDR             (GPIOH_BASE + 0x14)#define GPIOI_IDR_ADDR             (GPIOI_BASE + 0x10)
#define GPIOI_ODR_ADDR             (GPIOI_BASE + 0x14)#define PAout(n)       BIT_ADDR(GPIOA_ODR_ADDR,n)  
#define PAin(n)        BIT_ADDR(GPIOA_IDR_ADDR,n) #define PBout(n)       BIT_ADDR(GPIOB_ODR_ADDR,n)  
#define PBin(n)        BIT_ADDR(GPIOB_IDR_ADDR,n)#define PCout(n)       BIT_ADDR(GPIOC_ODR_ADDR,n)  
#define PCin(n)        BIT_ADDR(GPIOC_IDR_ADDR,n)#define PDout(n)       BIT_ADDR(GPIOD_ODR_ADDR,n)  
#define PDin(n)        BIT_ADDR(GPIOD_IDR_ADDR,n)#define PEout(n)       BIT_ADDR(GPIOE_ODR_ADDR,n)  
#define PEin(n)        BIT_ADDR(GPIOE_IDR_ADDR,n)#define PFout(n)       BIT_ADDR(GPIOF_ODR_ADDR,n)  
#define PFin(n)        BIT_ADDR(GPIOF_IDR_ADDR,n)#define PGout(n)       BIT_ADDR(GPIOG_ODR_ADDR,n)  
#define PGin(n)        BIT_ADDR(GPIOG_IDR_ADDR,n)#define PHout(n)       BIT_ADDR(GPIOH_ODR_ADDR,n)  
#define PHin(n)        BIT_ADDR(GPIOH_IDR_ADDR,n)#define PIout(n)       BIT_ADDR(GPIOI_ODR_ADDR,n)  
#define PIin(n)        BIT_ADDR(GPIOI_IDR_ADDR,n)#endif

封装前

 封装后

5、位带地址好处

1.提升效率:比特位的读写,操作效率提升。

2.代码简洁:仅仅对于某一个位进行控制,无需考虑取值判断。(0x0200) 硬件把GPIO寄存器映射为位带区域,可以提升IO操控和通信的速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开放式耳机怎么选?干货分享! 2023好评度超高开放式耳机推荐!

在现代社会中&#xff0c;人们对于音乐和通话的需求越来越高。传统的耳机虽然能够提供良好的音质&#xff0c;但使用过程中存在一些问题&#xff0c;例如长时间佩戴会引起耳朵疲劳和隔绝周围环境的声音。为了解决这些问题&#xff0c;开放式耳机应运而生&#xff0c;成为了一种…

【springboot原理篇】Bean的加载方式,面试必看

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、上古时代原始方式&#xff1a; &#x1f4d5;XML文件 ~~bean定义 &#x1f440;演示获取bean&#xff1a; ❌缺点&#xff1a; &#x1f4d5;注解方式&#xff1a; ~~component ~~指定扫描路径&#…

vm net 方式 静态ip配置访问主机IP和外网

1、win 11 安装vm&#xff0c;镜像文件 F:\software\VMwork\CentOS-7-x86_64-Everything-1804.iso 2、配置网络 net 方式 3、右击网络--》属性---》更改适配器设置--》vmnet8 属性 如果没有vm1、vm8 虚拟机编辑---》虚拟机网络编辑器-->还原默认设置 注意&#xff1a;这…

接口验签规则

一、验签的背景 在网络发展快速的过程中&#xff0c;总是会忽略接口数据安全问题&#xff0c;进行验签则能够在一定程度上能够防刷&#xff0c;数据篡改。 二、什么是加签验签 加签验签&#xff0c; 发送消息方&#xff0c;对消息加签名&#xff1b; 接受消息方&#xff0…

使用Notepad++编辑器,安装AnalysePlugin搜索插件

概述 是一款非常有特色的编辑器&#xff0c;Notepad是开源软件&#xff0c;Notepad中文版可以免费使用。 操作步骤&#xff1a; 1、在工具栏 ->“插件”选项。 2、勾选AnalysePlugin选项&#xff0c;点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装…

Java 设计模式——备忘录模式

目录 1.概述2.结构3.案例实现3.1.“白箱”备忘录模式3.2.”黑箱”备忘录模式 4.优缺点5.使用场景 1.概述 &#xff08;1&#xff09;备忘录模式 (Memento Pattern) 又称为快照模式&#xff0c;是一种行为型设计模式&#xff0c;它提供了一种保存和恢复对象状态的机制。备忘录模…

涓流充电计时电路芯片D1302,具有双管脚主电源和备用电源,可编程涓流充 电器VCC1,还有 31 字节的暂存器等功能

D1302 涓流充电计时电路包含一个实时时钟 / 日历和 31 字节的静 态RAM &#xff0c;通过简单的串行接口与微处理器通讯。这个实时时钟 / 日历 提供年月日、时分秒信息&#xff0c;对于少于31 天的月份月末会自动调整&#xff0c; 还有闰年校正。由于有一个 AM/PM 指示器&a…

天翼云:“百万IOPS”助推政企上云

随着数字化转型的加速&#xff0c;越来越多的企业选择了业务上云。众所周知&#xff0c;不论是政企关键/核心业务中的大型数据库、NoSQL、AI训练&#xff0c;还是互联网业务中的游戏、渲染等场景&#xff0c;对数据读写IOPS和时延有极高的要求。作为全球领先的云服务商&#xf…

分享77个菜单导航JS特效,总有一款适合您

分享77个菜单导航JS特效&#xff0c;总有一款适合您 77个菜单导航JS特效下载 链接&#xff1a;https://pan.baidu.com/s/1sfT9ONLH4ocliA1C7Z5xbQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0…

75Ω视频放大驱动芯片 D1671,2.8~5.5V 内 置 SAG端 子 6dB放 大 器 电 路,应用于手持设备中

D1671 是 一 块 带 4 级 低 通 滤 波 的 单 通 道 视 频 放 大 电 路 &#xff0c; 可 在 3V 或 5V的 低 电 压 下 工 作 。 该 电 路 用 在 有 TV 影 象 输 出 功 能 的 产 品 上 面 &#xff0c; 比 如 机 顶 盒 &#xff0c;监 控 摄 象 头 &#xff0c;DVD &#xf…

骨传导耳机音量大了有害吗?骨传导能保护听力吗?

无论是传统耳机还是骨传导耳机&#xff0c;只要使用音量过大&#xff0c;都会对有一定的损伤&#xff0c;然而由于骨传导耳机的传声原理和佩戴方式比较特殊&#xff0c;所以对人体的损伤比较小&#xff0c;想要知道骨传导耳机能否保护听力&#xff0c;就要先了解骨传导耳机的传…

【Axure教程】用中继器制作多选树

“多选树”可能指的是一种用户界面元素&#xff0c;用于展示层级结构并允许用户选择多个节点。这在软件应用程序中常用于设置、文件浏览器等场景。 Axure里面虽然自带了一个树元件&#xff0c;但是并没有多选的功能&#xff0c;所以今天就教大家如何用中继器制作一个多选树的基…

acwing-Linux学习笔记

acwing-Linux课上的笔记 acwing-Linux网址 文章目录 1.1常用文件管理命令homework作业测评命令 2.1 简单的介绍tmux与vimvimhomeworktmux教程vim教程homework中的一些操作 3 shell语法概论注释变量默认变量数组expr命令read命令echo命令printf命令test命令与判断符号[]逻辑运算…

Vue3集成ThreeJS实现3D效果,threejs+Vite+Vue3+TypeScript 实战课程【一篇文章精通系列】

Vue3集成ThreeJS实现3D效果&#xff0c;threejsViteVue3TypeScript 实战课程【一篇文章精通系列】 项目简介一、项目初始化1、添加一些依赖项 二、创建3D【基础搭建】1、绘制板子&#xff0c;立方体&#xff0c;球体2、材质和光照3、材质和光照和动画4、性能监控5、交互控制6、…

【有机化学(药学类)】醛和酮3

第一题 思考 格氏试剂与不饱和醛酮的亲核加成反应&#xff0c;主要发生1,2加成&#xff08;注意&#xff1a;氧原子算是1&#xff09; 第二题 思考 叶立德反应&#xff0c;看到磷原子就应该想到这个&#xff01; 第三题 思考 涉及到两个反应&#xff1a; 亲核加成反应&…

5. Jetson Orin Nano CUDA 配置

5. Jetson Orin Nano CUDA 配置 1&#xff1a;安装Jtop jtop安装主要有以下三个步骤&#xff1a; 安装pip3 我们需要使用pip3来安装jtop&#xff0c;所以先安装pip3 sudo apt install python3-pip安装jtop sudo -H pip3 install -U jetson-stats运行jtop服务 sudo -H pip3 in…

SAAS版专业级条码标签打印软件解决方案

一。新一代互联网打印模式 saas云标签打印软件支持条码、二维码、表格等模式组合打印&#xff0c;支持批量打印标签、表格模拟数据 、在线预览二维码打印 、在线条码生成打印标签 ● 条码/二维码/标签打印&#xff0c;支持表格批量打印标签&#xff1b; ● 条码/二维码尺寸…

每天一点python——day85

#每天一点Python——85 #python常见的异常类型&#xff1a; #如图&#xff1a; #①数学运算异常【由于会报错&#xff0c;我直接全部注释掉了】 print(10/0) 输出&#xff1a;ZeroDivisionError: division by zero#②索引错误list1[1,2,3,4] print(list1[5])#找索引为4的元素 输…

CUDA简介——同步

1. 引言 前序博客&#xff1a; CUDA简介——基本概念CUDA简介——编程模式CUDA简介——For循环并行化CUDA简介——Grid和Block内Thread索引CUDA简介——CUDA内存模式 本文重点关注Thread同步和Barriers。 Threads并行执行&#xff0c;可能存在如下问题&#xff1a; 1&#…

数学建模-基于集成学习的共享单车异常检测的研究

基于集成学习的共享单车异常检测的研究 整体求解过程概述(摘要) 近年来&#xff0c;共享单车的快速发展在方便了人们出行的同时&#xff0c;也对城市交通产生了一定的负面影响&#xff0c;其主要原因为单车资源配置的不合理。本文通过建立单车租赁数量的预测模型和异常检测模型…