網上很多多串列埠的教程,但是效果因人而異。
我現在寫一篇正點原子精英板直接可以複製使用的教程,
其他開發板也可參考我這種修改例程的方法。
正點原子的串列埠實驗直接複製乙份,修改裡面的檔案即可。
例程的標頭檔案是
我們想要多個串列埠 以兩個串列埠為例 我們做如下修改#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
不過光這樣可不夠哦 我們還需要修改一下義fputc 這部分**我直接放上來了#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
//加入以下**,支援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...