LoRaWAN stack移植笔记(五)__调试1

先废话一小段

在将LoRaWAN的程序移植的过程中,调试发现了很多的问题。

做好记录工作,防止以后再踩坑

移植使用的是LoRaMac-node库,使用的是STM32L151CBT6 MCU,需要要移植到STM32L051C8T6 这个MCU上面。

开始正文

JLink的配置

由于第一次使用JLink(SWD方式),在一开始使用时,踩了几处坑:

  1. KEIL选择JLINK之后,点击设置进入,会出现一个对话框,要选择NO

  1. KEIL里面JLINK的 方式要选择SW,不然认不到芯片
  2. 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必须设置一样(同步字一样),否则认为是不同网络

接收机在接收检测时,会先检测前导码的长度,小于设置的最大接收长度时再检测同步字的内容,看是否一致,都符合时,才会接收负载的内容。

邮箱地址:454626653@qq.com 欢迎咨询搭讪
说明:LPWA物联网应用站(LPWAP.com)通过公开互联网收集、整理并转载有关LPWA物联网应用解决方案,以供广大LPWA应用开发者和爱好者共同学习交流和参考运用到实际生产生活中。本站所有转载的文章、图片、音频、视频等资料的版权归版权所有人所有并衷心感谢您的付出,由于本站采纳的非本站原创文章及图片等内容无法一一联系确认版权者,如果本网所选内容的文章原创作者认为其作品不宜放在本站,请及时通过以下留言功能通知我们采取适当措施,避免给双方造成不必要的经济损失。如果您希望保留文章在本站,但希望文章末尾提供对作者的致谢或者产品、网站交换链接的,也请将需求写入以下留言栏中,谢谢您的支持。让我们共同努力,打造万物互联的未来美好生活!

您的留言或需求: