RT-Thread ART-Pi ili9488 spi 屏初始化死機問題的分析與修復(fù)

驗證環(huán)境

  • Win10 64位
  • Keil MDK 5.30
  • ART-Pi 開發(fā)板:STM32H750XBH6開發(fā)板
  • 工程:最小RT-Thread 系統(tǒng),版本:RT-Thread v4.1.0 released

功能驗證

  • 構(gòu)建最小系統(tǒng),開啟了ART-Pi 板載LCD驅(qū)動
  • 驗證SPI 屏是否能正常驅(qū)動,為了后面運行LVGL
2022-04-02_173632.png
2022-04-02_173704.png

問題一:內(nèi)存申請失敗

  • 發(fā)現(xiàn)初始化提示 內(nèi)存申請失敗,LCD 的測試例程無法通過
   ___  ______  _____         ______  _   ______  _____  _____  _____ 
  / _ \ | ___ \|_   _|        | ___ \(_)  | ___ \/  _  \/  _  \|_   _|
 / /_\ \| |_/ /  | |   ______ | |_/ / _   | |_/ /| | | || | | |  | |  
 |  _  ||    /   | |  |______||  __/ | |  | ___ \| | | || | | |  | |  
 | | | || |\ \   | |          | |    | |  | |_/ /\ \_/ /\ \_/ /  | |  
 \_| |_/\_| \_|  \_/          \_|    |_|  \____/  \___/  \___/   \_/  

 Powered by RT-Thread.

[D/drv.sdram] sdram init success, mapped at 0xC0000000, size is 33554432 bytes, data width is 16
[I/I2C] I2C bus [i2c2] registered

 \ | /
- RT -     Thread Operating System
 / | \     4.1.0 build Apr  2 2022 16:47:54
 2006 - 2022 Copyright by RT-Thread team
[E/drv.spi_lcd] init frame buffer failed!

msh >
msh >
msh >ile
msh >ili
ili9488_test
msh >ili9488_test
(device != RT_NULL) assertion failed at function:rt_spi_transfer, line number:260 

解決方法

  • 解決方法,開啟RT-Thread memheap,片內(nèi)的SRAM不夠,可以使用開發(fā)板的外部SDRAM
2022-04-02_174024.png

問題二:LCD初始化死機

 \ | /
- RT -     Thread Operating System
 / | \     4.1.0 build Apr  2 2022 17:09:28
 2006 - 2022 Copyright by RT-Thread team
psr: 0x21000000
r00: 0xc008082f
r01: 0x40003800
r02: 0x0000ffff
r03: 0x000003e8
r04: 0x24000324
r05: 0x000003e8
r06: 0x00000534
r07: 0x0000ffff
r08: 0xc008082f
r09: 0x00000000
r10: 0x0000ffff
r11: 0x0000ffff
r12: 0x00000000
 lr: 0x90004f91
 pc: 0x90005144
hard fault on thread: main

thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
tidle0    31  ready   0x00000058 0x00000100    34%   0x0000001c 000
main      10  running 0x000000a8 0x00000800    19%   0x0000000a 000
FPU active!
usage fault:
SCB_CFSR_UFSR:0x100 UNALIGNED 

問題解決

  • 開始懷疑內(nèi)存對齊問題,手動申請大塊內(nèi)存,發(fā)現(xiàn)沒有死機
  • 通過軟件單步調(diào)試,最終不斷縮小問題的【范圍】
  • 最后確認死機來自ST HAL SPI 驅(qū)動
  • 【嘗試方法一】:更換ST HAL庫,發(fā)現(xiàn)問題依舊
  • 【嘗試方法二】:對比ART-Pi SDK,對比驅(qū)動,定位在:drv_spi.c
  • 通過代碼對比ART-PI SDK 正常點屏的 drv_spi.c驅(qū)動,最終定位在一個SPI 的配置上
$ git diff rtt_4.1.0/libraries/HAL_Drivers/drv_spi.c
diff --git a/rtt_4.1.0/libraries/HAL_Drivers/drv_spi.c b/rtt_4.1.0/libraries/HAL_Drivers/drv_spi.c
index 7630d39..79f65bb 100644
--- a/rtt_4.1.0/libraries/HAL_Drivers/drv_spi.c
+++ b/rtt_4.1.0/libraries/HAL_Drivers/drv_spi.c
@@ -228,7 +228,7 @@ static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configur
     spi_handle->Init.MasterReceiverAutoSusp     = SPI_MASTER_RX_AUTOSUSP_DISABLE;
     spi_handle->Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
     spi_handle->Init.IOSwap                     = SPI_IO_SWAP_DISABLE;
-    spi_handle->Init.FifoThreshold              = SPI_FIFO_THRESHOLD_08DATA;
+    spi_handle->Init.FifoThreshold              = SPI_FIFO_THRESHOLD_01DATA;
 #endif

     if (HAL_SPI_Init(spi_handle) != HAL_OK)
  • 解決方法為:spi_handle->Init.FifoThreshold = SPI_FIFO_THRESHOLD_08DATA; 要改為:
    spi_handle->Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
  • 這個方法算是臨時的解決方法,后面研究有效的解決方法,次方法發(fā)現(xiàn)刷屏【卡頓】

編譯下載

  • 通過修復(fù)drv_spi.c的配置,配置了memheap,發(fā)現(xiàn)屏幕正常的點亮了
2022-04-02_175819.png

小結(jié)

  • 熟悉RT-Thread 最新版本 ART-Pi 最小工程的搭建方法
  • 熟悉 ART-Pi 板載 SPI LCD的驅(qū)動方法
  • 修復(fù)LCD無法點亮的問題
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容