[课程-014位带操作——GPIO的输入和输出控制]

发布者:BlissfulHeart最新更新时间:2025-02-25 来源: elecfans关键字:位带操作  GPIO  采样数据 手机看文章 扫描二维码
随时随地手机看文章

一、概念性

什么是位带操作

位带操作就是可以单独对一个比特位读和写。在51单片机中,通过sbit关键字来实现位定义。


对于STM32位带区和位带别名区的理解

STM32里没有这样的关键字,但可以通过位带别名区来实现。


想要控制这些bit,就可以通过访问和控制位带别名区的一个32bit的字(因为stm32单片机以32bit为单位操作最为高效),来控制位带区内的任意一位。


一个位带区的位对应位带别名区的四个字节(32bit)。


SRAM存储代码的区域。


二 、位带区和位带别名区的地址转换

- 地址关系

image.png?imageView2/2/w/1000

(一) 外设位带区和位带别名区

AliasAddr = 0x4200 0000 + (Addr-0x4000 0000)*8*4 + n*4

公式的解释


(Addr-0x4000 0000)得到的是相差几个字节


*8是因为一个字节8个位


*4是因为一个位在位带别名区内要膨胀成4个位


+ n*4 是因为某一个位号在位带别名区内要膨胀成4个位


(二) SRAM位带区和SRAM位带别名区

AliasAddr = 0x2200 0000 + (Addr-0x2000 0000)*8*4 + n*4

(三) 外设和SRAM统一转化处理公式

((addr & 0xF000 0000)+0X0200 0000 + ((addr&0x00FF FFFF)<<5)+(bitnum<<2))

addr 要操作的位所在寄存器地址


bit num 寄存器的第几位


三、实操

(一) 代码分析

#include 'stm32f10x.h'#include 'bsp_led.h'#include 'bsp_key.h'#define GPIOB_ODR_Addr      (GPIOB_BASE+0x0C)#define PBout(n)            *(unsigned int *)((GPIOB_ODR_Addr & 0xF0000000)+0X02000000+((GPIOB_ODR_Addr&0x00FFFFFF)<<5)+(n<<2))int main(void){

    LED_GPIO_Config(LED_R_GPIO_PIN);

    while(1)

    {

        PBout(5) = 1;

        //GPIO_ResetBits(LED_GPIO_PORT,LED_R_GPIO_PIN);

        Delay(0xFFFFF);

        

        PBout(5) = 0;

        //GPIO_SetBits(LED_GPIO_PORT,LED_R_GPIO_PIN);

        Delay(0xFFFFF);

    }}

位带公式


((addr & 0xF000 0000)+0X0200 0000 + ((addr&0x00FF FFFF)<<5)+(bitnum<<2))

位带宏定义


#define GPIOB_ODR_Addr      (GPIOB_BASE+0x0C)#define PBout(n)            *(unsigned int *)((GPIOB_ODR_Addr & 0xF0000000)+0X02000000+((GPIOB_ODR_Addr&0x00FFFFFF)<<5)+(n<<2))

位带公式,经编译后,运算得到的值只是一个数,芯片无法识别为地址。


要想识别为地址,需要将这个数强制类型转换为地址,加(unsigned int *)


经过转换后,要用一个指针指向此地址,需要加``*`


变量n在PBout(n)作为一个未知数的作用,#define很强啊。


综上,实现位带操作,需要两个宏定义


一是某一外设地址=基地址+偏移地址


二是将Pxout(n)、Pxint(n)进行宏定义



关键字:位带操作  GPIO  采样数据 引用地址:[课程-014位带操作——GPIO的输入和输出控制]

上一篇:GPIO8种模式的原理
下一篇:单片机位操作详解

推荐阅读最新更新时间:2026-03-25 11:10

[课程-014操作——GPIO输入输出控制]
一、概念性 什么是位带操作 位带操作就是可以单独对一个比特位读和写。在51单片机中,通过sbit关键字来实现位定义。 对于STM32位带区和位带别名区的理解 STM32里没有这样的关键字,但可以通过位带别名区来实现。 想要控制这些bit,就可以通过访问和控制位带别名区的一个32bit的字(因为stm32单片机以32bit为单位操作最为高效),来控制位带区内的任意一位。 一个位带区的位对应位带别名区的四个字节(32bit)。 SRAM存储代码的区域。 二 、位带区和位带别名区的地址转换 - 地址关系 (一) 外设位带区和位带别名区 AliasAddr = 0x4200 0000 + (Addr-0x4000
[单片机]
[课程-014<font color='red'>位</font>带<font color='red'>操作</font>——<font color='red'>GPIO</font>的<font color='red'>输入</font><font color='red'>和</font><font color='red'>输出</font><font color='red'>控制</font>]
stm32 GPIO原理: 输入输出控制
pre name= code class= html #include stm32f10x.h int main(void) { //1.PA.0 工作在推揽输出,50MHZ; PA.8输入 浮空输入 GPIOA- CRL=0X03; GPIOA- CRH=0X04; //2. PA.0 输出 = PA.8输入 while(1){ if((GPIOA- IDR&0X0100)==0X0100) GPIOA- ODR=0X01; else GPIOA- ODR=0x00; } return 0; }
[单片机]
线性稳压器的电压输入输出控制——第二部分:工作原理参考设计
摘要 本文是电压输入至输出控制(VIOC)应用于低压差稳压器(LDO)的两部分系列文章中的第二部分。本文以第一部分介绍的基本概念为基础,深入探讨了VIOC系统设计,并阐述了最新一代LDO如何保持恒定的输入输出电压差,从而实现关键性能优势,例如更高的电源电压抑制比(PSRR)、优化的功耗和稳健的故障保护。本文强调通过参考设计和便捷的评估方法实现VIOC的简便性,包括LTspice®仿真和演示硬件。文章还探讨了如何在负电压拓扑中集成VIOC,并回顾了早期的VIOC实现方案,包括采用分立元件和传统LDO架构的实现方案。VIOC通过简化开关稳压器与LDO之间的协作,提升了电路性能,并为现代电源管理系统提供了灵活多样的解决方案。 引
[电源管理]
线性稳压器的电压<font color='red'>输入</font>至<font color='red'>输出</font><font color='red'>控制</font>——第二部分:工作原理<font color='red'>和</font>参考设计
LT3758 - 高输入电压、升压、反激式、SEPIC 输出控制
     描述   LT ® 3758 是一款宽输入电压范围、电流模式、DC/DC 控制器,该器件能够产生正输出或负输出电压。它可以被配置为一个升压、反激式、SEPIC 或负输出转换器。LT3758 从一个内部 7.2V 稳压电源来驱动一个低端外部 N 沟道功率 MOSFET。固定频率、电流模式架构在一个很宽的电源电压和输出电压范围内实现了稳定的操作。   LT3758 的工作频率可利用一个外部电阻器来设定 (可设置范围为 100kHz 至 1MHz),并能够采用 SYNC 引脚来使其同步至一个外部时钟。由于具有一个 5.5V 的最小工作电源电压和一个低停机静态电流 ( 1μA),因而使 LT3758 成为电池供电式系统的
[电源管理]
LT3758 - 高<font color='red'>输入</font>电压、升压、反激式、SEPIC <font color='red'>和</font>负<font color='red'>输出</font><font color='red'>控制</font>器
stm32:操作
/*位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB), 位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF; 对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容; 所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访 问位带区对应的比特位。 */ //-----位带操作宏定义 //功能:将位带区地址addr 的 bitnum 位 转换为对应 位带识别区的地址 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((add
[单片机]
DMA实现采样数据的直接搬运存储
尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了。 找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的操作,保证自己对各部分设置的理解。 我这里用了3路的ADC通道,1路外部变阻器输入,另外两路是内部的温度采样和Vrefint,这样就能组成连续的采样,来测试多通道ADC自动扫描了,ADC分规则转换和注入转换,其实规则转换就是按照既定的设定来顺序转换,而注入转换就是可以在这顺序队列中插队一样,能够提前转换了。 初始化设置://PC0 FOR ANAGLE SAMPLE static void Protect_ClkInit(void)
[单片机]
GD32 ADC规则组多通道采样数据发生错位?
我们知道,使用ADC规则组(常规组)多通道采样时,必须要配合DMA使用,但有的小伙伴遇到这种应用下数据错位的情况,比如预设的转换顺序是通道0- 通道1- 通道2,但定义的数据buffer中的采样值却是通道1- 通道2- 通道0,那这是为什么呢? 出现这种情况的一个可能原因是——ADC先使能再去配置DMA。我们来看下面的时序: 如果先配置并使能ADC,当触发信号来临,ADC开始转换,若ADC转换到通道1的时候,DMA才配置并使能,那么DMA是不会搬运通道0的数据的,而是当通道1的转换结束后,DMA才开始搬运第一个数据到buffer ,所以buffer中的数据顺序就变成了数据1- 数据2- 数据0。 我们再来看下先配置DMA再配
[单片机]
GD32 ADC规则组多通道<font color='red'>采样</font>,<font color='red'>数据</font>发生错位?
什么是非均匀数据采样?哪种非均匀数据采样方法更适合你?
在数据分析和机器学习领域,我们常常需要处理非均匀数据。非均匀数据是指具有不平衡分布或样本数量不均等的数据集。为了准确建模和预测,我们需要对这些非均匀数据进行重采样。本文将详细介绍什么是非均匀数据重采样以及如何应用不同的方法来解决这一问题。 一、什么是非均匀数据重采样? 非均匀数据重采样是一种数据处理技术,用于解决数据集中存在的类别不平衡或样本数量不均等的问题。在非均匀数据中,某些类别的样本数量很少,而其他类别的样本数量很多。这种不平衡会导致建模和预测过程中的偏差,影响结果的准确性。 非均匀数据重采样的目标是通过增加少数类别的样本数量或减少多数类别的样本数量,使得数据集更加平衡。通过重采样,我们可以在保持数据分布特征的
[嵌入式]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved