STM32G031G8U6单片机内部FLASH读写简单学习

发布者:美好回忆最新更新时间:2024-06-03 来源: elecfans关键字:单片机  内部FLASH读写 手机看文章 扫描二维码
随时随地手机看文章

此篇限定研究范围为FLASH区域的访问规则。


以下结论均为实测所得:


一、读


1.单字节读例程,单字节读可以从任意地址开始读


uint8_t STMFLASH_ReadByte(uint32_t faddr)

{

  return *(volatile uint8_t*)faddr; 

}

2.半字(2个字节)读例程, 半字读只能从偶数地址开始读 ,从奇数地址读的话单片机就死机了


uint16_t STMFLASH_ReadHalfWord(uint32_t faddr)

{

  return *(volatile uint16_t*)faddr; 

}

3.字(4个字节)读例程, 按字读只能从4的整数倍地址开始读 ,否则单片机死机


uint32_t STMFLASH_ReadWord(uint32_t faddr)

{

  return *(volatile uint32_t*)faddr; 

}

二、写


1.单次写入字节数:


我看G0x1的技术参考手册上说一次写入是72bit(64bit加ecc),我实际测试是单次写入只能是32bit,以实际测试为准


(1)单字节写,写不了,单片机死机


我在HAL库里面把库函数FLASH_Program_DoubleWord改成如下进行验证的


``


static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)


{


/* Set PG bit */


SET_BIT(FLASH->CR, FLASH_CR_PG);


*(uint8_t *)Address = (uint8_t)(Data&0xff);__ISB();


*((uint8_t *)Address+1) = (uint8_t)((Data>>8U)&0xff);__ISB();


*((uint8_t *)Address+2) = (uint8_t)((Data>>16U)&0xff);__ISB();


*((uint8_t *)Address+3) = (uint8_t)((Data>>24U)&0xff);__ISB();


*((uint8_t *)Address+4) = (uint8_t)((Data>>32U)&0xff);__ISB();


*((uint8_t *)Address+5) = (uint8_t)((Data>>40U)&0xff);__ISB();


*((uint8_t *)Address+6) = (uint8_t)((Data>>48U)&0xff);__ISB();


*((uint8_t *)Address+7) = (uint8_t)((Data>>56U)&0xff);


}


``


(2)**半字写,写不了,单片机死机


我在HAL库里面把库函数FLASH_Program_DoubleWord改成如下进行验证的


static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)

{

  /* Set PG bit */

  SET_BIT(FLASH->CR, FLASH_CR_PG);



  *(uint16_t *)Address = (uint16_t)(Data&0xffff);__ISB();

  *((uint16_t *)Address+2) = (uint16_t)((Data>>16U)&0xffff);__ISB();

  *((uint16_t *)Address+4) = (uint16_t)((Data>>32U)&0xffff);__ISB();

  *((uint16_t *)Address+6) = (uint16_t)((Data>>48U)&0xffff);


}

(3)按字写(4个字节,32bit),可以,HAL库函数FLASH_Program_DoubleWord里面就是按字写的


static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)

{

  /* Set PG bit */

  SET_BIT(FLASH->CR, FLASH_CR_PG);



  /* Program first word */

  *(uint32_t *)Address = (uint32_t)Data;



  /* Barrier to ensure programming is performed in 2 steps, in right order

    (independently of compiler optimization behavior) */

  __ISB();



  /* Program second word */

  *(uint32_t *)(Address + 4U) = (uint32_t)(Data >> 32U);


}

(4) 按64bit写, 写不了,单片机死机


我在HAL库里面把库函数FLASH_Program_DoubleWord改成如下进行验证的


static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)

{

  /* Set PG bit */

  SET_BIT(FLASH->CR, FLASH_CR_PG);

  

  *(uint64_t *)Address = (uint64_t)Data;

  }

2.写入的首地址规则


经过实际验证得出:**写入首地址必须为8的整数倍,不然就会发生错误:如果为4的整数倍但不是8的整数倍,单片机不会死机,但是写入的值全部变成0x3F,其他既不是4的整数倍也不是8的整数倍的地址,单片机会死机。


按以下代码改变写入首地址即可进行验证


STMFLASH_Write(FLASH_CALIBRATION_ADDR+8,String,sizeof(String));

HAL_Delay(10);

STMFLASH_Read(FLASH_CALIBRATION_ADDR,buffer,sizeof(String)/4+1);

HAL_Delay(10);

Uart_Send_Data(buffer, sizeof(String));


关键字:单片机  内部FLASH读写 引用地址:STM32G031G8U6单片机内部FLASH读写简单学习

上一篇:STM32驱动ESP8266连接阿里云(2)----接入阿里IoT Studio实现Web可视化
下一篇:正点原子stm32精英开发板串口一键下载电路原理分析

推荐阅读最新更新时间:2026-03-19 22:42

STM32F4读写内部FLASH【使用库函数】
STM32F4Discovery开发帮使用的STM32F407VGT6芯片,内部FLASH有1M之多。平时写的代码,烧写完之后还有大量的剩余。有效利用这剩余的FLASH能存储不少数据。因此研究了一下STM32F4读写内部FLASH的一些操作。 【STM32F4 内部Flash的一些信息】 STM32F407VG的内部FLASH的地址是:0x08000000,大小是0x00100000。 写FLASH的时候,如果发现写入地址的FLASH没有被擦出,数据将不会写入。FLASH的擦除操作,只能按Sector进行。不能单独擦除一个地址上的数据。因此在写数据之前需要将地址所在Sector的所有数据擦除。 在STM32F4的编程手册上
[单片机]
STM32F4<font color='red'>读写</font><font color='red'>内部</font><font color='red'>FLASH</font>【使用库函数】
MC9S12G128 内部flash与eeprom的读写配置
因为MC9S12G128 有内部flash和eeprom所以不需要用到 sci来通信。 并且MC9S12G128的flash与eeprom是共同管理的所以存取方式相同,只是地址范围不同。如下表所示 flash module的初始化 void eeprom_Init(){ while(FSTAT_CCIF==0); //等待正在处理的FLASH操作完成 FCLKDIV=0x17; //外部晶振为24M.FLASH时钟不超过1M while(FCLKDIV_FDIVLD==0); //等待时钟设置成功 }其中FCLKDIV的设置是根据busclock来进行选择的,我用的是24M
[单片机]
STM32f103 —— 内部flash读写
#ifndef _MCU_FLASH_H_ #define _MCU_FLASH_H_ #include stdint.h // STM32f103C8T6 64KB FLASH,20KB RAM,1个扇区1KB,程序起始0x8000000 #define FLASH_START_ADDR ((uint32_t)0x8000000) #define FLASH_END_ADDR ((uint32_t)(0x8000000 + FLASH_SECTOR_NUM * FLASH_SECTOR_SIZE)) #define FLASH_SECTOR_NUM 128 // 扇区数量 #define FLASH_SECTOR
[单片机]
STM32--读写内部Flash
Flash模块组织 存储器被组织为程序存储器模块,数据EEPROM模块和信息块。 程序存储器块分为4 KB的扇区,每个扇区都是进一步分成16页,每页256字节。 程序存储器页面擦除 该操作用于擦除程序存储器中的页面(64个字)。要做到这一点: ●解锁FLASH_PECR寄存器 1.将PEKEY1 = 0x89ABCDEF写入编程/擦除密钥寄存器(FLASH_PEKEYR) 2.将PEKEY2 = 0x02030405写入编程/擦除密钥寄存器(FLASH_PEKEYR) ●解锁程序存储器 ●解锁FLASH_PECR寄存器 1. 将PRGKEY1 = 0x8C9DAEBF写入程序存储器密钥寄存器 (FLASH_
[单片机]
STM32--<font color='red'>读写</font><font color='red'>内部</font><font color='red'>Flash</font>
STM32L152XX--读写内部Flash
Flash模块组织 存储器被组织为程序存储器模块,数据EEPROM模块和信息块。 程序存储器块分为4 KB的扇区,每个扇区都是进一步分成16页,每页256字节。 程序存储器页面擦除 该操作用于擦除程序存储器中的页面(64个字)。要做到这一点: ●解锁FLASH_PECR寄存器 1.将PEKEY1 = 0x89ABCDEF写入编程/擦除密钥寄存器(FLASH_PEKEYR) 2.将PEKEY2 = 0x02030405写入编程/擦除密钥寄存器(FLASH_PEKEYR) ●解锁程序存储器 ●解锁FLASH_PECR寄存器 1. 将PRGKEY1 = 0x8C9DAEBF写入程序存储器密钥寄存器 (FLASH_
[单片机]
STM32F4读写内部FLASH【使用库函数】
STM32F4Discovery开发帮使用的STM32F407VGT6芯片,内部FLASH有1M之多。平时写的代码,烧写完之后还有大量的剩余。有效利用这剩余的FLASH能存储不少数据。因此研究了一下STM32F4读写内部FLASH的一些操作。 【STM32F4 内部Flash的一些信息】 STM32F407VG的内部FLASH的地址是:0x08000000,大小是0x00100000。 写FLASH的时候,如果发现写入地址的FLASH没有被擦出,数据将不会写入。FLASH的擦除操作,只能按Sector进行。不能单独擦除一个地址上的数据。因此在写数据之前需要将地址所在Sector的所有数据擦除。 在STM32F4的编程手册上可找到F
[单片机]
STM32F4<font color='red'>读写</font><font color='red'>内部</font><font color='red'>FLASH</font>【使用库函数】
恩智浦MCX微控制器全景式解读
恩智浦不仅为未来做好准备,更以技术主动塑造未来格局。我们对微控制器创新的承诺,既非一时的转向,也非短期策略,而是始于上世纪80年代、延续至今的长期投入,并在当下以更坚定的步伐持续推进。 在其他企业纷纷转移重心或退出该领域之际,恩智浦选择逆势加码。我们坚信嵌入式技术拥有改变世界的力量。能够在这一行业长期深耕的企业寥寥无几,而我们之所以始终如一,是源于对客户的高度责任感,以及对下一代工程师推动智能系统未来发展的使命担当。无论是积极应对《网络弹性法案》(CRA),还是在微控制器上实现TinyML,我们始终致力于推动技术变革,赋能未来发展。 MCX:微控制器的未来,源自恩智浦的深厚积淀 从创新的Motorola 68K处理器
[嵌入式]
恩智浦MCX<font color='red'>微控制器</font>全景式解读
Microchip推出PIC32CM PL10 MCU系列,进一步扩展其 Arm@ Cortex@-M0+产品组合
Microchip推出PIC32CM PL10 MCU系列,进一步扩展其Arm® Cortex®-M0+产品组合 该低功耗器件支持5V运行,在实现高性能的同时,能有效保障系统简洁性与成本效益 基于在低功耗、高性价比及易开发嵌入式应用领域数十年的经验积累,Microchip Technology (微芯科技公司)今日宣布为 其PIC32C系列Arm ® Cortex ® -M0+内核产品组合新增PIC32CM PL10单片机(MCU) 。PL10系列MCU具备丰富的独立于内核的外设(CIP)、支持5V运行,并集成触摸功能、工具集及安全合规特性。该系列器件面向工业控制、楼宇自动化、家用电器、电动工具及传感器系统等大量应用领域。
[单片机]
Microchip推出PIC32CM PL10 <font color='red'>MCU</font>系列,进一步扩展其  Arm<sup>@</sup> Cortex<sup>@</sup>-M0+产品组合
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved