STM32多串列埠 printf

2021-10-24 11:37:31 字數 3703 閱讀 6380

網上很多多串列埠的教程,但是效果因人而異。

我現在寫一篇正點原子精英板直接可以複製使用的教程,

其他開發板也可參考我這種修改例程的方法。

正點原子的串列埠實驗直接複製乙份,修改裡面的檔案即可。

例程的標頭檔案是

#ifndef __usart_h

#define __usart_h

#include

"stdio.h"

#include

"sys.h"

#define usart_rec_len 200

//定義最大接收位元組數 200

#define en_usart1_rx 1

//使能(1)/禁止(0)串列埠1接收

extern u8 usart_rx_buf[usart_rec_len]

;//接收緩衝,最大usart_rec_len個位元組.末位元組為換行符

extern u16 usart_rx_sta;

//接收狀態標記

//如果想串列埠中斷接收,請不要注釋以下巨集定義

void

uart_init

(u32 bound)

;#endif

我們想要多個串列埠 以兩個串列埠為例 我們做如下修改

#ifndef __usart_h

#define __usart_h

#include

"stdio.h"

#include

"sys.h"

#define usart_rec_len 200

//定義最大接收位元組數 200

#define en_usart1_rx 1

//使能(1)/禁止(0)串列埠1接收

#define usart2_rec_len 200

//定義最大接收位元組數 200

#define en_usart2_rx 1

//使能(1)/禁止(0)串列埠1接收

extern u8 usart_rx_buf[usart_rec_len]

;//接收緩衝,最大usart_rec_len個位元組.末位元組為換行符

extern u16 usart_rx_sta;

//接收狀態標記

extern u8 usart2_rx_buf[usart2_rec_len]

;//接收緩衝,最大usart_rec_len個位元組.末位元組為換行符

extern u16 usart2_rx_sta;

//接收狀態標記

void

uart_init

(u32 bound)

;void

uart2_init

(u32 bound)

;#endif

如果想再加串列埠 依葫蘆畫瓢即可

正點原子的的串列埠1函式全在這個這個if判定裡面,那我們只要複製這個函式,並修改根據剛剛的標頭檔案 修改裡面變數即可。

就像這樣

為了防止有些小夥伴粗心,總是遺漏一點點東西沒修改,下面放出乙份改好的串列埠2 pa2 pa3

#if en_usart2_rx   

//如果使能了串列埠2接收

//串列埠1中斷服務程式

//注意,讀取usartx->sr能避免莫名其妙的錯誤

u8 usart2_rx_buf[usart2_rec_len]

;//接收緩衝,最大usart_rec_len個位元組.

//接收狀態

//bit15, 接收完成標誌

//bit14, 接收到0x0d

//bit13~0, 接收到的有效位元組數目

u16 usart2_rx_sta=0;

//接收狀態標記

void

uart2_init

(u32 bound)

void

usart2_irqhandler

(void

)//串列埠1中斷服務程式

else

//還沒收到0x0d}}

}#if system_support_os

//如果system_support_os為真,則需要支援os.

osintexit()

;#endif

}#endif

不過光這樣可不夠哦 我們還需要修改一下義fputc 這部分**我直接放上來了

//加入以下**,支援printf函式,而不需要選擇use microlib

#if 1

#pragma import(__use_no_semihosting)

//標準庫需要的支援函式

struct __file

; file __stdout;

//定義_sys_exit()以避免使用半主機模式

void

_sys_exit

(int x)

//重定義fputc函式

//int fputc(int ch, file *f)

////改寫fputc

intfputc

(int ch, file *f)

else

return ch;

}#endif

這段**選擇哪個埠使用printf,實驗效果是誰最後發了訊息printf就對哪個埠傳送訊息。

也可以在發訊息之前修改標誌位指定要傳送訊息的埠。

話不多說,直接上**。

#include

"led.h"

#include

"delay.h"

#include

"key.h"

#include

"sys.h"

#include

"usart.h"

intmain

(void

)printf

("\r\n\r\n");

//插入換行

usart_rx_sta=0;

}else

if(usart2_rx_sta&

0x8000

)printf

("\r\n\r\n");

//插入換行

usart2_rx_sta=0;

}else

if(times%

200==0)

printf

("請輸入資料,以回車鍵結束\r\n");

if(times%

30==

0)led0=

!led0;

//閃爍led,提示系統正在執行.

STM32多個串列埠printf

網上講的新增printf 到程式中一般都是這樣的 簡要提一下 1.配置gpio usart,rcc 的configuration 2.勾選usb micro lib 3.在程式中新增 標頭檔案需要新增 include ifdef gnuc define putchar prototype int i...

在STM32使用串列埠printf

在stm32串列埠通訊程式中使用printf傳送資料,非常的方便。可在剛開始使用的時候總是遇到問題,常見的是硬體訪真時無法進入main主函式,其實只要簡單的配置一下就可以了。下面就說一下使用printf需要做哪些配置。有兩種配置方法 一 對工程屬性進行配置,詳細步驟如下 1 首先要在你的main 檔...

STM32使用HAL串列埠封裝printf

自己封裝乙個類似 printf 的函式 前提是已經可以實現串列埠傳送了 include include include uint32 t uart strlen uint8 t str return cnt void usart printf uint8 t usartport,char fmt,v...