STM32G031G8U6单片机内部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));

DCM是什么?DCM在AUTOSAR中的位置
SSB单边带发射机-制作
由555定时器组成的单稳态触发器
广汽集团宣布与华为公司合作共同开发L4级自动驾驶汽车
片上光学深度神经网络
STM32G031G8U6单片机内部FLASH读写简单学习
美光176层NAND数据中心SSD满足未来数据中心应用需求
美国商业部禁运中兴事件出现戏剧性转折
深开鸿联合东方创科赋能K12素质教学
DCA1000EVM软件触发的方式
人工智能技术将助力语言沟通的无障碍
云服务器中的CXL内存扩充与池化
常见的永磁电机的应用场景
UV LED的发展历史与市场趋势
国内电力企业正在大面积推广智能巡检机器人
三星公布了新一代高端处理器 性能提升关键在于7纳米制程
鸿蒙系统和安卓系统哪个好
RT-Thread NUC97x 移植 LVGL
树根互联联合创始人、CEO贺东东:树大根深,中国智造
Qualcomm:使用QDN异构计算工具开发项目