|
本帖最后由 lhb292 于 2020-9-15 23:16 编辑
STM32F407 不需要重映射向量表就可以读写16K一块Flash的方法分享如下,今天刚调出来的!实验证明可行 - #ifndef _FLASH_H_
- #define _FLASH_H_
- #include "driver_about.h"
- ////////////////////////////////////////////////////
- #define FlashAddr_ReadWrite (0x0800C000)////块3:0x0800 C000 - 0x0800 FFFF 16K
- #define STM32_FLASH_BASE 0x08000000 //STM32 FLASH的起始地址
- #define ADDR_FLASH_SECTOR_0 ((u32)0x08000000) //扇区0起始地址, 16 Kbytes
- #define ADDR_FLASH_SECTOR_1 ((u32)0x08004000) //扇区1起始地址, 16 Kbytes
- #define ADDR_FLASH_SECTOR_2 ((u32)0x08008000) //扇区2起始地址, 16 Kbytes
- #define ADDR_FLASH_SECTOR_3 ((u32)0x0800C000) //扇区3起始地址, 16 Kbytes
- #define ADDR_FLASH_SECTOR_4 ((u32)0x08010000) //扇区4起始地址, 64 Kbytes
- #define ADDR_FLASH_SECTOR_5 ((u32)0x08020000) //扇区5起始地址, 128 Kbytes
- #define ADDR_FLASH_SECTOR_6 ((u32)0x08040000) //扇区6起始地址, 128 Kbytes
- #define ADDR_FLASH_SECTOR_7 ((u32)0x08060000) //扇区7起始地址, 128 Kbytes
- #define ADDR_FLASH_SECTOR_8 ((u32)0x08080000) //扇区8起始地址, 128 Kbytes
- #define ADDR_FLASH_SECTOR_9 ((u32)0x080A0000) //扇区9起始地址, 128 Kbytes
- #define ADDR_FLASH_SECTOR_10 ((u32)0x080C0000) //扇区10起始地址,128 Kbytes
- #define ADDR_FLASH_SECTOR_11 ((u32)0x080E0000) //扇区11起始地址,128 Kbytes
- u32 FLASH_Read4Byte(u32 flashaddr);
- s8 FLASH_Read(u32 ReadAddr,u8 *pReadData,u32 ByteNums);
- s8 FLASH_EraseOneSector(u32 WriteAddr);
- s8 FLASH_Write(u32 WriteAddr,u8 *pWriteData,u32 ByteNums);
- #endif
- #include "flash.h"
- <font color="#ff0000">const char EEROM_Buff[1024*16] __attribute__((at(FlashAddr_ReadWrite))) = {0xff,0xff,0xff,0xff};//块3:0x0800 C000 - 0x0800 FFFF 16K</font>
- u32 FLASH_Read4Byte(u32 flashaddr)//读取指定地址的数据4个字节 返回值:对应数据[0 ... 3]
- {
- return *(vu32*)flashaddr;
- }
- s8 FLASH_Read(u32 ReadAddr,u8 *pReadData,u32 ByteNums)//从指定地址开始读出指定长度的数据
- {
- u32 data,i,inte,remd;
- inte=ByteNums/4*4;//4的整数部分
- remd=ByteNums%4; //余数
- for(i=0;i<inte;)
- {
- *((u32*)&pReadData[i])=FLASH_Read4Byte(ReadAddr);//读取4个字节
- i+=4;
- ReadAddr+=4;
- }
-
- data=FLASH_Read4Byte(ReadAddr);
- for(i=0;i<remd;i++)
- {
- pReadData[inte+i]=(u8)(data>>(i*8));//取1个字节
- }
- return 0;
- }
- uint16_t FLASH_GetFlashSector(u32 flashaddr)//获取某个地址所在的flash扇区
- {
- if(flashaddr<ADDR_FLASH_SECTOR_1) return FLASH_Sector_0;
- else if(flashaddr<ADDR_FLASH_SECTOR_2) return FLASH_Sector_1;
- else if(flashaddr<ADDR_FLASH_SECTOR_3) return FLASH_Sector_2;
- else if(flashaddr<ADDR_FLASH_SECTOR_4) return FLASH_Sector_3;
- else if(flashaddr<ADDR_FLASH_SECTOR_5) return FLASH_Sector_4;
- else if(flashaddr<ADDR_FLASH_SECTOR_6) return FLASH_Sector_5;
- else if(flashaddr<ADDR_FLASH_SECTOR_7) return FLASH_Sector_6;
- else if(flashaddr<ADDR_FLASH_SECTOR_8) return FLASH_Sector_7;
- else if(flashaddr<ADDR_FLASH_SECTOR_9) return FLASH_Sector_8;
- else if(flashaddr<ADDR_FLASH_SECTOR_10)return FLASH_Sector_9;
- else if(flashaddr<ADDR_FLASH_SECTOR_11)return FLASH_Sector_10;
- return FLASH_Sector_11;
- }
- s8 FLASH_EraseOneSector(u32 WriteAddr)//擦除一个以WriteAddr为开始地址的块
- {
- FLASH_Status status = FLASH_COMPLETE;
- if((WriteAddr<STM32_FLASH_BASE)||(WriteAddr%4)) return -1;
-
- FLASH_Unlock(); //解锁
- FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
- FLASH_DataCacheCmd(DISABLE); //FLASH擦除期间,必须禁止数据缓存
- if(WriteAddr<0X1FFF0000)
- {
- status=FLASH_EraseSector(FLASH_GetFlashSector(WriteAddr),VoltageRange_3);//擦除块
- if(status!=FLASH_COMPLETE) return status; //发生错误了
- }
-
- FLASH_DataCacheCmd(ENABLE); //FLASH擦除结束,开启数据缓存
- FLASH_Lock();//上锁
- return 0;
- }
- s8 FLASH_Write(u32 WriteAddr,u8 *pWriteData,u32 ByteNums)//写入pWriteData中的ByteNums字节数据到以WriteAddr地址为开始的Flash中
- {
- FLASH_Status status = FLASH_COMPLETE;
- u32 endaddr=0;
- if((WriteAddr<STM32_FLASH_BASE)||(WriteAddr%4)) return -1; //非法地址
-
- FLASH_Unlock(); //解锁
- FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
- //FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
-
- endaddr =WriteAddr+ByteNums;//写入的结束地址
- while(WriteAddr<endaddr)//写数据
- {
- status=FLASH_ProgramWord(WriteAddr,*(u32*)pWriteData);//写入数据
- if(status!=FLASH_COMPLETE) return status; //写入异常
- WriteAddr+=4;
- pWriteData+=4;
- }
- //FLASH_DataCacheCmd(ENABLE); //FLASH擦除结束,开启数据缓存
- FLASH_Lock();//上锁
- return 0;
- }
复制代码
|
评分
-
查看全部评分
|