[活动专区] 【AT-START-F425测评】10、flash读写——使用内部flash存储数据

[复制链接]
1294|0
 楼主| freeelectron 发表于 2022-3-17 14:40 | 显示全部楼层 |阅读模式
1、关于AT32F425的 Flash
596826232d5c72c29b.png
本次使用的是AT32F425R8T7-7,flash大小为64k。


2、flash范围以及分区
616576232d62fc5754.png
可以看出总共64k flash,分为64个扇区,1个扇区为1k。

3、flash操作
支持整片擦除、扇区擦除;
支持32位、16位、8位数据编程。

4、代码实现
  1. #define  FLASH_PAGE_SIZE  1024
  2.    

  3. void FlashWrite(uint16_t len,uint8_t  *data,uint32_t addr_start)
  4. {       
  5.         uint16_t i=0;
  6.         uint32_t addr=addr_start;
  7.         flash_status_type status = FLASH_OPERATE_DONE;
  8.        
  9.         flash_unlock();
  10.                        
  11.         for(i=0;i<len;i++)
  12.         {
  13.                 status=flash_byte_program(addr,*data);
  14.                 if(status!=FLASH_OPERATE_DONE)
  15.                 {
  16.                         return;
  17.                 }
  18.                 addr++;
  19.                 data++;
  20.         }
  21.        
  22.         flash_lock();
  23. }


  24. void FlashRead(uint16_t len,uint8_t *outdata,uint32_t addr_start)
  25. {       
  26.         uint32_t addr;
  27.         uint16_t i;
  28.        
  29.         addr = addr_start;
  30.        
  31.         for(i=0;i<len;i++)
  32.         {
  33.                 *outdata = *(uint8_t*) addr;
  34.                 addr = addr + 1;
  35.                 outdata++;
  36.         }
  37. }


  38. void FlashErase(uint32_t start, uint32_t end)
  39. {
  40.         uint32_t erase_counter;
  41.         flash_status_type status = FLASH_OPERATE_DONE;

  42.         flash_unlock();

  43.         /* erase the flash pages */
  44.         while(start < end)
  45.         {
  46.                 erase_counter = start/FLASH_PAGE_SIZE;
  47.                 status=flash_sector_erase(erase_counter * FLASH_PAGE_SIZE );
  48.                 if(status!=FLASH_OPERATE_DONE)
  49.                 {
  50.                         return;
  51.                 }
  52.                 start += FLASH_PAGE_SIZE;
  53.         }
  54.         flash_lock();
  55. }
主要分为3个函数,读、写、擦除。

5、读写测试
  1. #define APP_DATA_SATRT_ADDR                                              0x08000000+FLASH_PAGE_SIZE*63 //4k

  2. #define TEST_DATA_LEN    11
  3. uint8_t WriteData[TEST_DATA_LEN]={1,2,3,4,5,6,7,8,9,10,11};
  4. uint8_t  ReadData[TEST_DATA_LEN]={0,0,0,0,0,0,0,0,0, 0,0};

  5. void FlashTest(void)
  6. {
  7.         FlashErase(APP_DATA_SATRT_ADDR, APP_DATA_SATRT_ADDR+FLASH_PAGE_SIZE);
  8.         FlashWrite(TEST_DATA_LEN,WriteData,APP_DATA_SATRT_ADDR);
  9.         FlashRead(TEST_DATA_LEN,ReadData, APP_DATA_SATRT_ADDR);
  10.        
  11.         printf("Write Data[");
  12.         for(uint8_t i=0;i<TEST_DATA_LEN;i++)
  13.         {
  14.                 printf(" %d",WriteData[i]);
  15.         }
  16.         printf("]\r\n");

  17.        
  18.         printf("Read Data[");
  19.         for(uint8_t i=0;i<TEST_DATA_LEN;i++)
  20.         {
  21.                 printf(" %d",ReadData[i]);
  22.         }
  23.         printf("]\r\n");
  24. }


6、现象
624306232d763138f7.png

513576232d79ece038.png

可以看出,往最后一个扇区写入数据,读出来的和写进去的数据一致,通过debug也可以看出来。












您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:stm32/LoRa物联网:304350312

66

主题

786

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部