历史上的今天

今天是:2024年09月01日(星期日)

正在发生

2021年09月01日 | STM32—位带操作

发布者:Serendipity66 来源: eefocus关键字:STM32  位带操作  32位 手机看文章 扫描二维码
随时随地手机看文章

STM32中的位带操作: 名字为位带操作,实际上是对位的操作,位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见。 51 单片机中通过关键字 sbit 来实现位定义, STM32 没有这样的关键字,而是通过访问位带别名区来实现。STM32 的全部寄存器都可以通过访问位带别名区的方式来达到访问原始寄存器比特位的效果,这比 51 单片机强大很多。因为 51 单片机里面并不是所有的寄存器都是可以比特位操作,有些寄存器还是得字节操作,比如 SBUF。


51单片机中的位操作:

51单片机中可以对寄存器实现单个位的操作,靠的就是关键字sbit,如

sbit led=P1^0; led=1;就可实现对P1.0位置1的效果。


为什么STM32不推崇直接进行位操作?

本人认为STM32是32位MCU,一次处理32位数据,所以一次只处理一位的数据未必大材小用了,除非特殊情况,否则都以32位处理。


如何处理STM32中要对某一位进行操作时的情况?

要知道STM32中采用库函数编程,所以有很多的对位操作的任务都用具体的函数来完成,而这些函数都已经做好了我们只需要知道怎么用就行。但我们仍然可以自己实现位操作,这种神操作就是位带操作 。


位带区与位带区别名:

在 STM32 中,有两个地方实现了位带,一个是 SRAM 区的最低 1MB 空间,令一个是外设区最低 1MB 空间。这两个 1MB 的空间除了可以像正常的 RAM 一样操作外,他们还有自己的位带别名区,位带别名区把这 1MB 的空间的每一个位膨胀成32 位 (要知道 STM32 的系统总线是 32 位的,按照 4 个字节访问的时候是最快的,所以膨胀成 4 个字节来访问是最高效的。),当访问位带别名区的这些字时,就可以达到访问位带区某个比特位的目的。


位带区就是就是可以进行位带操作的寄存器的映射地址。


位带区别名可以理解为将位带区每一个位都膨胀32倍(用一个字节代表一个位,以便于32位MCU操作)后的地址。


如何实现位带操作?

要进行位带操作需要知道被操作的位的地址,因为SRAM和外设中都可以位带操作,所以形式上可以将位带操作归纳为俩个公式。


对于位带区的某个比特,记它所在字节的地址为 A,位序号为 n(0<=n<=7),则其在位带区别名地址为:


外设:AliasAddr= =0x42000000+ (A-0x40000000)*8*4 +n*4

SRAM:AliasAddr= =0x22000000+ (A-0x20000000)*8*4 +n*4


用外设解释公式:0X42000000 是外设位带别名区的起始地址, 0x40000000 是外设位带区的起始地址,(A-0x40000000)表示该比特前面有多少个字节,一个字节有 8 位,所以8,一个位膨胀后是 4 个字节,所以4, n 表示该比特在 A 地址的序号,因为一个位经过膨胀后是四个字节,所以也*4。

当然,也可以将俩个公式合二为一:


 // 把“位带地址+位序号”转换成别名地址的宏

AliasAdd = (addr & 0xF0000000)+0x02000000+((addr &0x00FFFFFF)<<5)+(bitnum<<2)


知晓了位带区别名的地址,然后将此地址转换为指针类型就可以通过位带操作对原始的为进行操作。

附上野火的位带操作代码:


#include "stm32f10x.h"

#include "./led/bsp_led.h"


#define PCout(n) (*(unsigned int*)(((GPIOC_BASE+0x0c) & 0xF0000000)+0x02000000+(((GPIOC_BASE+0x0c) &0x000FFFFF)<<5)+(n<<2)))

#define PBout(n) (*(unsigned int*)(((GPIOB_BASE+0x0c) & 0xF0000000)+0x02000000+(((GPIOB_BASE+0x0c) &0x000FFFFF)<<5)+(n<<2)))


void delay(uint32_t count)

{

for(; count!=0; count--);

}


int main(void)

{

LED_GPIO_Config();  //LED初始化函数

while(1)

{

PCout(2) = 1;

//GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);

delay(0xfffff);

PCout(2) = 0;

//GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);

delay(0xfffff);

PCout(3) = 1;

//GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);

delay(0xfffff);

PCout(3) = 0;

//GPIO_ResetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);

delay(0xfffff);

}


代码简述:用宏定义的方法来操作GPIOC中的ODR寄存器和IDR寄存器中的某一位来实现led灯的亮灭


#define PCout(n) (*(unsigned int*)(((GPIOC_BASE+0x0c) & 0xF0000000)+0x02000000+(((GPIOC_BASE+0x0c) &0x000FFFFF)<<5)+(n<<2)))


关键字:STM32  位带操作  32位 引用地址:STM32—位带操作

上一篇:利用ST-LINK配合ST-LINK Utility 将bin文件下载到STM32的FLASH中
下一篇:STM32—重定向printf和getchar函数到串口

推荐阅读

最近移植dw1000的程序,把stm32f105版本移植到103版本上去。(1)发现两者的区别主要在于时钟上,具体请参考stm32 datasheet: 将始终改掉之后,SPI就可以运行stm32f103上了。(2)PA15和PB3默认是用于JLINK的,需要启用复用时钟,代码如下: RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA ,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,...
根据美国国家公路交通安全管理局(NHTSA)调查显示,在 2017 年约有 37,000 人在美国公路上发生车祸而丧生,其中有 47% 的人没有系上安全带。有鉴于此,Honda 与安全气囊供应商 Autoliv 合作开发了新的前乘客座安全气囊,可以在不同角度发生的撞击中降低颈部与脑部受伤的机率,提升乘客安全。新安全气囊由三个部分组成:一个中央气囊和两个向外突...
新一代人工智能技术是以高性能计算、大数据以及机器学习、深度学习三大技术为支撑的综合性技术, 高性能计算为人工智能提供了强大的计算能力,大数据为人工智能提供了丰富的训练样本, 机器学习和深度学习等为人工智能提供了更好的学习模型及算法,三者合力推动了人工智能技术的重大进步。本期将介绍人工智能在储能系统方面的应用。 在电网的发展中,储...
目标本次实验的目的是研究简单的NPN发射极跟随器,有时也被称为共集电极配置。材料 ADALM2000主动学习模块 无焊面包板 跳线 一个2.2 kΩ电阻(RL) 一个小信号NPN晶体管(Q1采用2N3904)说明面包板连接如图2所示。任意波形发生器W1的输出连接至Q1的基极端...

史海拾趣

问答坊 | AI 解惑

软件测试原理

目前在网上收集软件测试累资料,发现了一本好书,比较系统,推荐给大家:  《软件测试原理与实践》 这里只有部分资料提供给大家,莫怪我哦!建议购买此书,或者将此书电子档搞来分享,不过可能性比较小,该书2009年才出版发行,因此还的花点 ...…

查看全部问答∨

【转】不起眼的设计失误一

今天写两个电路设计失误,第一个是由于电流增益不够引起的,该电路是参考别的设计者引发的,看了之后可以了解一些知识。 第一个失误的主要原因是,设计者错误估算了R1的大小。其设计的值太大,导致Ib太小。 这里把等效的模型转换成如下: 以上的 ...…

查看全部问答∨

关于Sata硬盘识别的问题

各位大虾,小弟我现在在测试一个demo板,插上sata硬盘后,发现没有任何反应,更别说在dev下有相应的设备节点了,现在想问下各位这是什么情况?(注:我已按照说明插入了相应的sdk,且sata硬盘上电后可以转)…

查看全部问答∨

有人对SmsReceiveAllMessagesFromSIM了解的吗?

我去网上搜了一下,结果出来的东东都是MOBILE安全方面的东西. 有没有对这了函数了解的人啊,能不能讲解一下,帮忙里个头出来. 其实就是想知道,这个函数是不是把SIM卡上的SMS移到MOBILE设备上,如果是的话MOBILE会在什么时候调用这个函数. 谢谢!…

查看全部问答∨

无锡企业高薪诚聘ARM硬件软件工程师

硬件工程师: 职位要求:                  1.熟悉ARM,等硬件的体系结构                  2有1年以上的基于ARM的 ...…

查看全部问答∨

搬运小车 机械手部分

本帖最后由 paulhyde 于 2014-9-15 09:03 编辑 求智能搬运小车的机械设计部分!  …

查看全部问答∨

有没有人出闲置的ARM9开发板

        想弄块ARM9的开发板学习一下,理论看了一段时间,想实践了。有闲置的朋友看能不能转移个。        最好方便在笔记本上调试的。        ...…

查看全部问答∨

关于达林顿管和功率管得区别,与选型使用

不知道达林顿管和功率管得使用有什么区别。 在网上看了一些东西。 觉得还是没搞清楚。 求高手赐教…

查看全部问答∨

电子大赛A题做完的同学请分享一下经验

本帖最后由 paulhyde 于 2014-9-15 03:52 编辑 电子大赛A题做完的同学请分享一下经验吧! 希望大家都能互相帮组,互相学习!  …

查看全部问答∨

MSP430 G2553定时器问题,小白求教!!!

刚到手一块G2553芯片,datasheet中,显示定时器有Timer0_A3,Timer1_A3,在用户手册上只有TA,TB做了说明,想问下,2553中的两个定时器和TA,TB的区别是一样的吗?可以选定不同的时钟源嘛,比如一个是SMCLK,一个选择ACKL?小白求教大神,跪拜………

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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