建站教学视频,淮安 做网站 app,数据查询网站建设,广州英文外贸seo网站优化编译环境#xff1a;我用的是(Keil)MDK4.7.2stm32库版本#xff1a;我用的是3.5.0一、本文不对FLASH的基础知识做详细的介绍#xff0c;不懂得地方请查阅有关资料。对STM32 内部FLASH进行编程操作#xff0c;需要遵循以下流程#xff1a;FLASH解锁清除相关标志位擦除FLASH…编译环境我用的是(Keil)MDK4.7.2stm32库版本我用的是3.5.0一、本文不对FLASH的基础知识做详细的介绍不懂得地方请查阅有关资料。对STM32 内部FLASH进行编程操作需要遵循以下流程FLASH解锁清除相关标志位擦除FLASH(先擦除后写入的原因是为了工业上制作方便即物理实现方便)写入FLASH锁定FLASH实例#define FLASH_PAGE_SIZE ((uint16_t)0x400) //如果一页为1K大小#define WRITE_START_ADDR ((uint32_t)0x08008000)//写入的起始地址#define WRITE_END_ADDR ((uint32_t)0x0800C000)//结束地址uint32_t EraseCounter 0x00, Address 0x00;//擦除计数写入地址uint32_t Data 0x3210ABCD;//要写入的数据uint32_t NbrOfPage 0x00;//记录要擦除的页数volatile FLASH_Status FLASHStatus FLASH_COMPLETE;/*FLASH擦除完成标志*/void main(){/*解锁FLASH*/FLASH_Unlock();/*计算需要擦除FLASH页的个数 */NbrOfPage (WRITE_END_ADDR - WRITE_START_ADDR) / FLASH_PAGE_SIZE;/* 清除所有挂起标志位 */FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);/* 擦除FLASH 页*/for(EraseCounter 0; (EraseCounter NbrOfPage) (FLASHStatus FLASH_COMPLETE); EraseCounter){FLASHStatus FLASH_ErasePage(WRITE_START_ADDR (FLASH_PAGE_SIZE * EraseCounter));}/* 写入FLASH*/Address WRITE_START_ADDR;while((Address WRITE_END_ADDR) (FLASHStatus FLASH_COMPLETE)){FLASHStatus FLASH_ProgramWord(Address, Data);Address Address 4;}/* 锁定FLASH*/FLASH_Lock();}二、FLASH 擦除(以及防止误擦除程序代码)1、擦除函数FLASH_Status FLASH_ErasePage(u32 Page_Address)只要()里面的数是flash第xx页中对应的任何一个地址就是擦除xx页全部内容防止误擦除有用程序代码的方法方法一首先要计算程序代码有多少把FLASH存取地址设置在程序代码以外的地方这样就不会破坏用户程序。原则上从0x0800 0000 0x1000 以后的FLASH空间都可以作为存储使用。如果代码量占了 0x3000 那么存储在 0x0800 0000 0x4000 以后的空间就不会破坏程序了。方法二先在程序中定义一个const 类型的常量数组并指定其存储位置(方便找到写入、读取位置)这样编译器就会分配你指定的空间将常量数组存入FLASH中。当你做擦除。读写操作时只要在这个常量数组所在的地址范围就好。const uint8_t table[10]__at(0x08010000) {0x55} ;MDK3.03A开始就支持关键字 __at() 。需要加#include方法三在程序中定义一个const 类型的常量数组无需指定其存储位置。只要定义一个32位的变量存储这个数组的FLASH区地址就行。uint32_t address;//STM32的地址是32位的const uint8_t imageBuffer[1024] {0,1,2,3,4,5,6,7};address (uint32_t) imageBuffer;/*用强制类型转换的方式可以把FLASH中存储的imageBuffer[1024]的地址读到RAM中的变量address 里方便找到写入、读取位置*/方法四利用写保护的方式(没研究明白)上一页12下一页