串列埠通訊(下) 簡單的USART資料收發實驗

2022-06-24 13:48:09 字數 1854 閱讀 8127

之前的上、中兩篇文章介紹了串列埠通訊基礎和stm32的usart基本結構等相關。萬事俱備只欠東風,現在是時候小試牛刀了。

簡單做個usart的串列埠資料收發實驗。實驗在stm32f103上完成。

我們選擇ch340g晶元來完成,其可以實現usb轉usart。

查閱開發板原理圖可得,ch340g晶元txd、rxd預設與usart1的tx、rx連線,即pa9、pa10引腳。如圖11-1。

圖11-1

當然了,如果你想用其他串列埠,如usart2的收發引腳,直接用杜邦線連線到相應引腳即可。

實驗中會用到usart接收中斷,當usart收到資料即執行中斷函式。所以我們需要配置nvic。

static void nvic_configuration(void)

這裡如何配置不再贅述,專欄裡之前的文章已經有了相關介紹,有不明白的地方可移步閱讀。

接下來進行usart初始化的配置。gpio_inittypedef和nvic_inittypedef兩個結構體分別定義對應的結構體物件。然後開啟gpio和usart時鐘。接下來配置usart的tx、rx引腳和串列埠的引數。我們配置其波特率為115200,8個資料位,1個停止位,無校驗,無硬體流控制,資料收發一起。

void usart_config(void)

相關的配置已經完成,接下來開始傳送資料。之前的文章說到過,傳送時由tdr暫存器逐位將資料轉移到傳送移位暫存器,然後由移位暫存器一位一位傳送。所以如果需要傳送字串資料,則可按此原理進行逐位傳送。

/* 傳送單個字元 */

void usart_sendbyte(usart_typedef* pusartx, uint8_t data)

/* 傳送字串 */

void usart_sendstr(usart_typedef* pusartx, char *str)

while(*(str+i) != '\0');

// 等待傳送完成

while(usart_getflagstatus(pusartx, usart_flag_tc) == reset);

}

當usart收到資料即會執行中斷函式,那麼我們在stm32f10x_it.c中編寫中斷服務函式usart1_irqhandler()。

void usart1_irqhandler(void)

}

最後就是在main函式裡呼叫以上的函式進行資料收發了。

int main(void)

用usb轉串列埠線連線電腦和開發板,根據程式配置的引數除錯串列埠助手的引數,把程式燒錄到板子,便可以開始收發資料了。如下圖的助手傳送接收截圖。

圖11-2

我們也可以利用收發的資料進而控制led。有一點需要注意的是,如果想通過串列埠傳送指令控制led,那麼就會涉及到字元讀取,這時我們需要重定向c庫函式scanf到串列埠,即重新定義fgetc函式。如果需要列印串列埠資訊,同樣也需要重定向printf函式。另外,需要在工程配置裡需勾選「use microlib」。

/* 重定向c庫函式printf */

int fputc(int ch, file *f)

/* 重定向c庫函式scanf */

int fgetc(file *f)

USART 串列埠通訊

現在我使用串列埠一般都是列印除錯資訊或者藍芽通訊 只會用到tx和rx,不需要用到時鐘訊號線,所以是非同步半雙工 如果想要操作暫存器,那就要看功能框圖了 1.tx傳送資料引腳 rx接受資料引腳,所以要把引腳配置為串列埠復用引腳 每個串列埠對應的引腳都不一樣,這樣檢視手冊 2.傳送資料暫存器和接收資料暫...

串列埠通訊(中) USART

usart即為通用同步非同步收發器,用於序列通訊,例如其可以用於列印程式輸出資訊,以便於除錯程式。圖10 1 這裡簡單介紹下usart框圖。tx為傳送資料的輸出引腳,rx為接收資料的輸入引腳,sclk為傳送器時鐘輸出引腳 同步模式下會用到 其中sclk 於apb1匯流排時鐘 36mhz 和apb2匯...

STM32USART串列埠通訊

問題描述 利用usart串列埠程式,實現pc與stm32通訊,計算機傳送資料,stm32接受後,再傳送給pc端 1.gpio埠配置 根據手冊 pa.9為tx 傳送 pa.10為rx 接受 因此 pa.9為復用推挽輸出,pa.10為浮空輸入,一行 搞定 void gpio config 2.配置usa...