剛換了工做,最近接觸了一個項目,使用的是stm32低功耗系列,系統是華爲的物聯網 liteOS操做系統,框架爲touchGFX ui框架;html
因爲以前接觸底層較多所以就想本身移植一個liteos 以及touchgfx到本身的stm32開發板上,恰好本身也有個開發板,開發板是stm32f103zet6這款是大二買的買了就涼着了,是戰艦的v1版本;c++
目的:想經過這個過程,讓本身更深入的理解項目的架構,底層與上層,以及底層代碼的組織結構,操做系統的代碼組織結構,底層代碼如何和系統交互,底層如何跟框架銜接,如何跟liteos銜接等等;架構
從零開始首先創建裸機的工程,使用st公司的軟件,不得不說這個軟件太強大了,強大到你用了以後你感受本身成了一個廢人(本身作的事情太少),stm32CubeMX直接生成工程,這裏很少作介紹,框架
1,stm32 基於hal庫的裸機工程,移植liteos;函數
這裏發現了華爲liteos官網有很詳細的介紹,以爲徹底不必重寫,所以能夠直接參考官網;測試
包括裸機工程的創建和liteos的移植;ui
https://support.huaweicloud.com/bestpractice-LiteOS/zh-cn_topic_0145350106.htmlspa
使用stm32CubeMX能夠創建基於hal的裸機工程,這裏經常使用的簡單分爲兩種,keil和iar ,我這裏使用iar工程;操作系統
遇到的問題:3d
1,串口通訊出現亂碼;
這個問題浪費了我三四天時間,串口在移植完成以後,操做系統的打印信息會從這個串口輸出,因此至關重要,因爲個人開發板比較老,當串口出現亂碼的時候總覺得晶振配置的有問題,而後看原理圖和開發板,發現外部晶振是12m,而stm32CubeMX上外部晶振爲8M,再上百度修改庫文件 裏的晶振;總之試了好幾天一直都是亂碼,最後發現是吧串口搞錯了,根本晶振什麼的徹底不用改,就按上面連接裏的來設置串口和led都是ok的;必定要搞清楚哪一個串口是你用的(是的,這是比較低級的錯誤),也就是你設置的串口到底對應物理串口是哪一個,這裏我一直覺得是com3,實際上是com4;
2 一個須要額外設置的是stjlink調試(這裏的額外是相對於華爲官網的指導來講),若是不設置這個,在使用stjlink調試的時候會遇到問題致使不能調試;
3.第二個須要額外設置的用來支持串口的接收數據(中斷模式),須要打開串口中斷使能;
搭建裸機工程以後,編寫了led和串口的中斷收發測試程序功能已驗證,供你們參考;
led這裏的led爲PB5,也能夠本身加PE5
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_SET ); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); HAL_UART_Transmit(&huart1, tData, sizeof(tData), 1000); HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1); HAL_Delay(500);
串口的中斷收發例程,庫函數太完備,咱們能作的事情太少;
只須要在主函數中打開uart1的接收中斷,並重寫中斷回調函數;
main函數中加入下面一行;
HAL_UART_Receive_IT(&huart1, rData, 1);
重寫中斷回調函數,這裏不是c++中的重載,HAL_UART_RxCpltCallback 這個函數在庫中已經存在,只是被定義爲弱符號,__weak,咱們在main中重寫,編譯器連接運行將使用咱們寫的函數;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* 接收一個字節數據直接發出去 */ HAL_UART_Transmit(&huart1, rData, 1, 1000); /* 每次須要從新初始化接收結構體指針 */ HAL_UART_Receive_IT(&huart1, rData, 1); }
這樣兩個測試例程都已經正常運行了
這時候裸機工程驗證完畢,下一步開始移植liteos操做系統;