stm32中flash的体会

在STM32单片机中,要读取某个地址的值,可以通过指针方式进行操作。以下是具体的步骤:

  • 定义一个指向目标地址的指针变量。
uint32_t *ptr = (uint32_t *)0x08000000; // 将指针ptr指向地址0x08000000
  • 通过指针变量来读取该地址的值。
uint32_t value = *ptr; // 读取0x08000000地址上的32位无符号整数数据


那么为什么不可以直接一步定义出来?

uint32_t ptr =* (uint32_t *)0x08000000;

原因是在 C 语言中,类型转换操作符 () 具有更高的优先级,因此该表达式会被解析为将地址 0x08000000 转换为 uint32_t 类型,然后再通过 * 运算符进行解引用。这样的操作会导致编译错误。

关于stm32地址写入问题

  • 在这里插入图片描述

图片左侧为代码运行后地址中的值,右侧为keil编写的代码。
笔者这里使用的单片机flash为256kb,最大地址为0x08040000。所以当写入最大地址,毋庸置疑是错误的。

  • 在这里插入图片描述

如图所示,在0x0803FFFF中,可以写入到flash地址中,这时候,发现串口无法发送数据,经过仿真发现,程序卡死写地址这里。造成原因很可能是地址溢出。

  • 在这里插入图片描述

所以这时候尝试把地址提前,选择写入0x0803FFFC,系统正常运行没有发现问题。那么为什么会是这样?
点击FLASH_ProgramWord(然后按F12或者右键go to…)函数发现里面第二个参数类型为 uint32_t

这是由于 Flash编程和擦除的操作都需要使用16位或32位数据,这些数据是按照大端模式进行传输的,即高字节在前,低字节在后。

  • 在这里插入图片描述

这个时候,同时写入两个数据(如果连续的话使用循环),如果第二个数据占用了第一的,是否会发生覆盖呢?答案是:会的。但同时又发现另一个问题,那就是当写入的地址为奇数,比如0x0803FFF7,0x0803FFF9等,是无法写入的,并且把这块地址邻近的数据的值全部变成了FF

结论:
如果尝试使用奇数地址进行写入,由于写入操作以半字为单位,将无法正确写入数据,并且可能会导致其他问题,如数据损坏或读取错误。

因此,在使用Flash_programword函数进行写入操作时,首地址必须是偶数地址,这样才能确保数据正确地写入到片上闪存中。

如有错误,感谢指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值