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

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] 清0GPIOB->CRL |=  ((uint32_t)0x02 << 4); //将 MODE1[1:0] 配置为10 输出模式,最大速率2MHzGPIOB->CRL &= ~((uint32_t)0x03 << 6); //将 CNF1[1:0] 清0GPIOB->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.mzph.cn/news/657195.shtml

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

相关文章

实现vue3响应式系统核心-watch

简介 今天我们来看看 watch 的实现。 watch本质就是观测一个响应式数据&#xff0c;当数据发生变化时通知并执行相应的回调函数。实际上&#xff0c;watch的实现本质上就是利用了 effect 以及 options.scheduler选项。 代码地址&#xff1a; https://github.com/SuYxh/share-…

flask基于python的个人理财备忘录记账提醒系统vue

在当今高度发达的信息中&#xff0c;信息管理改革已成为一种更加广泛和全面的趋势。 “备忘记账系统”是基于Mysql数据库&#xff0c;在python程序设计的基础上实现的。为确保中国经济的持续发展&#xff0c;信息时代日益更新&#xff0c;蓬勃发展。同时&#xff0c;随着信息社…

【智能家居入门2】(MQTT协议、微信小程序、STM32、ONENET云平台)

此篇智能家居入门与前两篇类似&#xff0c;但是是使用MQTT协议接入ONENET云平台&#xff0c;实现微信小程序与下位机的通信&#xff0c;这里相较于使用http协议的那两篇博客&#xff0c;在主程序中添加了独立看门狗防止程序卡死和服务器掉线问题。后续还有使用MQTT协议连接MQTT…

输入和输出

按字符输入输出 按字符输出putchar&#xff08;&#xff09; 格式 #include <stdio.h> int putchar(int c); 功能&#xff1a;向终端输出一个字符 参数&#xff1a;要输出的字符的ASCII码值 返回值&#xff1a; 成功&#xff0c;返回输出字符的ASCII码值 失败&#xff…

基于springboot汽车租赁系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。本项…

Missing or invalid credentials.(Git push报错解决方案)

前言 本文主要讲解git push后报错Missing or invalid credentials的解决方案。这里针对的是windows的。 编程环境&#xff1a;VsCode 问题原因 问题翻译起来就是 凭据缺失或无效。这里我们解决方案是取消vscode里面默认的控制终端git凭据来解决,具体方案如下. 解决方案 1…

3D效果图加树进去太卡,渲染太慢怎么办?

周末的时候&#xff0c;有个朋友私信来问&#xff1a;3dmax模型加树进去打开时特别的卡&#xff0c;是怎么回事。 不知道有没有朋友遇上这么个情况。 3dmax加树建议就用代理&#xff0c;这样相比于直接加而言&#xff0c;会流畅许多。 在3D效果图中&#xff0c;“树代理”是…

萝卜视频源码前后端带视频演示

萝卜影视源码前端是用JAVA开发的全原生APP源码&#xff0c;后端用的是二次开发的苹果CMS&#xff0c;支持局域网投屏&#xff0c;视频软解硬解&#xff0c;播放器自带弹幕功能。支持解析官方视频&#xff0c;支持M3U8&#xff0c;MP4。 开屏广告&#xff0c;全局广告&#xff0…

GitHub国内打不开(解决办法有效)

最近国内访问github.com经常打不开&#xff0c;无法访问。 github网站打不开的解决方法 1.打开网站http://tool.chinaz.com/dns/ &#xff0c;在A类型的查询中输入 github.com&#xff0c;找出最快的IP地址。 2.修改hosts文件。 在hosts文件中添加&#xff1a; # localhost n…

从0开始搭建若依微服务项目 RuoYi-Cloud(保姆式教程完结)

文章接上一章&#xff1a; 从0开始搭建若依微服务项目 RuoYi-Cloud&#xff08;保姆式教程 一&#xff09;-CSDN博客 四. 项目配置与启动 当上面环境全部准备好之后&#xff0c;接下来就是项目配置。需要将项目相关配置修改成当前相关环境。 数据库配置 新建数据库&#xff…

element ui组件 el-date-picker设置default-time的默认时间

default-time &#xff1a;选择日期后的默认时间值。 如未指定则默认时间值为 00:00:00 默认值修改 <el-form-item label"计划开始时间" style"width: 100%;" prop"planStartTime"><el-date-picker v-model"formData.planStart…

TortoiseSVN各版本汉化包下载

首先进入下载版本列表 1.下载地址&#xff1a;https://sourceforge.net/projects/tortoisesvn/files ​ 2.选择自己版本进入​ 3.选择Language Packs进入&#xff0c;选择对应语言包下载。 ​ 4.在TortoiseSVN根目录下点击安装即可。 ​

解密数据清洗,SQL中的数据分析

大家好&#xff0c;数据库表中的数据经常会很杂乱。数据可能包含缺失值、重复记录、异常值、不一致的数据输入等&#xff0c;在使用SQL进行分析之前清洗数据是非常重要的。 当学习SQL时&#xff0c;可以随意地创建数据库表&#xff0c;更改它们&#xff0c;根据需要更新和删除…

canvas测量文字长度(measureText)

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

数据结构——栈和队列(C语言)

栈种常见的数据结构&#xff0c;它用来解决一些数据类型的问题&#xff0c;那么好&#xff0c;我来带着大家来学习一下栈 文章目录 栈对栈的认识栈的模拟实现栈的练习方法一方法二 栈 对栈的认识 栈&#xff08;stack&#xff09;是限定只能在表的一端进行插入删除操作的线性…

SpringCloud LoadBalancer

SpringCloud LoadBalancer 1.什么是LoadBalancer LoadBalancer&#xff08;负载均衡器&#xff09;是一种网络设备或软件机制&#xff0c;用于分发传入的网络流量负载请求到多个后端目标服务器上&#xff0c;从而实现系统资源的均衡利用和提高系统的可用性和性能。 负载均衡器…

【Tomcat与网络4】Tomcat的连接器设计

目录 1 如何设计一个灵活可靠的连接器 2 主要组件介绍 在上一篇&#xff0c;我们介绍了Tomcat提供服务的整体结构&#xff0c;本文我们一起来看一下Tomcat的连接器的设计。 在前面我们提到Tomcat主要完成两个功能&#xff1a; 处理 Socket 连接&#xff0c;负责网络字节流与…

wifi配网(esp8266和esp32)-http get和post方式

wifi配网(esp8266和esp32)-http get和post方式 通过http get和post方式来给esp芯片配网 步骤&#xff1a; 开机&#xff0c;指示灯亮起后(需要灯闪烁3下后)&#xff0c;需在3s内&#xff08;超过3s则会正常启动&#xff09;&#xff0c;按一下按键&#xff08;注&#xff1a;切…

Springboot做查询数据库某个表的数据时,后台一切正常前台显示不了数据

当我在用springboot做项目的时候查询整个表的数据或者条件查询的时候发现我的后台功能一切正常但是我的前台界面就是显示不了数据&#xff0c;这个问题解决也很简单&#xff0c;就是需要我们平时多加注意&#xff0c;不要漏代码&#xff01;&#xff01;&#xff01; Builder …

Visual Studio 2022 打开“程序包管理器控制台”失败

Visual Studio 2022 打开“程序包管理器控制台”失败 昨天下午&#xff0c;正在用Visual studio 2022写代码&#xff0c;当使用EF core 做数据迁移时&#xff0c;需要用到“程序包管理器控制台”&#xff0c;打开失败&#xff0c;前一秒还好好的&#xff0c;怎么突然就用不了了…