文章目錄
- 通信的基本概念
- 串行通信和并行通信
- 單工,半雙工和全雙工
- 串口的硬件連接
- stm32的串口
- 原理圖
- CPU的芯片手冊
- stm32串口的庫函數實現
- 通過串口實現printf函數
- 使用中斷實現串口的接收
通信的基本概念
串行通信和并行通信
串行通信一個方向只有一個數據通道,一次傳輸一位數據,適用于傳輸距離較長,速度要求不是很高場合。
并行通信一個方向有多個數據通道,一次傳輸多位數據,適用于傳輸距離較短,速度要求很高的場合。
單工,半雙工和全雙工
單工:數據只能沿著一個方向傳輸
半雙工:數據可以雙向傳輸,但是不能影響同時進行
全雙工:數據可以同時雙向傳輸
通信速率:單位時間內傳輸的比特數,叫做波特率(bps)
通信協議(串口)
通信協議就是通信方事先約定好的數據格式
串口的硬件連接
UART—————通用異步收發器
USART————–通用同步/異步收發器
stm32的串口
原理圖
USB調試串口最終連接到了CPU的PA9,PA10,這兩個引腳有串口的復用功能。
CPU的芯片手冊
stm32串口的庫函數實現
在項目中添加庫函數源碼
- 開啟GPIO和USART1時鐘
- 將PA9、PA10配置成串口復用
GPPIO_PinAFConfig(...);
- 初始化串口
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
參數:
USARTx - 哪個串口USART_InitStruct - 串口初始化結構
typedef struct{uint32_t USART_BaudRate; //波特率 uint16_t USART_WordLength; //數據位長度 uint16_t USART_StopBits; //停止位長度 uint16_t USART_Parity; //校驗方式uint16_t USART_Mode; //發送/接收模式 uint16_t USART_HardwareFlowControl; //硬件流控制} USART_InitTypeDef;
- 使能串口
USART_Cmd(....);
- 串口數據的發送和接收
發送(輪詢)
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
//傳入哪個串口發什么數據
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
參數:USARTx - 哪個串口USART_FLAG - 哪個標志 發送完成標志 - USART_FLAG_TXE
返回SET表示有該標志
通過串口實現printf函數
stm32的項目中可以直接使用C標準庫函數,其中printf函數沒有完全實現。預留了一個后門fputc,可以通過fputc往串口打印來實現printf函數。
fputc函數格式:
int fputc(int ch,FILE* f)
{while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!= SET);USART_SendData(USART1,ch);return ch;
}
注意:
-
stm32芯片上運行程序,如果主機運行了調試器,程序就會使用主機的輸入輸出設備,這種模式叫半主機模式,printf如果通過串口打印,必須關閉半主機模式
-
#pragma import(__use_no_semihosting)
//重定義 int fputc(int ch,FILE* f) {while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!= SET);USART_SendData(USART1,ch);return ch; }
使用中斷實現串口的接收
由于串口合適發數據由自己決定,不存在無效等待的問題,無需使用中斷,但是串口何時接收數據不由自己決定,如果還使用輪詢會存在大量無效等待,此時要是使用中斷提高效率。
串口中斷和定時器中斷類似,需要配置中斷源開關和NVIC
NVIC_Init(...);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);