写一个2G DTU网络应用,主控为某大厂MCU,稳定性可靠,业界领先,建工程,开外设,固定参数下数据测试,顺分顺水;但就在配置参数读写flash部分出现了异常,首次上电读写正常,然后就会随机性的导致程序重启;兵来将挡,水来土掩,拿起仿真工具一阵debug,结果,,,当然是没有结果,无奈之下,先喝口水,找找静静(:)先静一静)。
找完静静(:)),回过神来先推到之前已完成的工程,重新开始。先阅读芯片Datasheet和Reference manual,新建工程,根据原理图初始化GPIO,LED灯闪起来再说;然后初始化几个串口和定时器,收发数据依然OK,之前既然在通过串口和程序交互时会重启,那就先不要Flash读写部分,先高速测试一段时间,继续去看手册、芯片官网、论坛等相关的资料;一段时间的测试还是没有出现问题,那么先前的程序是没有问题的,继续下一步,写AT命令解析代码,AT命令测试,依旧正常;然后就开flash,保存用户参数,问题出现了,上电读取参数正常,但是在向flash指定地址写数据时就出现了重启的现象;很是奇怪,防止程序出现问题,在裁剪库文件的时候特地保留了flash部分,直接调用的库函数,其它外设都直接写了寄存器或者自己封装了函数;多次试验,偶尔能写成功,大部分时候重启。
无资料可循,那就只能靠自己了,开始翻脑子里的记录,之前写的大厂MCU都没有这个现象,有的还是裁剪掉库,自己写的寄存器;就在回味之前封装的那些flash程序时,发现有开关总中断这一说,然后去找我的程序,果然,这程序中没有这东西。没有那就加上,就在写flash的入口加了关总中断,擦写完开总中断后,编译,烧录,上电,AT交互,顺风顺水,世界清静了。
测试了几周,没有出现问题,不得不痛骂自己反应迟钝,程序中开了不少的中断,flash程序也写了不少,竟然忽略了关总中断这么重要的一步。唉,,,先记下来,下次再看看加深印象。flash操作主要注意以下几点:
1.需要flash初始化时必须先初始化;
2.先擦后写(不一定,有的貌似可以不擦,直接改原来的数据);
3.擦写前先关总中断,防止擦写过程中被打断出现问题,擦写完开总中断,不然有中断的程序不能正常工作;
4.注意擦、写、读的单位长度(字节、半字、字);
5.操作地址要合法,不得超出该芯片最大存储地址,不得包含程序存储地址,不然会导致程序错乱,运行不正常;
6.电源需要稳定,大多需要高压擦写,如果电源不稳,可能不正常;
7.主频稳定,系统主频不稳定的话也可到出现错误。
先写这几点吧,若有错误,还望指正。
原文:https://www.cnblogs.com/teasy/p/12188000.html