[15-1]FLASH闪存

📅 2026/6/16 19:46:13
[15-1]FLASH闪存
同为闪存它们的特性基本一样写入前必须擦除擦除必须以最小单位进行擦除后数据位全变为1数据只能1写0不能0写1除和写入之后都需要等待忙地址只要以000、400、800、C00结尾的都一定是页的起始地址对吧打一步 自的都是为了防止误操作也就是复位后FLASH默认是锁着的那编译器优化有什么用呢可以去除无用的繁杂代码降低代码空间提升运行效率但优化之后编译器在某些地方可能会弄巧成拙比如你想用变量计数空循环的方式实现延时函数那编译器优化的时候可能会说你这設延时函数好像没用啊还自自浪费时间给你优化掉了另外编译器还会利用缓存来加速代码比如如果你要频繁读写內存的某个变量那最常见的优化方式就是先把变量转移到高速缓存里来在STM32内核里有一个类似缓存的工作组寄存器这些寄存器的访问速度最快我先把变量放在缓存里需要读写的时候直接访问缓存就行了用完之后再写回内存但是如果你的程序里有多个线程比如中断函数在中断函数里你改变了这个原始变量那可能缓存并不知道你更改了下次程序还看缓存的变量就会造成数据更改不同步的问题这时我们的做法也是读取变量定义的前面加上一个volatile告诉编译器这个变量是易变的每次读取你都得执行到位要直接从内存里找不要再用缓存优化了所以总结一下就是如果开启了编译器优化在无意义加减变量多线程更改变量读写与硬件相关的存储器时都需要加上volatile防止被编译器优化如果你默认不开编译器优化那就无所谓了加不加都一样所以这里我们要直接读取存储器使用指针写指定地址下的存储器这个语句的意思就很明显了左边和上面一样先给定地址再强转为指针最后指针取内容这样就是指定地址的值因为这个语句是写入数据并且指定的是闪存的地址闪存在程序运行时是只读的不能轻易更改而我们本节需要对㭎存进行更改这个所需的权限就比较高需要提前解锁SRAM在程序运行时是可读可写的写入操作只能以半字的形式写入STM32的闪存在写入之前会检查指定地址有没有擦除如果没有擦除就写入STM32则不执行写入操作其中字Word就是32位数据半字HalfWord就是16位数据字节Byte就是8位数据所以如果你想像SRAM一样随心所欲的读写那最好的办法就是先把闪存的一页读到SRAM中读写完成后再擦除一页整体写回去擦除之后所有的数据位变为1擦除的最小单位就是一页1K1024字节。除非写入的全是0这一个数据是例外因为不擦除就写入可能会写入错误但全写入0的话写入肯定是没问题的器件电子签名