最近选型使用STM32G030这款芯片,由于做的功能需要频繁读写flash,最开始没有注意到芯片的擦写次数是1000次,为了确保功能实现,只能是每次写入flash时判断当前页是否写满,写满才擦除重新开始写;

每次需要写入flash的数据长度小于128字节,以128字节计算,每一页可以写入16=2048/128 次; STM32G030C8T6最少可以写入16000次;如果对写入次数需求高的,可以减少每次写入数据的长度;

STM32G030C8T6写入特性参考:stm32g030 内部flash存储一些用户数据的方法 - 简书

stm32F103

可编程flash区,以页为单位,每页1K,共128页, 擦写次数>1万次;

写入以16位“半字”为最小单位,擦除以页为单位;

先解锁,清标志,擦除,写,上锁;

进行flash操作时,必须打开内部HSI;

stm32G030

用时   \/

64-bit        program         85~125us;

32 Double word program        X ms

page(2k)      program              X ms

bank(64k)      program            X s

page(2k)      erase                 40ms

Mass          erase                   X ms

擦写次数  仅>= 1K次!!!  需考虑坏页情况;

写数据时,一般建议关闭所有中断!

stm32g030 双字写时,不仅要求是双字形式, 而且要求8字节对齐。 否则进入硬件错误!

测试部分代码:

//从指定地址开始写入指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToWrite:写入数据长度
void STMFLASH_Write_64(u32 WriteAddr,u8*pBuffer,u16 NumToWrite)
{u16 i;u64 data_write;u16 len =NumToWrite;   u8    len_flag=0;    if(NumToWrite>FLASH_PAGE_SIZE)return;if( (WriteAddr<FLASH_BASE) ||(WriteAddr>=(FLASH_BASE+FLASH_PAGE_SIZE*FLASH_PAGE_NB)))return;//非法地址HAL_FLASH_Unlock();                                           //解锁    len_flag=len%8;len=len+get_rem_data(len_flag);                               //数据长度8字节对齐判断if(WriteAddr%FLASH_PAGE_SIZE==0)                         //写满了从一页开始地址写需要擦除{          FLASH_EraseInitTypeDef My_Flash={0};                   //声明 FLASH_EraseInitTypeDef 结构体为 My_FlashMy_Flash.TypeErase = FLASH_TYPEERASE_PAGES;           //标明Flash执行页面只做擦除操作My_Flash.Page    =  (WriteAddr - FLASH_BASE) / FLASH_PAGE_SIZE;My_Flash.NbPages = 1;                                   //说明要擦除的页数,此参数必须是Min_Data = 1和Max_Data =(最大页数-初始页的值)之间的值uint32_t   PageError = 0;                             //设置PageError,如果出现错误这个变量会被设置为出错的FLASH地址HAL_FLASHEx_Erase(&My_Flash, &PageError);                //调用擦除函数擦除  }       for(i=0;i<len/8;i++)//复制                                  //8字节数据对齐组包{u32 data_1=0;u64 data_2=0;data_1=(pBuffer[8*i+0])|(pBuffer[8*i+1]<<8)|(pBuffer[8*i+2]<<16)|(pBuffer[8*i+3]<<24);       //data_2=(pBuffer[8*i+4])|(pBuffer[8*i+5]<<8)|(pBuffer[8*i+6]<<16)|(pBuffer[8*i+7]<<24);         data_write= data_1| (data_2<<32);    if( HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,WriteAddr,data_write)     == HAL_OK)WriteAddr+=8;//地址增加2.        }       HAL_FLASH_Lock();                                               //上锁
}

u8 get_rem_data(u8 data)            //长度判断
{u8 re_data=0;switch (data){case 0: re_data=0; break;case 1: re_data=7; break;case 2: re_data=6; break;case 3: re_data=5; break;case 4: re_data=4; break;case 5: re_data=3; break;case 6: re_data=2; break;case 7: re_data=1; break;}return re_data;
}void stm32_FLASH_ErasePage(u32 WriteAddr)      //擦除
{if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+FLASH_PAGE_SIZE*FLASH_PAGE_NB)))return;//非法地址HAL_FLASH_Unlock();                      //解锁if(WriteAddr%FLASH_PAGE_SIZE==0)  {
//      FLASH_PageErase(WriteAddr);//擦除这个扇区 FLASH_EraseInitTypeDef My_Flash={0};           //声明 FLASH_EraseInitTypeDef 结构体为 My_FlashMy_Flash.TypeErase = FLASH_TYPEERASE_PAGES;   //标明Flash执行页面只做擦除操作My_Flash.Page    =  (WriteAddr - FLASH_BASE) / FLASH_PAGE_SIZE;My_Flash.NbPages = 1;                           //说明要擦除的页数,此参数必须是Min_Data = 1和Max_Data =(最大页数-初始页的值)之间的值uint32_t   PageError = 0;                     //设置PageError,如果出现错误这个变量会被设置为出错的FLASH地址HAL_FLASHEx_Erase(&My_Flash, &PageError);        //调用擦除函数擦除  }           HAL_FLASH_Lock();//上锁
}u8 STMFLASH_ReadByte(u32 faddr)
{return *(__IO uint8_t*) (faddr);// return *(u8*) faddr;
}//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToWrite:半字(16位)数
void STMFLASH_Read_Byte(u32 ReadAddr,u8 *pBuffer,u16 NumToRead)
{u16 i;for(i=0;i<NumToRead;i++){pBuffer[i]=STMFLASH_ReadByte(ReadAddr);//读1个字节.ReadAddr+=1;//偏移1个字节.   }
}
#define  FLASH_SAVE_ADDR_MAX_31      0X0800f800
u8 data_flash[64];
static u16 count_delay=0;
u8 flag_v_a=0;
int main(void)
{HAL_Init();SystemClock_Config();
//  led_gpio_config();
//  d_out_gpio_config();
//  d_in_gpio_config();
//  rs485_en_gpio_config(); UART1_init(115200);UART2_init(115200);      printf("******************sys begain **************\r\n");data_flash[0]=0x55;fauil_delay_work=30;IWDG_Init(4,625*6);                // 频率:32K/64/1   Tout=  ((prer分频)* rlr /32)  7while (1){    printf("\r\n\r\nwrite falsh data \r\n");for(u8 i=0;i<sizeof(data_flash);i++){if(i==0) data_flash[0]=0x55;else        data_flash[i]=i+data_coun;                    printf("%02x ",data_flash[i] );}data_coun++;HAL_Delay(1000);stm32_save_flash(FLASH_SAVE_ADDR_MAX_31,data_flash,sizeof(data_flash));IWDG_Feed();HAL_Delay(1000);if(stm32_read_flash(FLASH_SAVE_ADDR_MAX_31,data_flash,sizeof(data_flash)))   {printf("\r\n\r\nread falsh data \r\n");for(u8 i=0;i<sizeof(data_flash);i++){printf("%02x ",data_flash[i] );}}}
}

运行效果:测试代码单次写入数据长度使用的是64字节

完整demo下载路径:STM32G030C8T6读写flash-单片机文档类资源-CSDN下载

STM32G030C8T6读写flash相关推荐

  1. 通过mtd读写flash_Linux下读写FLASH驱动——MTD设备分析

    最近在学习驱动读写flash的代码部分.经历了可笑的过程:开始我知道flash用通过spi口来读写.所以就到了driver/spi 下面看相关代码.发现有个spidev.c里面有read/write/ ...

  2. 通过mtd读写flash_【转】 Linux下读写FLASH驱动——MTD设备分析

    最近在学习驱动读写flash的代码部分.经历了可笑的过程:开始我知道flash用通过spi口来读写.所以就到了driver/spi 下面看相关代码.发现有个spidev.c里面有read/write/ ...

  3. STM32笔记(十二)---SPI读写FLASH

    SPI读写FLASH 文章目录 SPI读写FLASH 一.SPI协议简介 1.1 SPI 物理层 1.2 协议层 1.2.1 SPI 基本通讯过程 1.2.2 通讯的起始和停止信号 1.2.3 数据有 ...

  4. STM32学习之SPI协议(读写FLASH)

    关于STM32学习分享 第八章 SPI协议(读写FLASH) 文章目录 关于STM32学习分享 前言 二.代码 1.spi_flash.c 2.spi_flash.h 3.main.c 总结 前言 开 ...

  5. stm32中spi可以随便接吗_STM32的SPI模式读写FLASH芯片全面讲解

    例程完整代码: SPI协议简介 SPI协议,即串行外围设备接口,是一种告诉全双工的通信总线,它被广泛地使用在ADC,LCD等设备与MCU间通信的场合. SPI信号线 SPI包含4条总线,分别为SS,S ...

  6. 【STM32】使用STM32cubeMX的库读写FLASH数据

    前言 做项目时有时候需要对一些数据进行掉电可存储,一般来说可以把这些数据存储到到EEPROM或FLASH,这次项目中我使用到的芯片是STM32F051C8T6,只有64KB的FLASH,没有EEPRO ...

  7. STM32F103学习笔记——SPI读写Flash(二)

      此系列文章是小白学习STM32的一些学习笔记.小白第一次写笔记文章,有不足或是错误之处,请多体谅和交流! 目录 1.软件设计流程 2.SPI初始化 3.SPI发送接收一字节函数编写 4.FLASH ...

  8. STM32F103配合STM32CubeMX实现SPI读写flash

    本人采用的是正点原子的精英STM32F103开发板,其包含一块W25Q128型号的flash芯片.该flash与STM32F103的SPI2相连. 下面根据正点原子提供的开发指南文档,实现FreeRT ...

  9. RT-Thread 使用FAL多字节读写FLASH

    RT-Thread 使用FAL多字节读写FLASH FAL 简介 在RT-Thread上使用FAL 添加SPI 总线驱动 添加SFUD驱动 添加SPI DEVICE 使用SFUD添加SPI 块设备 添 ...

  10. STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)

    推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang 我的网站:h ...

最新文章

  1. Linq let Concat
  2. 最小二乘法least square
  3. 你需要的是持续的服务改进
  4. javascript总结9:JavaScript三目运算符
  5. python list 深复制_Python列表的深复制和浅复制示例详解
  6. SAP Spartacus 服务器端渲染的依赖注入之 ProductPageEventBuilder
  7. 回归分析预测_使用回归分析预测心脏病。
  8. JavaScript高级程序设计读书笔记(一)
  9. 无法在此设备上查看受保护内容_细说丨你想要的Excel保护与加密都在这里
  10. utilities(matlab)—— l2row/l2col
  11. SLAM_关于VIO中IMU预积分的讲解
  12. 三菱MX Component通信应用
  13. word2007如何删除尾注分隔符
  14. 百度HI QQ,MSN ,阿里旺旺,贸易通,MSN在线客服,线聊天代码
  15. 从智慧零售,看腾讯的数字化转型之道
  16. matlab数学建模-非线性规划(无约束规划、有约束规划)
  17. ElasticSearch系列十:ElasticSearch搜索技术深入讲解之搜索模板,搜索建议和地理位置搜索
  18. 雷军:别轻易尝试,要做好准备再去创业
  19. 虚拟机WindowServer2003共享文件夹
  20. Maven跳过单元测试配置

热门文章

  1. 阿里服务器稳定性介绍
  2. 前端学习从入门到高级全程记录之31(JavaScript高级3)
  3. 04、Hadoop框架HDFS NN、SNN、DN工作原理
  4. Java去除空格符号
  5. mysql年龄最大_使用MySQL子查询选择年龄最大的所有用户?
  6. java图片闪烁_java在窗口中添加图片做动画,怎么一闪一闪的?
  7. 深度剖析JAVA软件工程师
  8. PDF编辑器哪个好,如何把PDF文件拆分成多个文件
  9. notes系统服务器地址,在Notes客户端和Domino服务器上,服务器地址的缓存(Cache)存放在哪里...
  10. leejianjun的博客 PHP生成word并可下载