LoRaWAN stack移植笔记(五)__调试1
先废话一小段
在将LoRaWAN的程序移植的过程中,调试发现了很多的问题。
做好记录工作,防止以后再踩坑
移植使用的是LoRaMac-node库,使用的是STM32L151CBT6 MCU,需要要移植到STM32L051C8T6 这个MCU上面。
开始正文
JLink的配置
由于第一次使用JLink(SWD方式),在一开始使用时,踩了几处坑:
- KEIL选择JLINK之后,点击设置进入,会出现一个对话框,要选择NO
- KEIL里面JLINK的 方式要选择SW,不然认不到芯片
- Flash download要选择对应大小的芯片,注意Flash的大小要选择正确
程序无法进入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必须设置一样(同步字一样),否则认为是不同网络
接收机在接收检测时,会先检测前导码的长度,小于设置的最大接收长度时再检测同步字的内容,看是否一致,都符合时,才会接收负载的内容。
您的留言或需求: