前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >N32L43x Flash读\写\擦除操作总结

N32L43x Flash读\写\擦除操作总结

作者头像
ManInRoad
发布2022-09-07 16:45:16
4470
发布2022-09-07 16:45:16
举报
文章被收录于专栏:物联网思考物联网思考

1、flash规格

本文使用N32L43XRL_STB官方开发板展开说明:

本文使用的主芯片为N32L436RBL7,flash大小为128k;

flash分为64个page,编号0-63,每个page为2k。

2、flash操作注意事项

(1)写、擦除操作必须打开HSI时钟;

(2)写操作仅支持32位,擦除至少以1个page位单位进行;

(3)等待周期,本文配置的HCLK为108MHZ,所以设置等待周期为3。

3、代码实现

代码语言:javascript
复制
//PAGE 0-63 0x0800 0000 - 0x0801 FFFF
#define FLASH_PAGE_SIZE 0x800 //2k
void FlashWrite(uint16_t len,uint8_t *data,uint32_t addr_start)
{
uint16_t i=0;
uint32_t temp=0;
uint32_t addr=addr_start;
FLASH_STS status = FLASH_COMPL;
while(FLASH_HSICLOCK_ENABLE != FLASH_ClockInit());
FLASH_Unlock();
for(i=0;i<len/4;i++)
{
temp = (data[0]<<0)+(data[1]<<8)+(data[2]<<16)+(data[3]<<24);
status=FLASH_ProgramWord(addr, temp);
if(status!=FLASH_COMPL)
{
return;
}
data += 4;
addr += 4;
}
if((len % 4)==3)
{
temp = (data[0]<<0)+(data[1]<<8)+(data[2]<<16);
temp = temp | 0xff000000;
status=FLASH_ProgramWord(addr,temp);
if(status!=FLASH_COMPL)
{
return;
}
}
else
{
if((len % 4)==2)
{
temp = (data[0]<<0)+(data[1]<<8);
temp = temp | 0xffff0000;
status=FLASH_ProgramWord(addr,temp);
}
else
{
if((len % 4)==1)
{
temp = (data[0]<<0);
temp = temp | 0xffffff00 ;
status=FLASH_ProgramWord(addr,temp);
if(status!=FLASH_COMPL)
{
return;
}
}
}
}
FLASH_Lock();
}
void FlashRead(uint16_t len,uint8_t *outdata,uint32_t addr_start)
{
uint32_t addr;
uint16_t i;
addr = addr_start;
for(i=0;i<len;i++)
{
*outdata = *(uint8_t*) addr;
addr = addr + 1;
outdata++;
}
}
void FlashErase(uint32_t start, uint32_t end)
{
uint8_t index;
FLASH_STS status = FLASH_COMPL;
while(FLASH_HSICLOCK_ENABLE != FLASH_ClockInit()) {};
FLASH_Unlock();
/* erase the flash pages */
while(start < end)
{
index = start/FLASH_PAGE_SIZE;
status=FLASH_EraseOnePage(index*FLASH_PAGE_SIZE);
if(status!=FLASH_COMPL)
{
return;
}
start += FLASH_PAGE_SIZE;
}
FLASH_Lock();
}

4、测试

flash测试空间为最后一个page

代码语言:javascript
复制
#define APP_DATA_SATRT_ADDR 0x0801F800 //2k
#define TEST_DATA_LEN 11
uint8_t WriteData[TEST_DATA_LEN]={1,2,3,4,5,6,7,8,9,10,11};
uint8_t ReadData[TEST_DATA_LEN]={0,0,0,0,0,0,0,0,0, 0,0};
void FlashTest(void)
{
FLASH_SetLatency(FLASH_LATENCY_3);
FlashErase(APP_DATA_SATRT_ADDR, APP_DATA_SATRT_ADDR+FLASH_PAGE_SIZE);
FlashWrite(TEST_DATA_LEN,WriteData,APP_DATA_SATRT_ADDR);
FlashRead(TEST_DATA_LEN,ReadData, APP_DATA_SATRT_ADDR);
printf("Write Data[");
for(uint8_t i=0;i<TEST_DATA_LEN;i++)
{
printf(" %d",WriteData);
}
printf("]\r\n");
printf("Read Data[");
for(uint8_t i=0;i<TEST_DATA_LEN;i++)
{
printf(" %d",ReadData);
}
printf("]\r\n");
}

5、现象

可以看出,写进去的和读出来的一致。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 物联网思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、flash规格
  • 本文使用N32L43XRL_STB官方开发板展开说明:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档