概念:计算机中最小的信息单位是bit,也就是一个二进制位,8个bit组成一个Byte,也就是1个字节,
1个存储单元存放1个字节,每个存储单元对应一个32位(bit)地址,所以重要的话说三遍:对于32bit的ARM CPU
一个32位地址指向1个字节!!! 一个32位地址指向1个字节!!! 一个32位地址指向1个字节!!!
我们常说的flash空间,多少多少K,指的是多少多少K byte
假如我们执行下面的函数操作:
FlashWriteWord_P(0x1082,&WordVar); /* 向0x1082、0x1083中写入0xABCD */
经过编译,从map文件查看flash内容如下:
注意,前面的1080是十六进制,所以从0x1080到0x1090,共16个地址跨越,因为还有0x108A....0x108F
从这个map中,我们能发现一些问题
(1)验证了一个32位地址存放的是1个字节。
(2)将一个16位数,也就是2个字节,存放的顺序是低字节在前,高字节在后,这个跟感官上不一样。
(3)未存放数据的闪存单元是0xFF,这个不是巧合,因为flash说到底,内部也是只有1和0两种状态,CPU默认都是1.
另外,一个潜规定,向Flash中写数据,起始地址最好是偶数,否则容易出现错误,所以:
可以在0x1080、0x1081中存放一个uint16_t类型的数据;
可以在0x1082、0x1083中存放一个uint16_t类型的数据;
但是不能在0x1081、0x1082中存放一个uint16_t类型的数据。
从上可以看出,数据在flash中存放顺序是低在前,高在后,那么读flash时呢,答案是,会再反转,高在前,低在后,因为读flash必须一次至少读16位,不太允许读8位,所以正好又反过来了。
在编程时,要注意给要分配要存储的内容地址,每个数据对应地址,都是偶数,因为1个数据要占用2个地址。
关键字:STM32 Flash读写 Flash地址 存储内容
引用地址:
STM32 Flash读写;Flash地址对应的存储内容及方式
推荐阅读最新更新时间:2024-03-16 16:11
STM32驱动MAX6675读取温度
MAX6675是带冷端补偿的K型热电偶转换芯片,SO-8封装,精度12位,分辨率0.25℃,测量最高温度1023.75℃。也就是1024/(2的12次方)=0.25℃。 VCC-GND接3~5.5V电压; T+,T-分别接K型热电偶正负极; CS为片选,低电平有效; SCK为串行时钟,需要由STM32提供; SO为数据串行输出; 接线方式: MAX6675的输出方式是单片机输入时钟脉冲,MAX6675在时钟的下跳沿在SO管脚上输出数据。在数据手册第5页有时序说明,在6页有时序图,时序说明和时序图有差别。本人在读取数据过程中,发现按照时需说明操作,是正确
[单片机]
STM32的5个时钟源知识
众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。 内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号. 高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16
[单片机]
STM32程序移植的一些注意方法
一,步骤 建立需要的子函数及将对应的函数在所有子函数之前声明。另一种方法是:新建一个子函数(.c)文件和头文件库(.h)文件,分别保存在用户文件夹中(这个文件夹是主函数所在的文件夹),将刚刚保存的子函数文件添加到程序文件夹中(保存在主函数所在的文件夹并不表示包含到了函数里,因此要在编程软件(即开发环境)添加,添加方法详见http://blog.csdn.net/ambizxzh/article/details/74324288) 移植的方法也可以参照上面这个链接。 二,注意 1,在配置子函数文件时,当出现多个结构体时结构体要在任何结构体元素赋值之前,也就是说对于A结构体,它必须放在A结构体、B结构体、C…等结构体的结构体元
[单片机]
STM32 GPIO模式理解
stm32的GPIO的配置模式有好几种,包括: 1. 模拟输入; 2. 浮空输入; 3. 上拉输入; 4. 下拉输入; 5. 开漏输出; 6. 推挽输出; 7. 复用开漏输出; 8. 复用推挽输出 如图是GPIO的结构原理图: 1.模拟输入 从上图我们可以看到,我觉得模拟输入最重要的一点就是,他不经过输入数据寄存器,所以我们无法通过读取输入数据寄存器来获取模拟输入的值,我觉得这一点也是很好理解的,因为输入数据寄存器中存放的不是0就是1,而模拟输入信号不符合这一要求,所以自然不能放进输入数据寄存器。该输入模式,使我们可以获得外部的模拟信号。 2.浮空输入 该输入状态,我的理解是,它的输入完全由外部决定
[单片机]
STM32入门学习之GPIO(STM32F030F4P6基于CooCox IDE)(三)
先直接上代码 #include stm32f0xx.h #include stm32_lib/inc/stm32f0xx_rcc.h #include stm32_lib/inc/stm32f0xx_gpio.h int main(void) { //1、使能时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //定义一个IO GPIO_InitTypeDef PORT_LED; //设置IO引脚,模式,输出类型,速度 PORT_LED.GPIO_Pin=GPIO_Pin_4;//IO引脚,第4脚(个人的小板子PA4有连接LE
[单片机]
STM32串口的基本用法
前言:本来用不到串口,但在最近在读取传感器数据的时候数据发生了错误,被师兄推荐用串口来检查一下究竟读出的数据是什么,因此学习了串口的使用。事实证明,串口很有用,也没有想象中的那么复杂... 一、关于串口需要了解的几个知识点: 1.波特率:在串行通讯中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称之为波特率。 波特率决定了串口传输的速度,1波特=1bps(位/秒)。波特率为9600的话就是1s传输9600位的数据。 串口的传输与网络等其他的传输有着相似之处,比如我么常用的wifi,区别在与这些网络的单位是k,只有串口是按位来计数的。 2.单工,半双工,全双工: 单工:只能一个方向传输 半双工:可以两个
[单片机]
STM32启动文件——startup_stm32f10x_hd.s
一、启动文件的作用 (关于启动代码的作用,前面已经提到过了,这里再啰嗦一下) (1)初始化堆栈指针 SP; (2)初始化程序计数器指针 PC; (3)设置堆、栈的大小; (4)设置异常向量表的入口地址; (5)配置外部 SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部 SRAM); (6)设置 C库的分支入口__main(最终用来调用 main函数); (7)在 3.5版的启动文件还调用了在 system_stm32f10x.c文件中的SystemIni()函数配置系统时钟。 二、启动文件中提到的汇编指令 指令 作用 EQU 给数字常量取一个符号名,相当于 C 语
[单片机]
开漏输出和推挽输出
概述 在STM32或者GD32中,普通的输出GPIO输出方式主要是开漏输出和推挽输出,下面我们开始讲解这2种模式的区别。 下图是GPIO内部的结构示意图。 在上图中,P-MOS带了一个⚪,说明是低电平导通。 上图是GPIO的示意图,有输入和输出,如果简化为输出,则如下所示。 模拟文件下载 https://download.csdn.net/download/qq_24312945/85250172 推挽输出 推挽输出的内部电路大概是下图这个样子,由一个P-MOS和一个N-MOS组合而成,同一时间只有一个管子能够进行导通。 当输出高电平时候,P-MOS导通,N-MOS截至,此时电源电流入R5。 当输出低电平时
[单片机]