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精英开发板串口一键下载电路原理分析

推荐阅读最新更新时间:2024-11-02 00:08

51单片机ADC0809电压表(12864显示,程序 + 仿真)
51单片机ADC0809电压表(12864显示,程序 + 仿真)并口;0~5V先上图正常工作图 上图:最大电压值 上图渐变电压值(最大到最小) 这是仿真图,可以进行仿真 #include reg51.h #include LCD12864.h sbit OE=P3^6; sbit EOC=P3^7; sbit CLOCK=P3^0; sbit ST=P3^3; void Lcd12864_Display(); unsigned char dat = 0.000V ; unsigned int tmp; unsigned char adc; void main() { EA=1; ET0=1; T
[单片机]
51<font color='red'>单片机</font>ADC0809电压表(12864显示,程序 + 仿真)
基于YL-236单片机实训装置的数字电压表的设计方案
  一、引言   数字电压表采用数字化测量技术,可以将模拟量转换成数字量并加以显示。由于其具有测量精度高、抗干扰能力强等优点,被广泛应用于工业自动化仪表领域。下面本文就以亚龙YL-236单片机实训装置为平台,介绍数字电压表的实现方法。   二、方案总体设计   本设计选择AT89C51单片机作为核心控制器件,采用ADC0809实现A/D转换,用3位LED数码管数字来显示采集电压(范围0~5V)。设计框图如图1所示。      三、硬件部分设计   1.转换芯片ADC0809   ADC0809具有8路模拟输入端口,8路模拟开关分时选通8个模拟通道,转换后的8位数字量锁存到三态输出锁存器中,在输出允许的情况下,可以从8
[单片机]
基于YL-236<font color='red'>单片机</font>实训装置的数字电压表的设计方案
51单片机内部定时器使用
/*------------------------------ Function: generate pulse signal Author: Zhang Kaizhou Date: 2019-5-15 22:50:43 ------------------------------*/ #include reg51.h #define uchar unsigned char sbit output = P1^0; uchar period = 250; uchar high = 50; uchar tcount = 0; void timer0() interrupt 1 using 1 { TH0 = (655
[单片机]
关于单片机IO口详解
个人总结: 这八种必须弄懂!!!! 最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 ,应用ADC模拟输入,或者低功耗下省电 (2)GPIO_Mode_IN_FLOATING 浮空输入,可以做KEY识别,RX (3)GPIO_Mode_IPD 下拉输入 ,在没有信号输入的时候,下拉电阻能使读取input值保持为低,类似推挽,主要是为了增强驱动能力 (4)GPIO_Mode_IPU 上拉输入 ,在没有信号输入的时候,上拉电阻能使读取input值保持为高,类似推挽,主要是为了增强驱动能力,电阻同时起限流作用!弱强只是上拉电阻的阻值不同
[单片机]
关于<font color='red'>单片机</font>IO口详解
51单片机学习——8.1外部中断0和1
外部中断原理 外部中断0:(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。 外部中断1:(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。 编程原理(外部中断0) 首先我们对中断允许控制寄存器IE赋值,打开中断总开关,令EA=1. 然后我们还需要打开外部中断0的开关,令EX0=1 EX0(IE.0),外部中断0允许位; ET0(IE.1),定时/计数器T0中断允许位;
[单片机]
51<font color='red'>单片机</font>学习——8.1外部中断0和1
C语言_浮点数_IEEE 754标准_单片机_浮点数精度
IEEE 754标准 浮点格式可分为符号位s,指数位e以及尾数位f三部分。 其中真实的指数E相对于实际的指数有一个偏移量,所以E的值应该为e-Bias,Bias(127)即为指数偏移量。这样做的好处是便于使用无符号数来代替有符号的真实指数。尾数f字段代表纯粹的小数,它的左侧即为小数点的位置。规格化数的隐藏位默认值为1,不在格式中表达。 在IEEE-754 标准下,浮点数一共分为: NaN:即Not a Number。非数的指数位全部为1 同时尾数位不全为0。在此前提下,根据尾数位首位是否为1,NaN 还可以分为SNaN 和QNaN 两类。前者参与运算时将会发生异常。 无穷数:指数位全部为1 同时尾数位全为0。大。 规
[单片机]
C语言_浮点数_IEEE 754标准_<font color='red'>单片机</font>_浮点数精度
单片机制作媚眼激活仪的c代码
这是一个完整的用51系列单片机做的媚眼激活仪的代码,有这方面需要的朋友可以看看,代码已经测试成功。 /* 项目名称:单片机媚眼激活仪器 相关知识点:单片机驱动发热器件,数码管显示,按键操作等。 程序开发:http://www.51hei.com单片机教程网。 */ #include reg51.H #define uint unsigned int #define uchar unsigned char #define duan P0 //将P1口段显示定义为duan标号 #define keyio P3 //将P3口设为按键检测的端口 uchar time,guannum,guantime1,guantime2;//tim
[单片机]
基于单片机的高速信号测试接口板的实现
  在数字电路设计和调试中,对设计单元电路的性能进行实时测试是必不可少的环节。很多情况下,需要通过计算机的比较和分析,来测试设计的电路的性能是否达到要求。这就需要设计一个测试接口板,将计算机产生的测试数据送入单元电路,再将单元电路的输出结果送回计算机。 在电路测试接口板的设计过程中,常常会遇到总线时钟频率较高(如40 MHz以上)、总线宽度较宽(如36 b)、要求测试的数据量较大(几Mb/s)的单元电路。这时实时地进行数据的双向传输比较困难,因为不论采用总线频率较高的PCI数据总线或USB总线[1],都达不到系统要求的数据传输速率,所以必须进行数据的缓存。考虑到PCI总线和USB总线的接口电路复杂、开发周期长,本文介绍一种采用单片
[测试测量]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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