stm32数据存储

发布者:Qilin520最新更新时间:2018-05-06 来源: eefocus关键字:stm32  数据存储 手机看文章 扫描二维码
随时随地手机看文章

大端模式:数据高字节保存在内存低地址,数据低字节保存在内存高地址;

小端模式:数据高字节保存在内存高地址,数据低字节保存在内存低地址;

stm32默认小端存储,如下图:

volatile float f = -0.1;  

volatile float *p = &f;  

volatile uint32_t i = 0xaabbccdd;  

volatile uint32_t *p2 = &i;  



volatile int32_t i2 = -5;  

volatile int32_t *p3 = &i2;  


变量名地址
f0x200000000xBDCCCCCD
p0x200000040x20000000
i0x200000080xAABBCCDD
p20x2000000B0x20000008

看0x20000000地址存储的值,0xBDCCCCCD的存储顺序为CD CC CC BD,变量i的值的地址0x20000008存DD,之后一次存放CC BB AA。



计算机编码概念:参http://share.onlinesjtu.com/mod/tab/view.php?id=173点击打开链接

原码:符号位为0表示正数,为1表示负数,数值部分用二进制数的绝对值表示的方法称为原码表示法,通常用[X]原表示X的原码。

反码:正数的反码与原码相同,负数的反码是符号位不变,数值位逐位取反。

补码:把某数X加上模数K,称为以K为模的X的补码。[X]补=K+X(计算机中的加法器是以2n为模的有模器件,单字节有符号数据的模式2^8,即256)。

求补码的方法:


  1. 正数的补码的最高位为符号“0”,数值部分为该数本身;负数的补码的最高位为符号“1”,数值部分为用模减去该数的绝对值。

  2. 正数的补码与其原码相同;负数的补码是符号位不变,数值位逐位取反(即求其反码),然后在最低位加1。


移码:通常来说在计算机科学中,移码就是将补码的符号位取反,如下:

-120D = -1111000B(真值) 原码:11111000 反码:10000111 补码:10001000 移码:00001000 这样的移码也可以叫做偏移值为128的移码,也是标准移码(偏移值为2k-1,k为数据位数),即10000000B+(-1111000B)=10000000B+(10001000B)=00001000B。这样移码就可以表示为原数的补码加上偏移值。在IEEE 754浮点数表示中移码是非标准的,它的偏移值为2k-1-1,也就是说对于单精度浮点数的偏移值为127(双精度为1023)。参:https://zh.wikipedia.org/wiki/%E7%A7%BB%E7%A0%81维基百科 


STM32的整型数据以补码形式存储,如上图:-5在内存中的存储值为0xFFFFFFFB,

-5: 原码:0x80000005 1000,0000,0000,0000,0000,0000,0000,0101(B)

   反码:0xFFFFFFFA 1111,1111,1111,1111,1111,1111,1111,1010(B)

   补码:0xFFFFFFFB 1111,1111,1111,1111,1111,1111,1111,1011(B)


浮点型数据存储:

STM32采用IEEE二进制浮点数算术标准(IEEE 754)参:https://zh.wikipedia.org/wiki/IEEE_754

IEEE标准从逻辑上采用一个三元组{S, E, M}来表示一个数N,它规定基数为2,符号位S用0和1分别表示正和负,尾数M用原码表示,阶码E用移码表示。根据浮点数的规格化方法,尾数域的最高有效位总是1,由此,该标准约定这一位不予存储,而是认为隐藏在小数点的左边,因此,尾数域所表示的值是1.M(实际存储的是M),这样可使尾数的表示范围比实际存储多一位。为了表示指数的正负,阶码E通常采用移码方式来表示,将数据的指数e 加上一个固定的偏移量后作为该数的阶码,这样做既可避免出现正负指数,又可保持数据的原有大小顺序,便于进行比较操作。(不使用标准移码原因,猜测是使用标准的偏移量2^(k-1)得到的最小数是1,最大数变成了0,数域为[-(2^(k-1)-1),2^(k-1)])参:http://share.onlinesjtu.com/mod/tab/view.php?id=176

-0.1 -> -0.00011001100110011001101 -> -1.1001100110011001101*2^(-4)(注意:是-0.00011001100110011001101,而不是-0.00011001100110011001100,因为不能完全表示为2进制,进一法表示,即-0.0001100110011001100110011....进一表示为-0.00011001100110011001101)

S:1;

E:127+(-4)=123 -> 0111,1011(B)

M:1.M=1.1001100110011001101 -> M为1001100110011001101

所以内存上存储为:1,0111,1011,1001,1001,1001,1001,1001,101


关键字:stm32  数据存储 引用地址:stm32数据存储

上一篇:关于STM32的变量定义
下一篇:stm32 中怎样把变量定义到flash中

推荐阅读最新更新时间:2024-03-16 16:01

stm32 bootloader串口升级程序框架
1.IAP IAP是In Applica ti on Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的 通信 口对产品中的 固件 程序进行更新升级。 通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(如USB、 USART )接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。 2.Bootloader 在上述IAP的概念中,bootloader就是其第一个项目程序。bootloader主要
[单片机]
stm32 485串口数据的收发
//串口初始化: #define EN_USART2_RX 1 void RS485_Init(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOG, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); RCC
[单片机]
STM32的频率和占空比计算
STM32的PWM应用广泛,最重要的就是调节占空比来达到PWM的控制应用。 STM32的一个定时器能同时输出4路PWM分别占据一个通道,而定时器的频率确定了,四个通道的频率也就随之确定,所以同一个定时器的四个通道的频率是相同的。频率由PSC寄存器和arr寄存器计算得到。 f=72MHZ/ 频率确定后,再通过寄存器TIMX- CCRY寄存器来确定通道Y的占空比。计数器向上计数时,当计数器的值比CCR寄存器值小时输出低电平,比它大时就输出高电平,高电平占总周期的时间就是占空比。 Duty circle=TIMX- CCRY/arr
[单片机]
STM32’s I2C 硬件BUG引发的血案
下面的函数中有一个BUG, 也就是SR2不能用WHILE来轮询,而应直接读出.如下面代码段, 因此,在这里说的这是STM32的BUG其实是我的代码的错误: I2C2- DR = inerAddress ; while( (I2C2- SR1&Q_I2C_SR1_BIT_BTF)==0 ); I2C2- SR2; // 正解 2010-4-1 1:44,一直都不相信STM32 的I2C接口会存在问题,因为工作经验无数次告诉我,嵌入式系统设计中的99.999%的问题不会是由于MCU本身的设计问题所引起,绝大部分都是硬件工程师或软件工程师的某个设计缺陷所造成的. 这次的设计经历也不例外. 由于终于可以抽多点时间用于设计ST
[单片机]
<font color='red'>STM32</font>’s I2C 硬件BUG引发的血案
STM32HAL库ADC实验(三)——中断查询法
(模式:连续模式 非扫描模式) 使能ADC全局中断 参考视频 【STM32】超简单的开发方法-基础篇(ADC模数转换) https://player.bilibili.com/player.html?aid=715022775 参考文章:https://blog.csdn.net/as480133937/article/details/99627062 设置定时 可以看我这篇文章 配置玩定时器之后 配置ADC 使能ADC中断 基本函数: • HAL_ADC_Start_IT(&hadcx);       //中断轮询模式开启ADC • HAL_ADC_Stop_IT() //中断轮询模式停
[单片机]
STM32HAL库ADC实验(三)——中断查询法
stm32 直接操作寄存器开发环境配置
操作stm32 有使用官方库函数(参见 stm32 开发环境MDK+库文件配置 )和 直接操作寄存器的方法 直接操作寄存器的方法 会比库函数的方法效率更高 而且代码量会比较少 例如 在库函数下 配置一个GPIO口 需要 GPIO_InitTypeDef GPIO_InitStructure; //结构体 初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPI
[单片机]
<font color='red'>stm32</font> 直接操作寄存器开发环境配置
stm32高级定时器重新学习
最近做项目,用到定时器,索性重新学习一下,以前只是用于简单的pwm生成和中断处理,对定时器根本就没有进行深入研究,今天借此机会,重新学习一下高级定时器,只要高级定时器学会了,基本定时器也就没什么问题了。总体上来说,stm32的定时器,功能非常多。看了一下,大概有20个功能。我就按照数据手册,一一的重新学习一下。 首先是框图,娘的,看着就眼晕 1、时基:包含计数器寄存器(TIMx_CNT) 预分频器寄存器 (TIMx_PSC) 自动装载寄存器 (TIMx_ARR) 重复次数寄存器 (TIMx_RCR) 计数类似于51单片机中的TH1和TL1。预分频器就是将输入时钟进行降低。重复寄存器类似与51中的自动装载模式中的TH寄存器
[单片机]
<font color='red'>stm32</font>高级定时器重新学习
STM32 CAN 通讯 标示符过滤器设置
简介:最近看了下STM32 CAN 通讯其中标示符过滤器设置大有讲究。特别是你要使用ST库函数时,当过滤器工作在屏蔽模式下,并且你把屏蔽位设了1也就是标示符对应位必须全部匹配才能通过,这是由其要小心。 举个例子吧,过滤器长度为32位,模式为屏蔽模式,假如我要发送的标示符为0x1314;那过滤器设置如下 一、过滤器完全无效 接收到的标示符全部通过 0x1314 二进制码: 0000 0000 0000 0000 0001 0011 0001 0100 CAN_Filter xxxx xxxx xxxxxxxx xxxx xxxx xxxx xxxx CAN_FilterMask 0000 0000 0000 00
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved