文章出處

先廢話一小段

在將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必須設置一樣(同步字一樣),否則認為是不同網絡

接收機在接收檢測時,會先檢測前導碼的長度,小于設置的最大接收長度時再檢測同步字的內容,看是否一致,都符合時,才會接收負載的內容。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()