首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

STM32 中 BIT_BAND(位段位带)和别名区使用入门(转载)

这两个区中的地址除了可以像普通的RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。 每个比特膨胀成一个32 位的字,就是把 1M 扩展为 32M 。...1MB)  0x4000 0000‐0x400F FFFF(片上外设区中的最低1MB) 对 SRAM 位带区的某个比特,记该比特所在字节的地址为A,位序号为 n (0别名区的地址为...(BITBAND( (u32)&CRCValue,23))==1)  { } 四、Cortex-M3中关于位段的定义 Cortex-M3 存储器映像包括两个位段(bit-band)区。...映射公式映射 公式给出别名区中的每个字是如何对应位带区的相应位的,公式如下: bit_word_offset = (byte_offset x 32) + (bit_number × 4)  bit_word_addr...= bit_band_base + bit_word_offset 其中:  bit_word_offset是目标位在存取器位段区中的位置  bit_word_addr 是别名存储器区中字的地址,它映射到某个目标位

2.3K90

STM32使用的存储器格式是( )_STM32最小系统

MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 ; 就是这样把P1口的第三个脚(BIT2)置0或置1了。 而现在STM32的位段、位带别名区就为了实现这样的功能。...:32MB别名区首地址; byte_offset:1MB位段区偏移量,即为bit-band 区中包含目标位的字节的编号; bit_number:位段中目标位的位位置(0-7); 注意:别名字的位[...举个例子(通过别名区访问地址): 1、想操作SRAM中Bit Band区地址为 0x2000 0018字节的第2位 计算别名区对应子地址:0x2200 0000 +(18*32)+(2*4) = 0x2200...0248 所以,对0x2200 0248地址的操作,就是对0x2000 0018字节的第2位进行操作; 2、想操作Peripherals中Bit Band区地址为0x4000 0021字节的第7位...(可能是一个功能寄存器); 计算别名区对应子地址:0x4200 0000+(21*32)+(7*4)=0x4200 02BC 所以,对0x4200 02BC的操作,就是对0x4000 0021字节的第

63220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    位带操作

    也就是说把1bit膨胀为32bit的字来操作(位带操作就是用一个地址代表一个比特,正常来说一个地址代表的是32bit,一次性操作的也是32bit)。...的8个bit举例说明位带区和别名区的关系 位带区 别名区 0x4000 0000 bit1 → 0x4000 0000 0x4000 0000 bit2 → 0x4000 0004 ···...→ ··· 0x4000 0000 bit8 → 0x4000 001C 通过表格可以看到,位带区的一个bit对应别名区的1个字即32bit,位带区每移动一个bit,别名区移动一个字。...因为位带操作是用32bit来操作1bit,而每一个地址代表了8bit,所以别名区地址每次移动(32 / 8)。这就是通过别名区把位带区的1个bit膨胀为32bit。...别名区地址的求解公式如下 别名区地址 = 别名区基址 + ((位带区地址 - 位带区基址)* 8 + bit位) * 4 通过一段代码实例来深入理解 #define BITBAND(addr, bitnum

    9010

    Cortex m33_STM32F4

    Cortex-M3 Bit-Banding 1. 概述 CM3的存储器系统支持所谓的“位带”(bit-band)操作。 通过它,实现了对单一bit的原子操作。...位带操作仅适用于一些特殊的存储器区域中。 从汇编角度看: 与传统方法的比较: 在位带区中,每个比特都映射到别名地址区的一个字——这是个只有 LSB才有效的字。...当跳转依据是某个位时,以前必须这样做: 读取整个寄存器 掩蔽不需要的位 比较并跳转 现在只需: 从位带别名区读取状态位 比较并跳转 位带操作还有一个重要的好处是在多任务中,用于实现共享资源在任务间的...在 C语言中使用位带操作 //把“位带地址+位序号”转换成别名地址的宏 #define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x20000000 +...(DEVICE_REG0) = MEM_ADDR(DEVICE_REG0) | 0x2; //传统做法 MEM_ADDR(BITBAND(DEVICE_REG0, 1)) = 0x1; //使用位带别名地址

    35650

    cortex-m3权威指南_core M3

    大家好,又见面了,我是你们的朋友全栈君。 Cortex-M3 Bit-Banding 1. 概述 CM3的存储器系统支持所谓的“位带”(bit-band)操作。...从汇编角度看: 与传统方法的比较: 在位带区中,每个比特都映射到别名地址区的一个字——这是个只有 LSB才有效的字。...当跳转依据是某个位时,以前必须这样做: 读取整个寄存器 掩蔽不需要的位 比较并跳转 现在只需: 从位带别名区读取状态位 比较并跳转 位带操作还有一个重要的好处是在多任务中,用于实现共享资源在任务间的...其它数据长度上的位带操作 位带操作并不只限于以字为单位的传送。亦可以按半字和字节为单位传送。例如,可以使用 LDRB/STRB来以字节为长度单位去访问位带别名区,同理可用于 LDRH/STRH。...在 C语言中使用位带操作 //把“位带地址+位序号”转换成别名地址的宏 #define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x20000000 +

    95330

    STM32 结构

    STM32 总线结构 总线(Bus)是各种信号线的集合,是嵌入式系统中各布件之间传输数据信息、地址信息和控制信息的公共通道。 与总线相关的主要参数有总线宽度、总线频率和总线带宽。...总线宽度是指总线能同时传输的数据位数, 如8位、32位、64位;总线频率是指总线的工作速度,频率越高,速度越快;总线带宽用来描述总线传输数据的快慢,总线带宽=总线宽度x总线频率/8,单位为MB/s。...ARM Cortex-M3系列的处理器,采用存储器与I/O设备(外设)统一编址的方式,将部分存储器地址范围用于外设,这种通过存储器地址访问外设的方式,称为存储器地址映射。...这些外设寄存器由芯片厂商设计,与存储器统一编址,常用C语言的指针来表示外设寄存器地址,实现对外设寄存器的访问和操作。 在嵌入式系统中,除了外设寄存器,还有一类叫CPU内部寄存器。...而内部寄存器在实际开发中接触会比较少,后面汇编点灯实验会涉及部分相关知识,本小结简单介绍下内部寄存器。 ARM Cortex-M3微处理器的内部寄存器,又分为普通寄存器和特殊功能寄存器。

    1.1K20

    Linux笔记(22)| 设备树初探

    来看几个例子: 第一种(u32): interrupts = 17 0xc>; interrupt是属性,后面用表示是arrays of cells,也就是说里面的每一个数都是32位的。...如果要表示64位的数,那就要用两个32位的数来表示。其实里面随意有几个数,总之每个数是32位的,如何理解这些数取决于你自己在驱动文件中如何使用。...例如上例中#address-cells = ,#address-cells = ,reg = , 其中0x9000000表示的是地址,0x4000表示的是地址长度...,这里的reg属性指定了起始地址为0x9000000,长度为0x4000的一块地址空间。...在设备树中更多的是为节点添加标签,没有使用节点别名,别名的作用是“快速找到设备树节点”。在驱动中如果要查找一个节点,通常情况下我们可以使用“节点路径”一步步找到节点。

    2.2K10

    面试官:不同进程对应相同的虚拟地址,在 TLB 是如何区分的?

    首先,我们知道MMU的作用是把虚拟地址转换成物理地址。虚拟地址和物理地址的映射关系存储在页表中,而现在页表又是分级的。64位系统一般都是3~5级。 常见的配置是4级页表,就以4级页表为例说明。...并将虚拟地址和物理地址的映射关系缓存到TLB中。既然TLB是虚拟高速缓存(VIVT),是否存在别名和歧义问题呢?如果存在,软件和硬件是如何配合解决这些问题呢?...这里以48位地址总线为了例说明。 TLB的别名问题 我先来思考第一个问题,别名是否存在。我们知道PIPT的数据cache不存在别名问题。物理地址是唯一的,一个物理地址一定对应一个数据。...例如,进程A将地址0x2000映射物理地址0x4000。进程B将地址0x2000映射物理地址0x5000。当进程A执行的时候将0x2000对应0x4000的映射关系缓存到TLB中。...当切换B进程的时候,B进程访问0x2000的数据,会由于命中TLB从物理地址0x4000取数据。这就造成了歧义。 如何消除这种歧义?

    3.8K30

    万字整理内存管理之Cache

    (VIPT) 如何解决VIPT Cache别名问题 不存在的PIVT高速缓存 总结 为什么需要cache 如果CPU需要将一个变量(假设地址是A)加1,一般分为以下3个步骤: CPU 从主存中读取地址...我们如何根据地址在有限大小的cache中查找数据呢?现在硬件采取的做法是对地址进行散列(可以理解成地址取模操作)。我们接下来看看是如何做到的?...这种情况下的VIPT就存在别名问题。因为index来自虚拟地址位,虚拟地址和物理地址的位是一样的,但是bit12却不一定相等。...然后程序读取0x1000数据,再次把物理地址0x4000的数据加载到第0x10行cacheline。这不,别名出现了。相同物理地址的数据被加载到不同cacheline中。...我们需要想办法避免相同的物理地址数据加载到不同的cacheline中。如何做到呢?那我们就避免上个例子中0x1000映射0x4000的情况发生。

    1.1K20

    C语言-- 大端小端详解

    3)下面是两个具体例子: 16bit宽的数0x1234在Little-endian模式(以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为: 内存地址 小端模式存放内容...大端模式存放内容 0x4000 0x34 0x12 0x4001 0x12 0x34 32bit宽的数0x12345678在Little-endian模式以及Big-endian模式)CPU内存中的存放方式...这是因为在计算机中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8 bit。...例如一个16bit的short型 x ,在内存中的地址为 0x0010,x 的值为0x1122,那么0x11位高字节,0x22位低字节。...对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。

    4.9K30

    嵌入式系统原理课后习题练习

    他和人们日常使用的 PC 有什么区别和联系? 答: (1) 以应用为中心,计算机技术为基础,软硬件可裁减,从而能够适应实际应用中对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。...大多数通用计算机的处理器(如 Intel X86)和嵌入式系统中的 ARM7 处理器均采用冯诺依曼结构。...ARM Cortex-M3 处理器最多能支持多少种异常?他们的 优先级是如何规定的? 答: (1)在 ARM 中凡是发生打断程序正常执行流程的事件,都被称作异常。...9、 假设 ARM Cortex-M3 处理器要将以下数据以小端格式写入存储器,依次写出实现以下功 能的 C 语句,并画出这些数据在 ARM 存储器中的存储空间分布图: (1) 大写字母’E’存放在地址...5、 画出带 UART 接口的微控制器与带 RS232 接口的 PC 物理连接图。 答:P430(太懒啦) 6、 画出带 UART 接口的微控制器与带 USB 接口的 PC 物理连接图。 答:?

    5.8K40

    【集创赛】arm杯国奖作品推荐--技术文档!

    系统运行期间,摄像头将采集一帧图像数据并存放到DDR,Cortex-M3处理器在检测到图像数据成功写入后,将执行智能算法的处理流程,协同硬件加速器计算所采集图像中包含人脸的数量及所处位置等信息。...UART连接到计算机串口助手中显示。...摄像头经过配置后将逐帧采集图像数据,摄像头采集到的图像为RGB565格式,即每个像素点占据16位数据空间(红色通道5位、绿色通道6位、蓝色通道5位)。...显示器模块要解决的关键问题是如何做到图像读写不冲突?若写图像的地址与读图像的地址是相同的,显示器显示的图像数据有可能是正在从摄像头写入的数据,从而产生图像割裂。...LED的物理地址在0x40000000,通过软件部分代码往该地址写入一个32位的无符号整型数据来控制4颗LED的点亮状态。

    1.8K10

    【C语言指南】ASCII码完整详细介绍

    一、ASCII码的引入 在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号...(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则...,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示 二、ASCII码的表达方式 ASCII 码使用指定的7 位或8 位二进制数字组合来表示128 或256...同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。...奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1 。

    24610

    手把手教你在FPGA上搭建一个ARM Cortex-M3软核

    选择器件型号 组件管理界面中,添加CMSIS内核文件和Startup启动文件: 添加内核文件 并按照如下结构组织文件: 文件结构 6.2 设置RAM和ROM地址 在工程选项中设置片上ITCM的起始地址...0x0、大小64K,片上DTCM起始地址0x20000000、大小64K: RAM地址配置 起始地址来源于使用手册中图4-1系统内存地址映射,可以看到其中ITCM和DTCM的起始地址: ITCM和DTCM...起始地址 大小是我们在Cortex-M3内核配置中设置的大小: ITCM和DTCM大小 设置完成之后,新建main.c文件,输入以下内容,编译工程,应该无错误输出。...,通道1的数据寄存器偏移地址为0,通道2的数据寄存器偏移地址为0x08,根据Vivado中的连接,LED连接到通道1,按键连接到通道2上,所以只需要对这两个寄存器地址进行读写,就可以实现LED的控制和拨码开关状态的读取...如何将程序下载到片外的SPI Flash中,我还没有成功实现。

    4K20

    stm32位带操作

    这些位带区除了像正常的RAM一样操作外,它们还有自己的位带别名区,位带别名区把这1MB空间的每一位膨胀成32位,访问位带别名区的这些字,就可以达到访问位带区某个位的目的。...将位带区的每个位膨胀成32位(即4个字节)之后,那么每个位都与位带别名区的一个地址相映射。...二、地址转换 地址转换主要是把握“位带区的一个位膨胀为32位”。我们得把位带区的每个位映射一个地址。所以也就是从位带区的“位”→别名区的字节(地址)。...三、GPIO位带操作 接下来具体说一下如何用位带操作来操作GPIO中的ODR寄存器。我们知道在每个GPIO端口都有一个ODR寄存器,它的低16位控制了对应管脚的输出。...比如GPIOC的ODR寄存器的第0位控制了PC0的输出。那么该如何操作具体的某一位呢? 首先,定义好寄存器的地址。

    87320

    一文搞定JVM字节码

    image.png Java字节码文件 class文件本质上是一个以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在class文件中。...当虚拟机运行时,需要从常量池获得对应的符号引用,再在类创建或运行时解析并翻译到具体的内存地址中。...[][]类型的维数组,将被记录为[[Ljava/lang/String; # 方法表集合 在常量池之后的是对类内部的方法描述,在字节码中以表的集合形式表现,暂且不管字节码文件的16进制文件内容如何,我们直接看反编译后的内容...,对应#8中储存的异常 0 4 17 any //Exeption之外的其他异常 8 13 17 any...17 19 17 any 在字节码的4,5,以及13,14中执行的是同一个操作,就是将int型的3入操作数栈顶,并存入第二个局部变量。

    16010

    STM32开发笔记37: 485总线的收发切换时间_STM32库开发实战指南:基于STM32F4

    首先我们来看看为何位带别名区是位带区的32倍 如图所示,每个比特位都可以用一个完整的32bits地址来代替,有就是说一个32bits的暂存器在位带别名区会被扩展成32*32=1024bits,因此位带别名区的储存空间为...由此可知,我们可以直接操作位带别名区地址来达到操作位带区单一比特位的目的 需要注意膨胀过后的位带别名区只有LSB(最低位)比特位有效 地址转换 不过要操作位带别名区之前须要先知道位带区与位带别名区之间的关係...)*32+n*4 上述公式可以拆解成: 位带别名区地址 = 位带别名区首地址 + (目标位带区地址 – 位带区首地址)*32 + 第n个比特位*4 该转换公式简单来说就是地址膨胀后的位置运算,各个位带别名区的起始位置为...: 外设位带别名区首地址: 0x42000000 SRAM位带别名区首地址: 0x22000000 为了在运算当中不用在程式中编写两个不同的运算式,我们试着将两个公式用一条语句来完成: (bit_band_addr...,其中最重要的就是地址转换以及转换成指标类型 寻找指定位带区地址 转换成位带别名地址 转换成指标类型 进行赋值 因为我们计算出来的”地址”充其量也就只是一个整数值而已,必须经过类型转换告诉编译器它是一”

    71620

    TypeScript基础(二)扩展类型-枚举及其位运算

    本文将介绍字面量类型的问题、类型别名的局限以及枚举的优缺点及示例详细说明枚举的用处,以及扩展知识枚举的位运算。 字面量类型的问题 字面量类型有一些局限性: 1....枚举 -- 使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。...如何定义一个枚举: 在TypeScript中,可以使用关键字enum来定义一个枚举。...枚举还支持一些特殊操作,例如反向映射和常量计算。反向映射允许我们通过枚举值获取对应的名称,常量计算允许我们在枚举中使用表达式来定义常量值。 枚举会出现在编译结果中,编译结果中表现为对象。...枚举的位运算 在枚举中,可以使用位运算符来对枚举值进行位运算操作。位运算是一种对二进制数进行操作的方式,它可以对枚举值的各个位进行逻辑运算,从而实现一些特定的功能。

    25760
    领券