1、关于AT32F425的 Flash
本次使用的是AT32F425R8T7-7,flash大小为64k。
2、flash范围以及分区
可以看出总共64k flash,分为64个扇区,1个扇区为1k。
3、flash操作
支持整片擦除、扇区擦除;
支持32位、16位、8位数据编程。
4、代码实现
#define FLASH_PAGE_SIZE 1024
void FlashWrite(uint16_t len,uint8_t *data,uint32_t addr_start)
{
uint16_t i=0;
uint32_t addr=addr_start;
flash_status_type status = FLASH_OPERATE_DONE;
flash_unlock();
for(i=0;i<len;i++)
{
status=flash_byte_program(addr,*data);
if(status!=FLASH_OPERATE_DONE)
{
return;
}
addr++;
data++;
}
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)
{
uint32_t erase_counter;
flash_status_type status = FLASH_OPERATE_DONE;
flash_unlock();
/* erase the flash pages */
while(start < end)
{
erase_counter = start/FLASH_PAGE_SIZE;
status=flash_sector_erase(erase_counter * FLASH_PAGE_SIZE );
if(status!=FLASH_OPERATE_DONE)
{
return;
}
start += FLASH_PAGE_SIZE;
}
flash_lock();
}
主要分为3个函数,读、写、擦除。
5、读写测试
#define APP_DATA_SATRT_ADDR 0x08000000+FLASH_PAGE_SIZE*63 //4k
#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)
{
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[i]);
}
printf("]\r\n");
printf("Read Data[");
for(uint8_t i=0;i<TEST_DATA_LEN;i++)
{
printf(" %d",ReadData[i]);
}
printf("]\r\n");
}
6、现象
可以看出,往最后一个扇区写入数据,读出来的和写进去的数据一致,通过debug也可以看出来。
|