STM32项目开发总结(一)

前些日子用stm32做了一个小项目,现在对项目中出现的一些奇怪问题总结如下。这里不做代码层面的探讨。

首先大致介绍一下项目:该项目希望实现高密的远程数据采集及控制。下位机主控芯片是STM32F1系列芯片,TIAD转换芯片,同时还有Lora射频模块实现无线通信,GPS模块及若干继电器等。

(一)

最初遇到的一个问题是一些Lora模块无法建立通信。Lora模块的具体使用方法这里不做介绍,如要实现点对点通信必须要先向模块发送目标模块的地址与信道信息(实际就是两字0,1)。但是发送数据的时候发现凡是地址或信道包含0x00的模块均难以正常发送,如向0x0A0A模块发送数据后,再向0x0001模块发送数据则必失败。无意中注意到C语言字符串是以 '\0' 结尾的,其ASCII码恰为0x00,而在串口发送数据的时候恰好用到的C语言中字符串处理函数,直接造成0x00被当做字符串结尾二没有发送,后面的额数据也被舍弃。

解决办法也很简单,直接使用STM32库函数中的串口发送函数将地址发送出去。

(二)

第二个问题就比较蹊跷,程序烧到板子里面,第一次跑一遍过程,一切正常,控制与数据采集都没有问题。但如果跑完一遍数据采集之后,在想采集第二次则必然出错,发出的指令对板子不起任何作用,完全按着定义的默认情况跑。因为板子在是靠几个全局变量决定其状态的,命令也是修改全局变量的值。于是就检查全局变量的情况,无论如和修改全局变量,新定义或是改变全局变量的形式,问题依然存在。后来通过串口每个一段时间就打印一下相关全局变量的值,发现在采集数据前一切正常,采集数据之后相关的全局变量消失了,串口在应该出现全局变量的位置直接打印了下一个字符。

推测是内存出了问题,检查发现程序占用内存51k左右,而芯片内存仅48k,更换64k内存芯片问题解决。

(三)

这个问题更是奇怪,板子测试时一切正常,但接上GPS模块,工作一段时间后就会不向应任何指令。难道内存不足的问题又出现了?还是程序跑飞了?进一步调试发现程序在不接GPS模块的时候不会出现问题,同时接不接GPS模块对程序需要多少内存几乎没有影响,因此内存应该是够用的;难道程序跑飞了?但程序对一些指令有一定的相应,但不能完成全部的功能。其实有相应的部分是在串口接收中断部分的代码,板子对串口中断时有响应的。但为何主函数不再执行了呢?仔细检查代码后也没查出什么错误。静下心来整理思路:首先内存够用,其次程序是在正常运行,但没有执行主函数的循环,那程序在执行什么呢?显然单片机应该是在处理一个中断程序,而且长时间难以返回,后者是这个中断不断触发,执行完一次,下一次中断又到来了,而且必与GPS有关。

仔细检查了GPS的工作流程,发现GPS确实后不断发送一个中断信号。由于我们只需要初始化的时候获取一次GPS信息,于是获取完GPS信息后失能了相关中断,问题解决了。

 

对于硬件没有所谓的玄学,只是你的功夫还不到位。

 

你可能感兴趣的:(硬件电路)