本帖最后由 MTCN2013 于 2017-1-31 14:49 编辑
先废话一小段在将LoRaWAN的程序移植的过程中,调试发现了很多的问题。 做好记录工作,防止以后再踩坑 移植使用的是LoRaMac-node库,使用的是STM32L151CBT6 MCU,需要要移植到STM32L051C8T6 这个MCU上面。 开始正文JLink的配置由于第一次使用JLink(SWD方式),在一开始使用时,踩了几处坑: - KEIL选择JLINK之后,点击设置进入,会出现一个对话框,要选择NO
-
程序无法进入main,甚至一个函数都没有跑当配置完JLink之后,程序可以正常烧写调试了,但是问题又出现了,无法跑进main函数,再进一步调试,发现来一个函数都没有执行,直接就进入进入死循环了(通过单步调试看上面的汇编代码)。这个现象就很奇怪了,以前也没有碰到过。
因为3.3V和GND是正常的,这样就算晶振有问题,也会执行程序到配置晶振才会出问题,而不是一句函数都没有执行。
后来顿悟,大概是BOOT0没接,仔细一看原理图,果然BOOT0是悬空的,飞线焊上之后,问题终于得到了解决。 NOTE:画原理图时一定要主要,BOOT0一定要接地,这样程序才能正常从FLASH启动RTC定时链表的配置官方的库中使用了RTC来作为定时器来处理一些定时的事件,这也是库中唯一的任务调度机制。所以保证这个机制的正常运行非常重要。 但是,当我把一切参数都配置完成之后,却发现,RTC的定时器不听使唤,经常不进入中断,初步诊断是写入寄存器的定时时间出了问题,但是却找不到出问题的原因。 这个问题也是非常的诡异,至今还未发现原因。 但是在一次偶然的调试中,我将原本处于 static void RtcStartWakeUpAlarm( uint32_t timeoutValue )
这个函数中的 RtcCalendar_t now;RtcCalendar_t alarmTimer;RTC_AlarmTypeDef alarmStructure;
这三个变量由局部变量改为了全局变量,问题就得到了解决。 但是原因还未发现。原本以为是变量未赋初值就使用,但是程序中都有在使用前赋初值,具体原因不明。 程序进入Default_handler在调试程序的时候,程序又出现跑死的情况,然后单步调试发现程序进入了Default_handler这里,始终无法跑出来。 然后通过搜索得知,进入这里的情况应该是发生了中断但是没有处理,然后程序一直进入中断。 后来查看代码发现,由于Cotex-M3和cotex-M0的核,对GPIO的中断的入口是不一样的,在移植时需要做修改,在做了修改之后,程序终于跑正常了。 无法点对点通信需要注意的是,点对点通信中,能够建立条件需要两个点的通信参数配置成相同。 特别注意的是iqInverted preamble SYNCWORD note:1. 如果发射方使能了iqInverted,那么接收方也要使能iqInverted 2. 接收方的preambleLen必须设置大于发射方,否则有很大可能接收不到(偶尔可以收到,但是接收成功率很低)3. 发射方和接收方的SYNCWORD必须设置一样(同步字一样),否则认为是不同网络接收机在接收检测时,会先检测前导码的长度,小于设置的最大接收长度时再检测同步字的内容,看是否一致,都符合时,才会接收负载的内容。
|