前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R&D奇谭 第7期: 读写Flash时,要不要关中断?

R&D奇谭 第7期: 读写Flash时,要不要关中断?

作者头像
用户2366192
发布2022-12-06 19:03:41
8730
发布2022-12-06 19:03:41
举报
文章被收录于专栏:TopSemic嵌入式TopSemic嵌入式

关中断,还是开中断?这是个问题。

前一段十一期间,当大家都在休假嗨皮时,在TopSemic交流群里,有几个同学似乎还在学习,而且展开了一场激烈的讨论。

大家知道,在单片机运行的时候,经常有一些数据需要保存,而且即使掉电后,这些数据也不能丢失。用一片EEPROM,如24C02可以解决,但是这会增加成本。所以,一个比较常用的办法,是把数据存入单片机的Flash,这种方法叫IAP(In Application Programming)。

此方法虽然省钱,但用的不对也会带来各种困扰,看看大家的讨论就知道了:

我们先看一下Flash的原理,然后探讨一下写程序时,有什么需要注意的。现在单片机中集成的一般是Nor Flash,这种技术是Intel在1988年推出的,它利用浮栅场效应管(Floating Gate MOSFET)存储程序或数据。简单来说,浮栅就像一个囚禁电子的笼子,通过在栅极加正向电压,可以把电子捕获到笼子里,通过加负电压,可以把电子从笼子里全部赶走。而数据的读取,是通过检测栅极中有没有存储电子,这一过程不会导致浮栅中电子的状态改变。

(From Technical Note by Macronix International)

这样,我们很容易理解,在擦写Flash的时候,不应该去读Flash。回到开始的问题,在程序擦写Flash期间,是不是应该把中断关掉呢?因为我们知道中断向量表,默认是存放在Flash中的。真不一定,还是需要具体情况具体分析。一些早期的单片机,擦写Flash的代码,需要拷贝到RAM里执行,并且必须关闭所有中断,否则会出错。但是现在推出的单片机,一般都引入了Stall机制,在擦写Flash的时候,读Flash的操作会被阻止,擦写完之后,才能继续执行。

比如STM32F030手册中,有以下描述:

我们可以用程序观察一下。程序里有一个1ms中断,每进入一次中断翻转一次引脚,在主程序的循环中,每1S执行一次Flash页擦除操作。可以看到擦除Flash一个页用了21.9ms。在擦除期间,1ms中断停止响应,擦完后1ms中断继续执行。

如果程序对中断响应要求特别高,比如精确计时,或者中断需要马上响应,可以把中断向量表和中断响应代码都放到RAM中执行,有兴趣的同学可以自己试一下。

再有一种情况就是,如果单片机中有两个以上的Flash Bank,中断向量表在一个Bank中,那么擦写其它Bank时,中断响应是不受影响的。

参考资料:

Program/Erase Cycling Endurance and Data Retention in NOR Flash Memories. Macronix

STM32F030RM. ST

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TopSemic嵌入式 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档