江科大笔记—FLASH闪存

FLASH闪存

程序现象:
1、读写内部FLASH
这个代码的目的,就是利用内部flash程序存储器的剩余空间,来存储一些掉电不丢失的参数。所以这里的程序是按下K1变换一下测试数据,然后存储到内部FLASH,按下K2把所有参数清0,最后OIED显示一下。
这里OLED显示Flag、Data 。Flag当做标志位,内容定义为:A5A5。Flag作用:判断之前是不是存储过数据,如果存储过,直接读取;如没有存储过,就先初始化。
Data:是要掉电存储的数据。
在这里插入图片描述
2,读取芯片ID
在stm32里,指定地址下,存储有原厂写入的ID号,使用指针的方式读取,就可以得到ID号。
OLED可以看到,有2个ID号:第一个是F_SIZE,表示芯片FLASH容量。0040表示FLASH容量,单位是KB,换成十进制是64KB。
第二个是U_ID,是96位芯片唯一ID号,每个芯片ID号都不一样。
在这里插入图片描述

STM32内部FLASH闪存简介

在这里插入图片描述
读写FLASH的用途:
利用程序存储器的剩余空间来保存掉电不丢失的用户数据
通过在程序中编程(IAP),实现程序的自我更新

  • 第一个用途,对于我们这个C8T6芯片来说,它的程序存储器容量是64K,一般我们写个简单的程序,可能就只占前面的很小一部分空间,剩下的大片空余空间我们就可以加以利用,比如存储一些我们自定义的数据,而且可以充分利用资源。不过这里要注意我们在选取存储区域时,一定不要覆盖了原有的程序,要不然程序自己把自己给破坏了,一般存储少量的参数,我们就选最后几页存储就行了、

    第二个用途,通过在程序中编程IAP,实现程序的自我更新。我们在存储用户数据时要避开程序本身,以免破坏程序,但如果我们就非要修改程序本身,这会发生什么呢,在程序中编程,利用程序来修改程序本身,实现程序的自我更新,这个在程序中编程就是IAP,是用来实现程序升级的。

在线编程( ICP):这个JTAG SWD就是仿真器下载程序,每次下载都是把整个程序完全更新掉,那系统加载程序就是系统存储器的BOOTLOADER,也就是串口下载,串口下载也是更新整个程序,这就是我们一直在用的ICP下载方式。

  • 在程序中编程( IAP),它可以使用微控制器支持的任意一种通信接口下载程序。实现过程:

    比如这是整个程序存储器,我们首先需要自己写一个BOOTLOADER程序,并且存放在程序更新时不会覆盖的地方,然后需要更新程序时,我们控制程序跳转到这BOOTLOADER这里来,在这里面我们就可以接收任意一种通讯接口传过来的数据,比如串口、USB、蓝牙转串口、WIFI转串口等等,这个传过来的数据就是待更新的程序,然后我们控制flash读写,把收到的程序写入到前面程序正常运行的地方,写完之后再控制程序跳转回正常运行的地方,或者直接复位,这样程序就完成了自我升级。

区别:IAP就是和系统存储器这个的BOOTLOADER一样。系统存储器的BOOTLOADER,只能配置boot引脚触发启动。而我们自己写BOOTLOADER的话,就可以想怎么收怎么收,并且在整个升级过程,程序都可以自主完成。

回顾一下存储器影像

在这里插入图片描述

闪存模块组织

在这里插入图片描述
C8T6芯片的闪存容量是64K,属于中容量产品。

  • 这里分为了三个块,第一个是主存储器,也是程序存储器,用来存放程序代码的,这是最主要也是容量最大的一块。

    第二个是信息块,里面又可以分为启动程序代码和用户选择字节,其中启动程序代码就是系统存储器,存放的是原厂写入BOOTLOA

### STM32 Flash 操作导致设备黑屏的原因分析 在STM32微控制器中,Flash存储器的操作可能涉及擦除、写入或读取数据。如果这些操作未正确执行,则可能导致系统不稳定甚至黑屏现象。以下是几个常见原因及其解决方案: #### 1. **Flash 编程错误** 如果应用程序试图向受保护区域写入数据或者违反了Flash编程规则(例如未对齐地址),可能会触发硬件异常并导致系统崩溃。这种情况下通常会进入HardFault中断[^4]。 #### 解决方法: - 确保每次写入前都先调用`HAL_FLASH_Unlock()`解锁闪存。 - 使用官方库函数如 `HAL_FLASH_Program()` 来完成具体的数据烧录工作。 - 验证目标地址是否有效以及所选页面状态为空闲后再继续下一步动作。 ```c // 示例代码展示如何安全地进行flash操作 void SafeWriteToFlash(uint32_t address, uint64_t data){ HAL_StatusTypeDef status; // Unlock the FLASH to enable erase/write operations. HAL_FLASH_Unlock(); /* Clear pending flags (if any) */ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR| FLASH_FLAG_PGAERR| FLASH_FLAG_PGSERR); // Perform actual write operation here using appropriate function call based on your needs. status = HAL_FLASH_Program(TYPEPROGRAM_DOUBLEWORD,address,(uint64_t)data); if(status != HAL_OK){ Error_Handler(); } // Lock again after finishing all necessary changes. HAL_FLASH_Lock(); } ``` #### 2. **Bootloader与Application之间的兼容性问题** 当从Bootloader切换至主应用时出现问题可能是由于两者之间存在配置差异所致。例如堆栈指针设置不当、寄存器初始化顺序不同步等都会引起不可预期的行为包括但不限于死循环或是完全停止响应进而表现为“黑屏”。 #### 处理建议: 参考给定材料中的uart_boot实现方式可以作为一个例子说明怎样构建一个可靠的重定向流程[^3]: ```c void uart_boot(){ ... boot_ops_t *ptBootOps=(boot_ops_t*)0x08001000;//假设这是有效的入口点位置 ptBootOps->fnGoToBoot(...);//跳转逻辑实际取决于具体的项目需求定义 rt_hw_cpu_reset();//最后重启CPU确保环境干净无残留影响新加载的应用程序正常启动 } ``` 另外值得注意的是某些特殊版本固件可能存在特定限制条件需要特别注意遵循其指导原则才能避免潜在风险。比如提到的关于T5L平台下不同ICL文件生成要求就很有代表性[^2]. #### 3. **屏幕刷新机制冲突** 对于图形界面类的产品来说除了考虑底层驱动层面的因素外还需要兼顾上层框架部分是否存在干扰因素造成视觉上的停滞感即所谓的'假性黑屏'. 这种情况往往是因为绘图缓冲区更新不及时或者是同步信号丢失引起的. 因此应该检查是否有足够的资源分配给了显示任务同时也确认一下定时器等相关外围模块的工作参数设定得合理否从而保障整个系统的流畅运转. --- ### 结论总结 综上所述针对STM32 flash操作引发的黑屏状况可以从多个角度入手排查解决问题根本所在并通过采取相应的预防措施加以规避最终达到稳定可靠的效果.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值