1、现象:在做远程升级时,程序从备份区域读取到APP区域并校验成功之后,程序执行到GPRS模块时,始终在执行设置模块的第一句话。
原因分析:原来以为和GPRS模块有关系,后来分析发现程序没有进入串口中断,进而发现是由于没有给串口中断设置偏移量(NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);在中断优先级配置处设置),
总结:发现问题,不要着急,从问题的根源通过串口/LED灯一步一步打印分析。
2、现象:在做远程升级时,串口接收到APP数据之后校验不通过。
分析原因:第一 校验函数不对(传参有错),第二 读取Flash数据时,读的数据个数不对。
总结:写代码时自己挖的坑,冷静。
3、现象:远程控制器项目用GPRS联网MQTT注册不上去
原因分析:通过网络调试助手,让设备连接到本地网络,观察设备发送的注册数据,发现数据最后两个字节不稳定。反推终于发现定义的数组太小。
总结:写代码时没有理解清楚前辈代码的含义,一味模仿。
4、现象:调试断电保存功能时,只有第一次有作用,第二次断电重启现象都是默认全亮,逻辑上也没有问题。
原因分析:Flash写0有效,写1无效,因此在每次写入数据之前需要将Flash相应空间擦除(擦除后数据均为FF);内部Flash为512kb为大容量,小于512kb为小容量。在stm32f10x_flash.c里面FLASH_Status FLASH_ErasePage擦除页函数有区别擦除的是2k还是1k,大容量擦除2k,小容量擦除1k。
5、现象:STM32F103单片机连接SIM800C模块,再DEBUG模式下模块可以运行,在普通模式下,开机给模块发送AT指令,模块没有返回;
原因分析:单片机上电之后,模块启动需要一段时间,在模块启动之前加一个5秒的延时,这里还涉及到另一个硬件连接问题,STM32F103测试板应该通过4根线(电源正/电源负/USART_RX/USART_TX)就可以连接上SIM800C模块,但是在RT-thread系统提供的软件包里面还涉及到模块的软复位和一个检测模块状态的引脚,由于检测模块状态引脚错连到网络状态引脚,软复位引脚在模块上直接接地,单片机对应的引脚接到了模块断电复位引脚,导致系统一直硬件复位,有时也可以连接成功,换了个电源供电问题好多了(怀疑电源纹波干扰)。
总结:在接手新项目的时候首先要简单做一个开发计划,把硬件部分和软件部分理清楚,再着手进行开发,嵌入式软件开发都是有迹可循的,根据调试信息一步一步分析既可,根据程序运行现象判断。
6、现象:pvd断电存储进不了中断。
原因分析:首先是因为中断分组配置不对,并且没有初始化PVD时钟。其次在调试这部分的时候最好不要用DEBUG模式(可能由于DEBUG模式程序运行太慢导致程序进不了pvd中断),最好使用打印输出;第二种可能性是 pvd_Init()函数调用的太早(需要放在初始化硬件的最后面),原因是上电之后进了一次pvd中断,将结构体里面的参数全部设置为零,然后保存,在程序读取出来之后发现数据部分全是零,在程序掉电之后结构体数据确实已经保存起来了,只不过是在上电之后,程序再次进入中断,并将零保存到存储结构体数据的位置。