cc2541實現全雙工串列埠讀寫

2021-08-14 08:28:49 字數 1207 閱讀 3026

2541的osal封裝已經封裝好了串列埠的讀寫,為何要自己實現一次呢?這裡最重要的原因是因為預設實現的串列埠讀寫程式會對低功耗功能有影響,以及預設串列埠程式在進入低功耗的時候會去控制rx,tx,ct,rt腳,而很多時候我們實際只用了rx,tx腳,另外兩個腳被用於其他外設,所以為了增加控制,不得不自己寫串列埠讀寫程式。

本文針對2541的uart0編寫,uart1口對暫存器做相應修改即可。

volatile uint8 input_counter = 0;    //由於中斷裡面大量使用這兩個計數器,為保證資料正確,

volatile uchar count; //應該使用volatile修飾

char rxdata[size];

void inituart()

void uartsendstring(char *data, int len)

input_counter = 2;//設定超時計數}

先在串列埠中斷裡面把u0dbuf的資料讀到buffer中,注意這個中斷處理必須只能快取到buffer,盡量別做其他事情。

void handle_uart_receive_and_send()

}}

這個函式由sbp_uart_read_timeout_evt時間呼叫。呼叫之後,再起乙個sbp_uart_read_timeout_evt事件。所以整個讀取過程就是:

中斷函式觸發,u0dbuf被快取,input_counter被設定為2

sbp_uart_read_timeout_evt 事件被觸發,input_counter變為1

如果在下乙個sbp_uart_read_timeout_evt事件觸發前,有串列埠中斷觸發,則返回第一步

如果在下乙個sbp_uart_read_timeout_evt事件觸發前,無串列埠中斷觸發,則input_counter會在事件處理函式中被減為0,讀超時,進入事件處理函式。

注意,我看到過其他人的**,在寫串列埠的時候,將讀串列埠關閉,清理了u0csr的0x04標誌。這個其實會妨礙2541的雙工讀。 

我的感覺,為什麼他會在寫的時候會禁止讀,應該是因為他覺得讀寫都是使用的u0dbuf,他以為這個暫存器不能同時使用。然而,如果仔細閱讀2541的文件,會發現這個暫存器實際上是雙緩衝區的,讀,寫這個暫存器,是對不一樣的internal register進行讀寫。所以,在寫的時候,不需要顧慮,直接讀寫即可。

cc2541 低功耗廣播

設定2541 廣播有幾個引數 gap setparamvalue tgap lim adv timeout,5 廣播持續時間 5s what is the advertising interval when device is discoverable units of 625us,160 100m...

CC2541 關閉串列埠問題

在除錯低功耗時,最好關閉串列埠,需要修改巨集 hal uart false hal uart dma 1 hal uart isr 0 hal uart tx by isr 1 但是修改完之後會編譯錯誤,提示 undefine external print msg 原因是這個函式在 hal uart...

藍芽CC2541 串列埠學習筆記

usart暫存器如下 1.u0csr 為 usart0的控制和狀態 7位 usart模式選擇 0為spi模式 1為usart模式 6為 usart接收使能 0為禁止 1為使能接收 5位 spi主從模式設定 0主模式 1為從模式 4位 usart幀錯誤狀態 0沒有錯誤 1有錯誤 3位 usart奇偶校...