先廢話一小段
在將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必須設置一樣(同步字一樣),否則認為是不同網絡
接收機在接收檢測時,會先檢測前導碼的長度,小于設置的最大接收長度時再檢測同步字的內容,看是否一致,都符合時,才會接收負載的內容。
文章列表