硬件介紹
- 底盤:幻爾阿克曼底盤;2個直流霍爾電機、1個PWM舵機
- 開發板:幻爾Ros Controller V1.2(STM32F407VET6)
- 電源:因為是學習階段,沒有配電池,使用120W可調電源(3V~12V)
- 屏幕:0.96存OLED
- 藍牙:藍牙轉串口接收器
過程文檔及資源
鏈接 | 說明 |
---|---|
https://gitee.com/jori-wang/car-demo.git | 源代碼地址。從SPL -> STM32CubeMX+LL -> STM32CubeMX+LL+FreeRTOS |
https://gitee.com/jori-wang/mcu-tool-set.git | 所有需要用到的軟件工具及說明 |
https://gitee.com/jori-wang/hardware-dataset.git | 所有用到的資料。開發板說明、芯片手冊等 |
遇到的問題及解決方案
使用UART通信時,設置的波特率和實際值不匹配
進行單片機開發的第一步就是時鐘設置。
本人沒有進行時鐘設置導致實際時鐘頻率(HSE 16MHz)和代碼使用的時鐘頻率(HSE 25MHz)不匹配,導致上述問題。
所有頻率不匹配的問題,幾乎都和時鐘相關
將printf映射到串口時,重寫 fputc 函數導致系統卡死(沒進main函數)
使用 printf
需要導入 <stdio.h>
但是單片機沒有標準C中的對應實現(硬件不一樣),因此有以下三種解決方法:
- 使用
MicroLib
; - 自己實現并覆蓋默認實現(
void _sys_exit(intx)
和定義結構體struct __FILE
); - 如果使用Keil開發,在
Run-Time Environment
中勾選STDERR-ITM
。將消息重定向到調試面板(debug window)
調試模式下系統卡死,沒有觸發斷點
默認情況下,進調試模式系統會在 main 函數的最開始觸發一個斷點,開發者需要手動點擊 continue 才能繼續執行。
所以如果沒有進 main 函數,那就說明代碼在啟動時就出錯了或者觸發了死循環。大概率時出錯了。
此時可以觀察調用棧,斷點停留在哪個函數,然后觀察寄存器中的數據;同時通過watch功能觀察函數體中變量的值,來排查可能的錯誤。
這種情況,大概率是缺少函數實現(如前面的 stdio 導致的程序卡死)
調試模式代碼正常,直接運行系統無反應
排查時鐘問題;排查代碼報錯;排查宏定義值。
調試模式有兩點比較特殊:
- 人為增加延時。雖然斷點停止了代碼的執行,但是硬件電路還在實際工作,此時斷點人為引入delay;部分場景下會導致報錯代碼被跳過
- 調試模式不一定會重置所有參數值,特別是全局參數;預編譯宏等
如果調試模式下,在不是斷點的地方觸發了斷點,大概率是代碼出錯,IDE自行停在出錯的位置方便調試