整个过程按照如下步骤:
1. 解锁
2. 判断是否保护,有保护的话要先关闭保护
3. 擦除
4. 编程
5. 复位进入应用程序区
关于解锁:看资料的时候说的神乎其神,有个读/编程控制器叫”FPEC
有几个寄存器,专门负责Flash 的,对这几个寄存器以一定得顺序访问并设置即可成功解锁
Flash,至于怎么访问,谁先谁后,数据手册上写的头晕,直接来个快刀斩乱麻 Flash_UnLock()函
数封装了这一系列的操作,有一点要注意,如果你是自己操作寄存器的话,如果操作的方法或者顺序不对都会造成Flash 的锁定,之后的所有操作都会返回一个错误,直到下次启动后才能正常操作
关于保护,为了保护用户数据不被无意修改或者恶意读取,STM32 提供了对芯片FLASH 的写读等一系列的保护,加密方式是按照每4 页为一个单位,也就是说,如果你想加密的话,你至少要加密4 页,也就至少4K 的空间,至于高密的STM32 是否就是8K 了?这个我没仔细去看!还待以后仔细查看?
关于擦除,擦除也是很简单,但是只能一页一页的擦除,ST 公司也提供了一个函数,至于这
个函数后面的输入地址参数,经过试验发现只要这个地址落在这个页里,就是擦除这个页,不知道这样理解对不对,还需要验证???
FLASHStatus = FLASH_ErasePage(Address );
关于编程,STM32 编程一次只能以半字(16 位)的方式编程,库提供了两个函数
FLASH_Status FLASH_ProgramWord(u32 Address, u32 Data) 编程一个字
FLASH_Status FLASH_ProgramHalfWord(u32 Address, u16 Data) 编程半个字
在实际编程虽然你调用的一个字编程的时候内部操作仍然是按照半字的方式编程
另外还有个最最重要的一点:还要注意大小端的问题,有些你认为可移植性很好的代码,其实并不一定,用位移组合成一个32位整型,然后当做参数来编程,由于大小端的模式,刚好第一个字节在最后边了,最后一个字节在前面了,导致了AN2557下载我的代码可以使用,我自己的下载我自己的代码竟然不能使用,很是郁闷了一阵子,读出整个Flash的内容就很容易看出来不同了,这个没有想到也着实该死,后来用指针强指,不但效率高了,程序也方便了。 |
|