STM32G030C8T6读写flash
最近选型使用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相关推荐
- 通过mtd读写flash_Linux下读写FLASH驱动——MTD设备分析
最近在学习驱动读写flash的代码部分.经历了可笑的过程:开始我知道flash用通过spi口来读写.所以就到了driver/spi 下面看相关代码.发现有个spidev.c里面有read/write/ ...
- 通过mtd读写flash_【转】 Linux下读写FLASH驱动——MTD设备分析
最近在学习驱动读写flash的代码部分.经历了可笑的过程:开始我知道flash用通过spi口来读写.所以就到了driver/spi 下面看相关代码.发现有个spidev.c里面有read/write/ ...
- STM32笔记(十二)---SPI读写FLASH
SPI读写FLASH 文章目录 SPI读写FLASH 一.SPI协议简介 1.1 SPI 物理层 1.2 协议层 1.2.1 SPI 基本通讯过程 1.2.2 通讯的起始和停止信号 1.2.3 数据有 ...
- STM32学习之SPI协议(读写FLASH)
关于STM32学习分享 第八章 SPI协议(读写FLASH) 文章目录 关于STM32学习分享 前言 二.代码 1.spi_flash.c 2.spi_flash.h 3.main.c 总结 前言 开 ...
- stm32中spi可以随便接吗_STM32的SPI模式读写FLASH芯片全面讲解
例程完整代码: SPI协议简介 SPI协议,即串行外围设备接口,是一种告诉全双工的通信总线,它被广泛地使用在ADC,LCD等设备与MCU间通信的场合. SPI信号线 SPI包含4条总线,分别为SS,S ...
- 【STM32】使用STM32cubeMX的库读写FLASH数据
前言 做项目时有时候需要对一些数据进行掉电可存储,一般来说可以把这些数据存储到到EEPROM或FLASH,这次项目中我使用到的芯片是STM32F051C8T6,只有64KB的FLASH,没有EEPRO ...
- STM32F103学习笔记——SPI读写Flash(二)
此系列文章是小白学习STM32的一些学习笔记.小白第一次写笔记文章,有不足或是错误之处,请多体谅和交流! 目录 1.软件设计流程 2.SPI初始化 3.SPI发送接收一字节函数编写 4.FLASH ...
- STM32F103配合STM32CubeMX实现SPI读写flash
本人采用的是正点原子的精英STM32F103开发板,其包含一块W25Q128型号的flash芯片.该flash与STM32F103的SPI2相连. 下面根据正点原子提供的开发指南文档,实现FreeRT ...
- RT-Thread 使用FAL多字节读写FLASH
RT-Thread 使用FAL多字节读写FLASH FAL 简介 在RT-Thread上使用FAL 添加SPI 总线驱动 添加SFUD驱动 添加SPI DEVICE 使用SFUD添加SPI 块设备 添 ...
- STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)
推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang 我的网站:h ...
最新文章
- Linq let Concat
- 最小二乘法least square
- 你需要的是持续的服务改进
- javascript总结9:JavaScript三目运算符
- python list 深复制_Python列表的深复制和浅复制示例详解
- SAP Spartacus 服务器端渲染的依赖注入之 ProductPageEventBuilder
- 回归分析预测_使用回归分析预测心脏病。
- JavaScript高级程序设计读书笔记(一)
- 无法在此设备上查看受保护内容_细说丨你想要的Excel保护与加密都在这里
- utilities(matlab)—— l2row/l2col
- SLAM_关于VIO中IMU预积分的讲解
- 三菱MX Component通信应用
- word2007如何删除尾注分隔符
- 百度HI QQ,MSN ,阿里旺旺,贸易通,MSN在线客服,线聊天代码
- 从智慧零售,看腾讯的数字化转型之道
- matlab数学建模-非线性规划(无约束规划、有约束规划)
- ElasticSearch系列十:ElasticSearch搜索技术深入讲解之搜索模板,搜索建议和地理位置搜索
- 雷军:别轻易尝试,要做好准备再去创业
- 虚拟机WindowServer2003共享文件夹
- Maven跳过单元测试配置
热门文章
- 阿里服务器稳定性介绍
- 前端学习从入门到高级全程记录之31(JavaScript高级3)
- 04、Hadoop框架HDFS NN、SNN、DN工作原理
- Java去除空格符号
- mysql年龄最大_使用MySQL子查询选择年龄最大的所有用户?
- java图片闪烁_java在窗口中添加图片做动画,怎么一闪一闪的?
- 深度剖析JAVA软件工程师
- PDF编辑器哪个好,如何把PDF文件拆分成多个文件
- notes系统服务器地址,在Notes客户端和Domino服务器上,服务器地址的缓存(Cache)存放在哪里...
- leejianjun的博客 PHP生成word并可下载