STM32学习笔记(四) —— 位段别名区的使用

news2024/9/25 1:19:54

STM32F103RCT6有两个位段区 (SRAM 最低1M空间和片内外设存储区最低1M空间), 这两个区域都有各自的别名区,在别名区中每个字会映射到位段区的一个位,所以在别名区修改一个字相当于修改位段区中对应的一个位

SSS3.001

映射公式( 别名区中的字与位段区中的位对应关系 ):

位段区某个位在别名区的地址 = 别名区起始地址 + (目标位所在的字节,在位段中的序号 x 32)+(目标位的位置 x 4)

别名区起始地址:

SRAM:0x22000000
Peripheral:0x42000000
目标位所在的字节,在位段中的序号:位段中的某个位,所在的那个字节,在位段中的序号
目标位的位置:位段中的某个位,在所在的那个字节中的位置 (0 - 31)

比较绕,看个例子就行了,

对于SRAM别名区地址,比如要计算,位段区地址为0x20004F01处,的字节中的第2位,对应的别名区的地址,

addr_sram = 0x22000000 + (0x4F01 x 32) + (2 x 4)

对 addr_sram 地址的读写操作就是相当于对 SRAM 中地址 0x20004F01 字节的第2位进行读写

对于外设别名区地址,比如要计算,位段区地址为 0x4001080C处,的字节中的第1位,对应的别名区地址,

addr_peripheral = 0x42000000 + (0x1080C x 32) + (1 x 4)

对 addr_peripheral 地址的读写操作就是相当于对 Peripheral 中地址 0x4001080C 字节的第1位进行读写

下面通过软件编程来进行验证:

1° 在 SRAM 位段区定义一个全局变量test_value,在他的别名区为此变量赋值为0x04(将此别名区地址值设置为0x01, 相当于将地址 0x20004F01 所在字节第2位置1, 即 test_value 值设置为0x04);
2° 读取 test_value 值,如果test_value值为0x04,点亮LED灯,否则熄灭LED灯。

4.代码编写

/* 将全局变量 test_value 定义到 0x20004F01地址上 */
__IO uint8_t test_value __attribute__ ((at(0x20004F01)));

  /* 在while循环之前添加以下初始化代码 */
  /* 初始化test_value值为0 */
  test_value = 0x00;

  printf("before, test_value = 0x%x\r\n", test_value);

  /*
  * SRAM 基址 0x20000000; SRAM 别名区基址 0x22000000
  * 别名区地址=别名区起始地址+(目标位所在字节在位段中的序号x32)+(目标位的位置x4)
  * 将此别名区地址值设置为0x01, 相当于将地址 0x20004F01 所在字节第2位置1, 即 test_value 值设置为0x04
  */
  *((__IO uint32_t *)((uint32_t)0x22000000 + ((uint32_t)0x4F01 << 5) + ((uint32_t)2 << 2))) = 0x01;

  printf("after, test_value = 0x%x\r\n", test_value);

  RCC->APB2ENR |=  ((uint16_t)0x01 << 3 ); //开启GPIOB时钟
  /* 配置PB1为通用推挽输出模式,输出速率最大2MHz */
  GPIOB->CRL &= ~((uint32_t)0x03 << 4); //将 MODE1[1:0] 清0
  GPIOB->CRL |=  ((uint32_t)0x02 << 4); //将 MODE1[1:0] 配置为10 输出模式,最大速率2MHz
  GPIOB->CRL &= ~((uint32_t)0x03 << 6); //将 CNF1[1:0] 清0
  GPIOB->CRL |=  ((uint32_t)0x00 << 6); //将 CNF1[1:0] 配置为00 通用推挽输出模式

  /* PB1引脚输出1(高电平),默认熄灭LED */
  GPIOB->BSRR = ((uint32_t)0x01 << 1); //这里也可以使用ODR寄存器

  if(0x04 == test_value) { //内存中的值为设置的值0x04
	/*
	* 外设基址 0x40000000; 外设别名区基址 0x42000000
	* 别名区地址=别名区起始地址+(目标位所在字节在位段中的序号x32)+(目标位的位置x4)
	* GPIOB的基地址是0x4001 0C00,ODR寄存器的偏移地址是0x0C,GPIOB_ODR地址就是0x4001 0C0C
	* 那【目标位所在字节在位段中的序号】就是0x10C0C
	* PB1是是由ODR寄存器第1位,所以目【标位的位置】就是1
	* 将此别名区地址值设置为0, 相当于将 GPIOB->ODR 寄存器第1位清0, 即PB1输出低电平
	*/
	*((__IO uint32_t *)((uint32_t)0x42000000 + ((uint32_t)0x10C0C << 5) + ((uint32_t)1 << 2))) = 0;
  }
  else if(0x00 == test_value) {
    /* PB1输出高电平 */
	*((__IO uint32_t *)((uint32_t)0x42000000 + ((uint32_t)0x10C0C << 5) + ((uint32_t)1 << 2))) = 1;
  }
  else {
  }

  while(1);

将程序下载后可以打开串口调试助手查看赋值前后的test_value值,同时LED会点亮。

test_value

本例程代码可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取

以上是通过开发板进行实际验证的,下面使用软件仿真,

我们首先进入调试界面( 前面章节有提到,所以本篇以及后续章节都不再重复提及 ),
打开串口

在这里插入图片描述

运行程序,就可以在串口显示界面查看到输出的数据
在这里插入图片描述

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

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

相关文章

软硬兼施:亚信安慧AntDB创造更多可能性

亚信安慧AntDB是一种极具适配能力的数据库系统&#xff0c;它不仅在软件方面拥有出色的适应性&#xff0c;还能与国产硬件紧密配合&#xff0c;实现高效稳定的运行。无论是在上游还是下游领域&#xff0c;亚信安慧AntDB都展现出了卓越的适配程度。 在软件方面&#xff0c;亚信安…

使用ffmpeg madiamtx制作一个rtsp源

有很多人在跑rtsp解码的demo的时候, 苦于找不到一个可以拉流的源, 这里说一个简单的方法. 使用mediamtx, 加ffmpeg加mp4文件方式, 模拟一个rtsp的源. 基本架构就是这样. 在PC上, 这里说的PC可以是远程的服务器, 也可以是你的开发用的windows, 都行. 把mediamtx, 在pc上跑起来 …

如何使用Python+Flask搭建本地Web站点并结合内网穿透公网访问?

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务&#xff0c;本期教程…

【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数

作者推荐 【动态规划】【字符串】【行程码】1531. 压缩字符串 涉及知识点 数论 数学 分类讨论 LeetCoce1611. 使整数变为 0 的最少操作次数 给你一个整数 n&#xff0c;你需要重复执行多次下述操作将其转换为 0 &#xff1a; 翻转 n 的二进制表示中最右侧位&#xff08;第…

多线程c++

目录 1.join和detach区别 2.lock_guard和unique_lock 3.原子操作 4.条件变量condition_variable 5.future 和 promise 1.join和detach区别 ①不使用join和detach #include <iostream> #include <thread> #include <windows.h>using namespace std;v…

Tensorflow2.0笔记 - tensor的padding和tile

本笔记记录tensor的填充和tile操作&#xff0c;对应tf.pad和tf.tile import tensorflow as tf import numpy as nptf.__version__#pad做填充 # tf.pad( tensor,paddings, modeCONSTANT,nameNone) #1维tensor填充 tensor tf.random.uniform([5], maxval10, dtypetf.int32) pri…

知识点积累系列(四)Kubernetes篇【持续更新】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 知识点积累 系列文章的第四篇&#xff0c;记录日常学习中遇到的 Kubernetes 相关的知识点 1.Kubernetes琐碎知识点 1.1.为什么要有annotations annotation中除了能够记录一些额外信息&#xff0c;还可以解决k…

3d模型上的材质怎么删除---模大狮模型网

在大多数3D软件中&#xff0c;可以通过以下步骤来删除3D模型上的材质&#xff1a; 选择要删除材质的模型&#xff1a;首先&#xff0c;从场景中选择包含目标材质的模型。可以使用选择工具或按名称查找模型。 进入编辑模式&#xff1a;将模型切换到编辑模式。这通常需要选择相应…

【Docker】WSL(Windows Subsystem for Linux)常见命令解释说明以及简单使用

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

设计模式学习笔记02(小滴课堂)

江湖传言里的设计模式-单例设计模式 单例设计模式中的懒汉方式实战 这种方式是线程不安全的&#xff0c;多个线程同时调用会创建多个对象。 所以我们就要给它加锁: 我们去测试一下&#xff1a; 因为构造函数已经私有化&#xff0c;所以不能直接用new的方式去创建对象。 现在我…

多线程事务如何回滚?

背景介绍 1&#xff0c;最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一些其他修改操作&#xff0c;然后在执行插入操作&#xff0c;由于插入数据可能会很多&#xff0c;用到多线程去拆分数据并行处理来提高响应时间&#xff0c;如果有一个线程执行失败&am…

Stable Diffusion web UI 安装、启动脚本、常见问题、插件(linux)

Stable Diffusion本身是一个模型&#xff0c;对于大多数想试试的人来说&#xff0c;使用这个web ui版本最合适 建议先看完再动手&#xff0c;虽然不难但是有门槛&#xff08;主要要解决网络问题&#xff09;&#xff0c;如果深入需要会python 如果只是想试试的&#xff0c;建议…

市面上的小型办公室都是哪些人在租?

市面上的小型办公室&#xff0c;又称服务式办公室&#xff0c;是一种将传统的写字楼进行精装修&#xff0c;分割成若干个独立的小型办公空间&#xff0c;提供给不同的租户的新型办公模式。那么&#xff0c;市面上的小型办公室都是哪些人在租&#xff1f;本文将从租户的特点和需…

Linux服务器配置与管理(第四次实验)

实验目的及具体要求 目的 1.了解网络配置之文件 2.掌握网络常用命令 3.掌握ssh远程连接 任务 1.修改主机名为TX 2.查看系统的网络接口信息 3.在路由表中添加一条路由 4.删除上一步添加的路由 5.查看网络中所有的TCP端口连接信息 6.X SHELL远程链接Centos系统 7.在X …

35岁老兵,从金山被裁员到创业

35岁&#xff0c;对于许多人而言&#xff0c;是事业中一个重要的节点。对我而言&#xff0c;这一年成为了我生命中的转折点。2023年8月份的一个上午&#xff0c;突然被领导叫到小黑屋&#xff0c;告知我被裁员了。起初&#xff0c;这个决定对我来说是一个巨大的打击&#xff0c…

榜单!AR-HUD进入高增速周期,TOP10本土供应商争夺市场

高工智能汽车研究院数据显示&#xff0c;2023年1-9月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用车前装标配W/AR HUD交付149.54万辆&#xff0c;同比增长45.86%。 其中&#xff0c;W-HUD仍是主流。而同期&#xff0c;AR-HUD的前装标配搭载量超过10万辆&#x…

Mysql-ReadView + MVCC-RR 与 RC

实验准备 创建脚本 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(16) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,age int(11) NULL DEFAULT NULL,addr varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,PRIMARY …

希尔伯特变换的在信号解调时的示例

1.希尔伯特变换的应用场景 希尔伯特变换&#xff0c;在数学上的含义是清晰的。它是一个数字移相器&#xff0c;可以把通过它的任何一个信号相移-90度。这个数学工具在信号解调时&#xff0c;会有非常有用的特性出现。可以看示例&#xff1a; 解释一下&#xff1a; 1.最上面的…

transformer | transformer的输入部分input coding

文章目录 transformer的输入部分input codingBPEBPE所解决的问题——OOV PE&#xff08;Position Encoding&#xff09;位置编码 transformer的输入部分input coding transformer的输入部分input codingBPEPE BPE BPE是指一种词分类算法。 起初&#xff0c;会将每个单词都拆分…

旧物回收小程序开发:创新与可持续发展的交汇点

随着社会的发展和人们生活水平的提高&#xff0c;物品的更新换代速度越来越快&#xff0c;这导致了大量的旧物被闲置或丢弃。为了解决这个问题&#xff0c;旧物回收成为了重要的环保行动。而随着移动互联网的普及&#xff0c;旧物回收小程序的开发也成为了新的趋势。本文将探讨…