IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32在IAP擦除sector时会停止取指操作,也就是MCU卡住了 -> 正文阅读

[嵌入式]stm32在IAP擦除sector时会停止取指操作,也就是MCU卡住了

根本原因

stm32在IAP擦除sector时会停止取指操作,也就是MCU卡住了,这是根本的问题,导致我在研发产品过程中遇到过很多难点。

问题:

我做的都是工业产品,STM32基本不用内部看门狗,要外挂硬件看门狗,常用的硬件看门狗DS1832的复位时间是1秒多,而且这个看门狗是不能关闭的,也就是一上电就一直运行,无论任何情况下,如果喂狗不及时,就会复位。

我的产品支持远程升级功能,也就预示着要做IAP操作,STM32内部的FLASH擦除时间如下:

按最快的32位擦除来算,典型值1秒,最慢达2秒,而在擦除期间FLASH的取指令操作会中止,当然喂狗也就停止了,要命的来了,STM32会在擦除内部块时复位,

解决方法1:

STM32一些高端的单片机,内部都是有2M FLASH空间的,其中分成2部分,比如下面的STM32H7XX的框图,虽然它内部也是2M FLASH,但是从物理上就分成了2块FLASHA? ?FLASHB。

于是我猜测,如果程序在FLASHA中运行,是不是就可以对FLASHB进行擦除操作呢?答案是肯定的,我程序运行在FLASHA,对FLASHB擦除块,在擦除的1秒时间内,SysTick_Handler()中断服务函数可以执行,uwTick记数器变化正常,也就是说FLASHB擦除操作不影响FASHA的取指令,因此为了在擦除FLASH期间,也能够正常喂狗,我在SysTick_Handler()函数中增加了在擦除FLASH时的喂狗操作,擦除完毕后就不再在SysTick_Handler()中喂狗了。

引申:

既然2个物理块FLASH之间可以可以擦除,不影响的对方的取指执行,那么,相信普通STM32内部FLASH也不是铁板一块,应该也是一个个sector组成的,如果2个sector离的比较远,那么有没有可能彼此擦除也是不影响对方的取指令呢? 试验证明,答案是肯定的,

如上图,我的boot程序运行在扇区0~3,如果应用程序运行在扇区5及以上扇区,boot程序在擦除应用区的同时可以正常取指令,但是如果APP放在扇区4,boot程序擦除APP区时就会“卡住”boot程序的运行。(这种方法会存在内部FLASH空间的浪费!)

上面的测试只是经验,没有任何理论依据,也许stm32f407是这样,stm32f405就不是这样,所以要根据你使用的stm32种类来做测试确认。

终极解决方法2:

? ? 根本思路,当stm32擦除内部FLASH时会停止从FLASH取指,这个也好理解:自己擦除自己的时候,怎么还可能从自己内部取数据呢?? 但是我STM32自己擦除自己的时候,能不能响应一个位于内部RAM空间的SysTick_Handler()中断函数,而在SysTick_Handler()内执行喂狗操作。 如果这样能够实现就不用再看内部FLASH块的眼色了,只要是stm32内部flash 扇区,想怎么分配 就怎么分配。就可以充分利用stm32内部FLASH的空间了,

? 这种方法也是可以的,这种方法最大的难点在于,

把中断向量表重新搬移到RAM区,如果中断向量表位于FLASH区,那么擦除内部FLASH时,连中断也进不去,因此取不到中断服务函数的地址,

把中断服务函数也要定位在RAM中,这些都可以在编译时,增加__attribute__((section("RAMCODE")))修饰来实现。

我在测试过程中,参考了官方的一个例子。《KEIL中让程序在RAM中运行的办法.pdf》里面有详细的文档,与例程。

如果要我自己实现,我肯定是手动的把FLASH区的中断向量表一个一个的拷贝到RAM区,但是中这个文档中给出了一个更为简洁的方法,它新建了一个一个汇编文件,文件中定义了一个RESET_ram,把所有的中断向量import到此文件中,这样程序在编译的时候,就会在RAM里自动生成一个备份的中断向量表,我们要做的只是在system_stm32f4xx.c初始化时,重定向一个中断向量表到0x20000000就行了。

终终极解决方法2:

在网上看了一些资料,思路又开阔一些, 既然中断服务函数可以放在RAM中,为什么不把擦除sector函数放在RAM中? 沿着这个思路,又有2个路线:

1,直接定义时就把扇区擦除函数定位到RAM中,

2. 扇区擦除函数不改变,但是在调用擦除函数时,先把擦除函数拷贝到RAM中,然后执行RAM中的擦除函数副本,理论也是可行的。

这2种思路都是理论上的分析,我并没有实现。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:35:28  更:2022-04-01 23:36:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:50:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码