首页 > 其他分享 >位带操作理解

位带操作理解

时间:2023-11-20 10:13:30浏览次数:28  
标签:位带 32 ODR 别名 地址 理解 寄存器 操作

1.概念理解

位带操作实际就是通过将寄存器的一个位(bit)映射到某一个区域的字(32位)上,这些区域的字已经由官方设定好,我们通过对这些字的操作就能够实现对寄存器的某个位操作。图像如下
image

stm32一个字有4个字节共32个位,膨胀之后为在别名区为4*8=32个字。所以接下来要做的就是根据位带区地址找到位带别名区的字地址。

以GPIOF—ODR寄存器的bit9为例,该寄存器地址为0x4002 1414,相对GPIO偏移量为0x21414,膨胀为字后的别名区地址为0x2141448=0x428280,所以在位别名区从0x42428280开始的32个字区域均是ODR寄存器膨胀,由于4个字节组成一个字,对于bit0偏移为0,bit9就是9*4,也即是0x24,所以最终的地址计算公式如下:

Addr = 0x4200 0000+(A - 0x4000 0000)48 +bit*4

其中A是寄存器地址。0x4200 0000是外设位带别名区起始地址。

将SRAM和片上外设结合起来公式如下:
Addr = (addr&0xF000 0000)+0x200 0000+(addr&0x00FF FFFF)<<5+(bit<<2)

2.代码实现

找到ODR输出寄存器的地址,再找到对应位带别名区的地址,并定义一个带参函数如下:
image
代码:

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

其中对地址应该强制类型转换为指针,再对指针进行操作。
主函数控制代码如下:


int main(void)
{
	GPIO_LED_Config();
	while(1)
	{
    //实现灯的闪烁
		PBout(0) = 1;
		Delay(0xFFFFF);
		PBout(0) = 0;
		Delay(0xFFFFF);
	}
}
void Delay(uint32_t count)
{		
	for(;count !=0;count--);
}

值得一提的是,尽管一个位bit膨胀为位带别名区的 一个字,但是这个字仅仅最低位有效。这么操作是因为stm32系统总线是32位,这样处理效率更高。

标签:位带,32,ODR,别名,地址,理解,寄存器,操作
From: https://www.cnblogs.com/manchestercity/p/17843328.html

相关文章

  • 11.9 实现磁盘相关操作
    11.9.1遍历磁盘容量如下代码实现了在Windows系统中获取所有磁盘驱动器的信息。具体包括两个函数,一个用于获取驱动器类型,另一个用于获取驱动器空间信息。主函数则调用这两个函数来遍历所有逻辑驱动器并输出相应的信息。在输出驱动器空间信息时,会输出该驱动器的总大小、已用空间以......
  • 多核CPU条件下的并发和并行理解
    操作系统课本上的并发和并行并发​是指两个或多个事件在同一时间间隔内交替发生并行是指两个或多个事件在同一时刻发生并行编程中的并发和并行在接触并行编程之前,认为多线程是并发的一种,因为一个处理单元每次只能处理一个线程,因此多个线程也只是一个时间间隔内的交替执行而已......
  • 课程设计:任务理解与分工
    团队任务:1.小组讨论对课程设计任务的理解我们小组对于任务的理解为,为报文解析工具wireshark设计一个lua插件,该插件要能够协助wireshark进行加解密。2.进行任务的功能划分和分工我们将本次插件设计的任务划分成了四个部分,一是对任务整体的布置与解读,将任务中涉及到的内容进行解......
  • 基于Wireshark插件的国密标准检测工具的设计与实现——任务理解与分工
    任务分工:应用和数据部分不可否认性的实现对任务的理解以下是我对任务的理解:任务背景:任务涉及到对用户进行身份验证和签名验证,以确保用户的关键操作行为是合法和安全的。用户1的操作:步骤23:正确给出√×*,这似乎是用户1的关键操作行为的一部分,需要验证其签名的合法性。步骤24......
  • Docker开始收费了,开始转学podman【第一篇podman容器的安装和基本操作】
    podman什么是Podman?Podman是无守护程序容器引擎,用于在Linux系统上开发,管理和运行OCI容器。容器可以以root用户或无根模式运行。简而言之:`aliasdocker=podman`。Podman(PodManager)是一个功能齐全的容器引擎,它是一个简单的无守护工具。Podman提供了一个类似Docker-CLI的命令......
  • 【5.0】Python中级之文件操作
    【一】文本处理引入应用程序运行过程中产生的数据最先都是存放于内存中的若想永久保存下来,必须要保存于硬盘中。应用程序若想操作硬件必须通过操作系统而文件就是操作系统提供给应用程序来操作硬盘的虚拟概念用户或应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统......
  • 位操作运算符
    ......
  • c语言学习 - 逗号表达式及操作符
    条件操作符(三目操作数)exp1?exp2:exp3;若exp1的结果为真,则exp2是整个表达式的结果若exp1为假,则执行exp3作为整个表达式的结果赋值z++为先赋值再自增。++z为先自增再赋值。......
  • AJAX跨域代理机制实现原理解析------AJAX
    httpClient发送packagecom.bjpowernode.httpClient;importorg.apache.http.HttpEntity;importorg.apache.http.HttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.cl......
  • 什么是 Windows 操作系统的 DLL 文件
    .dll文件指的是动态链接库(DynamicLinkLibrary)文件。这些文件包含可被程序在运行时调用的代码和数据。它们是Windows操作系统中重要的组成部分,允许程序共享资源,提高效率并降低重复编码的需要。.dll文件允许程序模块化,以便多个应用程序可以共享它们,这样便于维护和更新。在本文中,我......