stm32串列埠輸出

2021-08-22 09:53:16 字數 1966 閱讀 9642

stm32開發板上是如何實現串列埠通訊的,我以實現printf重定向為例來進行分析!

先看**:

main.c:

#include "printf.h"

int main()

printf.c:

#include "printf.h"

#include "stm32f10x.h"

#include "stm32f10x_rcc.h"

#include "stm32f10x_gpio.h"

#include "stm32f10x_usart.h"

#include "misc.h"

int fputc(int ch,file *f)

void printf_init(void)

usart_inittypedef;

其實在學習32的時候,一般如果要用到32的內設或者外設,都要進行相應的初始化,也就是相應的結構體成員進行配置,而我們本次要實現的printf重定向,也

就用到了串列埠,所以也要對串列埠進行初始化!而我是用的usart2,所以要對其進行相應的配置。

檢視stm32硬體原理圖:

由原理圖可知,這個串列埠是支援ttl電平的,接收資料rx是接在pa3管腳上的,傳送資料是接在pa2上的。由於我是要輸出到pc上的串列埠終端,所以pa2要

設為復用推挽輸出模式,pa3設為復用開漏輸入模式。

檢視stm32f10x_it.c這個**可知usart2是掛接在apb1匯流排上的,gpio是掛在apb2匯流排上的,如下所示:

所以我們在進行時鐘初始化的時候要特別注意。

2.printf重定向

其實printf重定向就是我們將printf重新定向到串列埠,也就是我們可以自己重寫c的庫函式,當聯結器檢查到使用者編寫了與c庫函式相同的名字,優先採用

使用者編寫的函式這樣使用者就可以實現對庫的修改了。

printf函式實際是乙個巨集,最終呼叫的是 fputc(int ch,file *f)這個函式,所以我們需要修改這個函式。

下面我們著重分析一下fputc函式:

這個庫函式呼叫了兩個st庫函式,分別是:usart_getflagstatus()與usart_senddata(),形參ch表示串列埠將要傳送的資料,也就是說。當使用printf()時,它先呼叫fpuc()函式,然後使用st庫的串列埠傳送函式usart_senddata(),把資料轉移到傳送資料暫存器tdr.觸發我們的串列埠向pc傳送乙個相應的資料,呼叫完usart_senddata()之後,

使用 while(usart_getflagstatus(usart2,usart_flag_tc) != set)語句不停的檢查串列埠的資料是否傳送完成的標誌位tc,一直檢查到標誌為「完成」,才進行下一步操作,

要注意的是usart_senddata()每次只傳送乙個位元組的資料!

注意:由於fputc()函式的形參呼叫了c庫的file,所以在程式中加入stdio.h這個標頭檔案,便且在keil的編譯器的設定中勾選use microlib(使用微庫)

3.硬體連線

首先硬體上我們將usb轉串列埠線的txd,rxd,gnd,分別接在32開發板usart2上的rxd,txd,gnd。

由於usart2是ttl電平,所以我們用的usb轉串列埠線一定要是支援ttl電平的,否則串列埠通訊不上!

4.效果圖

串列埠除錯助手顯示:

STM32串列埠輸出亂碼

原因一 初始化串列埠的波特率與串列埠除錯助手不一致。原因二 晶震不一致。串列埠輸出始終亂碼,外部時鐘頻率配置錯誤導致的,庫使用預設8mhz晶震,可以通過巨集使用25mhz晶震。具體定義在stm32f10x.h 文件中 開發板晶震使用的12mhz晶震,定義乙個巨集修改成12000000,編譯,燒寫。i...

stm32串列埠通訊

通訊方式 1 同步通訊 帶時鐘同步訊號傳輸 spi,iic等 2 非同步通訊 不帶時鐘用途訊號 usrt,單匯流排 stm32串列埠引腳表 串口號 rxd txd 1 pa10 pa9 2 pa3pa2 3 pb11 pb10 4 pc11 pc10 5 pd2pc12 通訊過程 接收過程 由rx入...

STM32串列埠通訊

1.常用的串列埠相關暫存器 1 usart sr狀態暫存器,對應的庫函式 flagstatus usart getflagstatus usart typedef usartx,uint16 t usart flag 2 usart dr資料暫存器,對應的庫函式 void usart senddat...