這個月20號準備去參加RT-Thread一年一度的RDC開發(fā)者大會,順便會帶上我們公司的產品,這個產品就用到了大彩串口屏,所以昨天我也寫了一篇表驅動法在大彩串口屏上的應用,文章如下:
【12月】大彩串口屏RT-Thread Nano STM32表驅動法產品應用開發(fā)
接下來我會做一個產品級的基于大彩串口屏的開源項目,用的大彩串口屏型號是:DC80480F070_6111_ON,128M
,如下,這是一個7寸屏幕,分辨率800*480;當然價格也是超級便宜的了,入手價也就180塊錢,今年屏瘋狂漲價,這個價格已經很良心了。
近年來,RTOS在嵌入式系統設計中的主導地位也越來越明確,越來越多的工程師選用RTOS來完成產品功能的開發(fā);從最熟悉不過的ucos
,到后來的freertos
、rt-thread
、Tencentos tiny
等等,以使用者的角度,我在產品開發(fā)上用過的RTOS非常多;但最后得出一個結論,只要通一個,其它則一通百通;正因為RTOS種類越來越多,所以ARM公司推出了CMSIS-RTOS,為統一操作系統、降低嵌入式門檻而發(fā)布的操作系統標準軟件接口,CMSIS-RTOS的作用用通俗的話來講就是:勞資不管你是什么RTOS,你只需要學習我的CMSIS-RTOS怎么用就可以了,但前提是你要把那些RTOS的接口適配到CMSIS-RTOS上,然后你就可以拋棄那些含義相同,寫法不同的RTOS API,通通都可以不用它們,只用CMSIS-RTOS的API接口即可!
CMSIS-RTOS架構圖如下:
詳情學習可以參考世偉兄之前在騰訊實習的時候周末寫的文章:
RTOS內功修煉記(八)— CMSIS RTOS API,內核通用API接口
1、串口屏是什么?
串口屏,在百度百科上是這么來解釋的:
一套由單片機或PLC帶控制器的顯示方案,顯示方案中的通訊部分由串口通訊,UART串口或者SPI串口等;它由顯示驅動板、外殼、LCD液晶顯 示屏三部分構成。接收用戶單片機串口發(fā)送過來的指令,完成在LCD上繪圖的所有操作。
1.1、大彩串口屏的數據收發(fā)接口
1.1.1、大彩串口屏數據接收處理
收的部分昨天的文章已經介紹過了:
【12月】大彩串口屏RT-Thread Nano STM32表驅動法產品應用開發(fā)
是通過一種類似消息機制的隊列來進行實現,然后將隊列里的數據進行拼接加工后滿足大彩科技定義的一種協議指令集,所以中斷服務函數實現如下,這樣就可以持續(xù)的來接收串口屏回復的指令:
/**
??*?@brief?This?function?handles?USART2?global?interrupt.
??*/
void?USART2_IRQHandler(void)
{
????/*?USER?CODE?BEGIN?USART2_IRQn?0?*/
????uint32_t?i?;
????uint32_t?uart2_dma_rxlen?;
????/*進入中斷調用*/
????rt_interrupt_enter();
????if(__HAL_UART_GET_IT_SOURCE(&huart2,?UART_IT_IDLE)?!=?RESET)
????{
????????__HAL_UART_CLEAR_IDLEFLAG(&huart2);
????????HAL_UART_DMAStop(&huart2);
????????uart2_dma_rxlen?=?HMI_LCD_U2_BUFFER_SIZE?-?(__HAL_DMA_GET_COUNTER(huart2.hdmarx));
????
????????for(i?=?0;?i?????????{
????????????queue_push(HMI_LCD_Handler.HMI_LCD_U2_Buffer[i]);
????????}
????????__HAL_UART_ENABLE_IT(&huart2,?UART_IT_IDLE);
????????HAL_UART_Receive_DMA(&huart2,?HMI_LCD_Handler.HMI_LCD_U2_Buffer,?HMI_LCD_U2_BUFFER_SIZE);
????}
????/*?USER?CODE?END?USART2_IRQn?0?*/
????HAL_UART_IRQHandler(&huart2);
????/*?USER?CODE?BEGIN?USART2_IRQn?1?*/
???/*離開中斷調用*/
???rt_interrupt_leave();
??/*?USER?CODE?END?USART2_IRQn?1?*/
}
以下是大彩科技提供給開發(fā)者的MCU例程文檔中接收指令集的流程圖:
以使用RT-Thread為例,在進入中斷前調用:rt_interrupt_enter
,在離開中斷前調用:rt_interrupt_leave
。
以上描述來自RT-Thread文檔中心。
比如TencentOS tiny
也提供了一組API:
tos_knl_irq_enter
tos_knl_irq_leave
在進入中斷處理函數調用tos_knl_irq_enter
,在退出前調用tos_knl_irq_leave
。
又比如UCOSIII
也提供了一組API:
OSIntEnter();
OSIntExit();
在進入中斷處理函數調用OSIntEnter
,在退出前調用OSIntExit
。
其它的RTOS也是類似的,這里就不多做介紹了,有興趣可以自己測試和研究。
1.1.2、大彩串口屏數據發(fā)送處理
大彩串口屏提供了hmi_driver.c
這個文件,這個文件提供了一系列串口命令驅動的函數,例如設置控件的值等等,這些 操作依賴于以下這些發(fā)送接口:
#define?TX_8(P1)?SEND_DATA((P1)&0xFF)????????????????????//發(fā)送單個字節(jié)
#define?TX_8N(P,N)?SendNU8((uint8?*)P,N)?????????????????//發(fā)送N個字節(jié)
#define?TX_16(P1)?TX_8((P1)>>8);TX_8(P1)?????????????????//發(fā)送16位整數
#define?TX_16N(P,N)?SendNU16((uint16?*)P,N)??????????????//發(fā)送N個16位整數
#define?TX_32(P1)?TX_16((P1)>>16);TX_16((P1)&0xFFFF)?????//發(fā)送32位整數
上面這些接口,最終我們需要提供這樣一個發(fā)送單個字節(jié)的函數:
/*!?
*??\brief??發(fā)送一個字節(jié)
*??\param??c?
*/
void?SEND_DATA(uint8?c)
{
????SendChar(c);
}
那我們就直接實現SendChar
這個函數就行了,以帶RT-Thread操作系統的STM32工程為例,編寫如下接口:
void?SendChar(uint8_t?data)
{
????/*調度器上鎖*/
????rt_enter_critical();
????HAL_UART_Transmit(&huart2,?&data,?1,?1000);
????while(__HAL_UART_GET_FLAG(&huart2,?UART_FLAG_TXE)?!=?SET);
????/*調度器解鎖*/
????rt_exit_critical();
}
這里為什么要加上調度鎖呢??假設,你在界面上需要在不同任務里同時調用如下接口:
void?SetTextValue(u16?screen_id,?u16?control_id,?u8?*str)
{
????BEGIN_CMD();
????TX_8(0xB1);
????TX_8(0x10);
????TX_16(screen_id);
????TX_16(control_id);
????SendStrings(str);
????END_CMD();
}
這個接口是用來在給界面上某個文本控件顯示字符串用的;當多個任務同時調用該接口時,這樣不就是我們之前談的打架問題了嗎?在多任務系統中,這就是一種潛在的風險,當一個任務在使用某個資源的過程中,還沒有完全結束對資源的訪問時就被打斷了,這樣就會出現一些奇奇怪怪的問題,比如之前我用OLED結合RTOS編程時候也會出現像屏幕花屏的現象,這里我采用的方法是直接在底層的接口函數處加上調度鎖,以防止這種情況發(fā)生,當然,還有另外一種方法可以實現,那就是互斥鎖。
至于互斥鎖該怎么用,打開各大RTOS的API參考手冊,上面會詳細的告訴你如何創(chuàng)建,如何使用,照著做就是了,這里就不多說了。
初學RTOS會遇到各種各樣的坑,以上我提到的這些坑都是初學者碰得最多的,還有一些測試了很久都沒有被解決且難以復現的問題;最后都是在不斷的調試中找到分析問題的方法和解決技巧,但萬變不離其宗,我們要努力去Get最基礎的操作系統原理,在理論基礎知識的支撐上,才能更好的幫我們去分析問題和解決問題。
往期精彩
讓傳感器數據更直觀之LCD曲線顯示
【12月】大彩串口屏RT-Thread Nano STM32表驅動法產品應用開發(fā)
開源作品:基于TencentOS tiny英國達特甲醛探測儀產品級開發(fā)(二)
整理了很久之前在碼云/Github/CSDN上收藏的嵌入式產品級項目分享開源
覺得本次分享的文章對您有幫助,隨手點[在看]
并轉發(fā)分享,也是對我的支持。
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!