模擬串列埠UART的實現

2021-08-20 11:22:26 字數 2249 閱讀 2987

我所禱告的,就是要你們的愛心,在知識和見識上,多而又多,使你們能分辨是非,做誠實無過的人,直到**的日子。

——腓立比書【1:9~10】

最近在調的mcu的型號為stm32f030,配置晶元相較之前的mcu都比較簡單,功能配置很順利。但是在寫串列埠程式的時候,發現串列埠一直不通,使用示波器也沒有波形。因為基本的串列埠通訊線只有tx和rx兩根線,配置也相對簡單,8位數字,1位停止位,9600波特率。協議結構為 起始位(低電平)+8位資料(低位在前)+1位停止位(高電平),例如傳送位元組0x55,即電平為低 高低高低高低高低 高。電平轉換的間隔時間為1s/9600 = 104us

以上均為理論分析過程,檢查**對串列埠的配置都沒有發現錯誤。最終排查的結果是硬體工程師畫原理圖和pcb圖時將串列埠的tx和rx畫反了!由於某些原因板子已經量產了,故只能通過改軟體來實現串列埠的功能,在網上找了一下發現模擬串列埠可行性可以,故動手寫了一下模擬串列埠。

串列埠通訊需要模擬兩根線(tx和rx)的時序,模擬串列埠的主要思路如下:

傳送部分比較簡單,按照 起始位(低電平)+8位資料(低位在前)+1位停止位(高電平),間隔時間104us,即可。

接收部分有點複雜,需要配置乙個外部中斷,用於檢測低電平訊號,還需要乙個定時器,用於讀取有效資料。

下面將**附上:

傳送io口初始化

/*!

* @brief 模擬串列埠1 tx io口配置

* @param none

* @return none

* @note tx(pa10)

*/void musart1_tx_init(void)

接收io口初始化

/*!

* @brief 模擬串列埠1 rx io口配置

* @param none

* @return none

* @note rx(pa9)

*/void musart1_rx_init(void)

定時器初始化

/*!

* @brief 定時器14初始化

* @param

* @return none

* @note 103us定時器,用於串列埠資料取樣

*/void time14init(void)

tx_h(); //!《停止位

delay_us(delaytime);

}

接收資料,外部中斷起始接收

/*!

* @brief 串列埠接收io中斷處理函式

* @param none

* @return none

* @note none

*/void exti4_15_irqhandler(void)

} exti_clearitpendingbit(exti_line9);}}

接收資料,定時器中斷接收資料

/*!

* @brief 定時器1中斷處理函式

* @param

* @return none

* @note

*/void tim14_irqhandler(void)

if(rx_read())else

tim_clearitpendingbit(tim14, tim_flag_update);

}}

其他說明

typedef enumrx_state;

rx_state rx_state = state_stop;

uint8 recvdata=0;    //!《接收的乙個位元組資料,全域性變數

至此,模擬串列埠的**及原理均已描述完成。單獨的串列埠通訊並沒有問題,但是在實際應用中採取了一種特殊的「匯流排」形式。

本次寫的是從機部分的**,從機接收資料並沒有問題,但是在傳送資料時,由於所有的從機tx都掛載在同一根tx上,並且從機tx空閒狀態時一直是高電平,導致指定從機的起始訊號發不出去。故需要再做以下處理,解決以上問題。

當接收到的資料報中的id為本從機id時將tx拉高,否則拉低,這樣能夠保證當指定id的從機傳送資料時有且只有乙個從機再匯流排上傳送資料(其他從機的tx主動離線)。

好了就記錄這麼多。

IO口模擬UART串列埠

由於博主近期參與了合泰晶元的專案開發,所以此次就用合泰微控制器來測試 具體型號為ht66f70a ide為ht ide3000 合泰官方 首先需要了解兩個概念 1.幀 是序列通訊的資料單元,其中各位的意義如下 起始位 先發出乙個邏輯 0 的訊號,表示傳輸資料的開始。資料位 緊接著起始位之後,資料位的...

Qt實現UART串列埠除錯功能

qt版本 qt4.8.6 外部包 qextserialport 1.2rc.zip 解壓後 src 目錄下會有以下幾個檔案 qextserialport.pri qextserialport p.h qextserialport global.h qextserialport.h qextseria...

uart串列埠協議與實現講解

uart串列埠協議與實現講解 一 uart和rs232 1 uart的全稱叫做通用非同步收發傳輸器。將資料在序列通訊和並行通訊間的傳輸轉換。通俗的講就是把多位元的資料轉化為單位元的資料,或者把單位元的資料轉化為多位元的資料。工作原理是將資料的每個bit一位接一位地傳輸。2 uart是一種通用序列資料...