关中断,还是开中断?这是个问题。
大家知道,在单片机运行的时候,经常有一些数据需要保存,而且即使掉电后,这些数据也不能丢失。用一片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时,中断响应是不受影响的。
你见过喷气式奔驰跑车吗?插上翅膀,估计就能飞了!
中国厂商的崛起,三星电子恐无法实现其销售目标
江苏联通为5G+AI+云网融合构建适配toC和toB行业的网络上下行能力
贸泽开售TI UCC12050和UCC12040 DC-DC转换器,可提供500mW的隔离电源
艾为第3代高灵敏度可编程电容触控芯片AW933xx系列,实现可靠人体接近检测和精准触摸手势识别
读写Flash时要不要关中断
生活那么多寒冷,今天不用害怕了
详解深度学习、神经网络与卷积神经网络的应用
内置高压启动、自供电模块!低成本高精度待机电源芯片CR3215H
小米MIX3评测 性价比不错同时体验足够全面
为什么企业都开始更替为IP通讯系统IP通讯系统可以带来什么价值
远翔FP7195降压恒流PWM转模拟调光IC
谐振复位双开关正激变换器的研究
高通骁龙660即将发布,OPPOr11大曝光,这样的OPPO值的等待!
SpaceX重型猎鹰获瑞典卫星公司订单
高压大容量电解放电简法
电视机背面的接口你了解哪一些?
浅谈谐波滤波器工作原理
华为发布智能云网解决方案,打造行业数字化转型基座
MCU OTA升级与Linux OTA升级