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也可以看出来。
|