stm32 USART
介紹的定義
串行通信、并行通信、全雙工、半雙工、單工、同步、異步、比特率、碼元、波特率、TTL、RS232、DB9接口、DTE、DCE、協(xié)議層、USART、UART、CH340G芯片、USB。
通信基礎(chǔ)
根據(jù)數(shù)據(jù)傳送的方式,通訊可分為串行通訊與并行通訊。
串行通信:同一時刻只能傳輸一個數(shù)據(jù)位的數(shù)據(jù)。串行通訊可以節(jié)省數(shù)據(jù)線的硬件成本。
并行通信:可以同時傳輸多個數(shù)據(jù)位的數(shù)據(jù)。因?yàn)橐淮慰蓚鬏敹鄠€數(shù)據(jù)位的數(shù)據(jù) ,在數(shù)據(jù)傳輸速率相同的情況下,并行通訊傳輸?shù)臄?shù)據(jù)量要大得多。使用很多數(shù)據(jù)線進(jìn)行傳輸。
根據(jù)數(shù)據(jù)通訊的方向,通訊又分為全雙工、半雙工及單工通訊,它們主要以信道的方向來區(qū)分。
全雙工:在同一時刻,兩個設(shè)備之間可以同時收發(fā)數(shù)據(jù)。
半雙工:兩個設(shè)備之間可以收發(fā)數(shù)據(jù),但不能在同一時刻進(jìn)行。
單工:在任何時刻都只能進(jìn)行一個方向的通訊,即一個固定為發(fā)送設(shè)備,另一個固定為接收設(shè)備。
根據(jù)通訊的數(shù)據(jù)同步方式,又分為同步和異步兩種,可以根據(jù)通訊過程中是否有使用時鐘信號進(jìn)行簡單的區(qū)分。
同步通訊:收發(fā)設(shè)備雙方會使用一根信號線表示時鐘信號,在時鐘信號的驅(qū)動下雙方進(jìn)行協(xié)調(diào),同步數(shù)據(jù)。通常雙方會統(tǒng)一規(guī)定在時鐘信號的上升沿或下降沿對數(shù)據(jù)線進(jìn)行采樣。在同步通訊中,數(shù)據(jù)信號所傳輸?shù)膬?nèi)容絕大部分就是有效數(shù)據(jù),同步通訊的效率更高。同步通訊雙方的時鐘允許誤差較小。
異步通訊:不使用時鐘信號進(jìn)行數(shù)據(jù)同步,它們直接在數(shù)據(jù)信號中穿插一些同步用的信號位,或者把主體數(shù)據(jù)進(jìn)行打包,以數(shù)據(jù)幀的格式傳輸數(shù)據(jù),有時還需要雙方約定數(shù)據(jù)的傳輸速率,以便更好地同步。異步通訊中會包含幀的各種標(biāo)識符,異步通訊雙方的時鐘允許誤差較大。
通訊速率:衡量通訊性能,常以比特率(Bitrate)來表示,即每秒鐘傳輸?shù)亩M(jìn)制位數(shù),單位為比特每秒(bit/s)。
“波特率” (Baudrate):表示每秒鐘傳輸了多少個碼元。
碼元:一個碼元就是一個脈沖信號,一個脈沖信號有可能攜帶1bit數(shù)據(jù),也有可能攜帶2bit數(shù)據(jù)、4bit數(shù)據(jù)。把振幅分成四種,低(00)、中(01)、高(10)、很高(11),發(fā)一個脈沖信號,攜帶2bit的數(shù)據(jù)。一個碼元能攜帶1bit數(shù)據(jù),那么比特率 = 波特率;一個碼元能攜帶2bit數(shù)據(jù),那么比特率 = 2倍的波特率。
根據(jù)通訊使用的電平標(biāo)準(zhǔn)不同,串口通訊可分為 TTL 標(biāo)準(zhǔn)及 RS-232 標(biāo)準(zhǔn)。
RS232標(biāo)準(zhǔn):規(guī)定了信號的用途、通訊接口以及信號的電平標(biāo)準(zhǔn)。
兩個通訊設(shè)備的“DB9 接口”之間通過串口信號線建立起連接, 串口信號線中使用“RS-232 標(biāo)準(zhǔn)”傳輸數(shù)據(jù)信號。由于 RS-232 電平標(biāo)準(zhǔn)的信號不能直接被控制器直接識別,所以這些信號會經(jīng)過一個“電平轉(zhuǎn)換芯片”轉(zhuǎn)換成控制器能識別的 “TTL 標(biāo)準(zhǔn)”的電平信號。
DB9接口如下圖;DTE:數(shù)據(jù)終端設(shè)備(計算機(jī)、路由);DCE:數(shù)據(jù)通訊設(shè)備(調(diào)制解調(diào)器、貓)。通常DTE引出公頭,DCE引出母頭。DB9接口里面連的有TXD、RXD信號線,串口通訊的數(shù)據(jù)包由發(fā)送設(shè)備通過自身的 TXD 接口傳輸?shù)浇邮赵O(shè)備的 RXD 接口
TTL標(biāo)準(zhǔn):控制器一般使用 TTL 電平標(biāo)準(zhǔn),所以常常會使用 MA3232 芯片對 TTL 及 RS-232 電平的信號進(jìn)行互相轉(zhuǎn)換。
協(xié)議層:規(guī)定了數(shù)據(jù)包的內(nèi)容,它由啟始位、主體數(shù)據(jù)、校驗(yàn)位以及停止位組成,通訊雙方的數(shù)據(jù)包格式要約定一致才能正常收發(fā)數(shù)據(jù)。
USART:通用同步異步收發(fā)器,串行通信設(shè)備,可與外部設(shè)備進(jìn)行全雙工數(shù)據(jù)交換。串行通信一般是以幀格式傳輸數(shù)據(jù),即是一幀一幀的傳輸,每幀包含有起始信號、數(shù)據(jù)信息、停止信息,可能還有校驗(yàn)信息。
UART:去掉了同步通信功能,只有異步通信。平時用的串口通信基本都是 UART。
CH340G 芯片:USB 總線的轉(zhuǎn)接芯片,實(shí)現(xiàn) USB 轉(zhuǎn) USART、USB 轉(zhuǎn) lrDA 紅外或者 USB 轉(zhuǎn)打印機(jī)接口,這里使用其 USB 轉(zhuǎn) USART 功能,原理圖如下。其中的USB-MINI就是我們的USB。
用下面這個線就能把stm32和電腦連起來了。
串口中斷接收回顯實(shí)驗(yàn)
main.c
實(shí)現(xiàn)開發(fā)板與電腦通信,在開發(fā)板上電時通過 USART 發(fā)送一串字符串給電腦,然后開發(fā)板進(jìn)入中斷接收等待狀態(tài),如果電腦有發(fā)送數(shù)據(jù)過來,開發(fā)板就會產(chǎn)生中斷,中斷服務(wù)函數(shù)接收數(shù)據(jù),并馬上把數(shù)據(jù)返回發(fā)送給電腦。
main里面調(diào)用 USART_Config 函數(shù)完成 USART 初始化配置,包括 GPIO 配置, USART 配置,接收中斷使能,然后什么都不做,等待 USART 接收中斷的產(chǎn)生,并在中斷服務(wù)函數(shù)把數(shù)據(jù)回傳。
#include "stm32f10x.h" #include "bsp_usart.h"/*** @brief 主函數(shù)* @param 無* @retval 無*/ int main(void) { /*初始化USART 配置模式為 115200 8-N-1,中斷接收*/USART_Config();/* 發(fā)送一個字符串 */Usart_SendString( DEBUG_USARTx,"這是一個串口中斷接收回顯實(shí)驗(yàn)\n");while(1){ } }usart.c
下面的NVIC_Configuration函數(shù)進(jìn)行中斷控制器 NVIC 的配置,配置 USART 作為中斷源。
static void NVIC_Configuration(void)下面的USART_Config函數(shù)進(jìn)行USART 初始化配置,主要是設(shè)置GPIO_InitStructure和USART_InitStructure這兩個結(jié)構(gòu)體變量。
void USART_Config(void) GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure;下面這兩個函數(shù)進(jìn)行字符的發(fā)送。
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch) void Usart_SendString( USART_TypeDef * pUSARTx, char *str)USART_Config函數(shù)整個流程大致是:
使能 RX 和 TX 引腳 GPIO 時鐘和 USART 時鐘; 初始化 GPIO,并將 GPIO 復(fù)用到 USART 上; 配置 USART 參數(shù); 配置中斷控制器并使能 USART 接收中斷; 使能 USART;
最后在 USART 接收中斷服務(wù)函數(shù)實(shí)現(xiàn)數(shù)據(jù)接收和發(fā)送。
#include "bsp_usart.h"/*** @brief 配置嵌套向量中斷控制器NVIC* @param 無* @retval 無*/ static void NVIC_Configuration(void) {NVIC_InitTypeDef NVIC_InitStructure;/* 嵌套向量中斷控制器組選擇 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/* 配置USART為中斷源 */NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;/* 搶斷優(yōu)先級*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 子優(yōu)先級 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中斷 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/* 初始化配置NVIC */NVIC_Init(&NVIC_InitStructure); }/*** @brief USART GPIO 配置,工作參數(shù)配置* @param 無* @retval 無*/ void USART_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打開串口GPIO的時鐘DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打開串口外設(shè)的時鐘DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);// 將USART Tx的GPIO配置為推挽復(fù)用模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);// 將USART Rx的GPIO配置為浮空輸入模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);// 配置串口的工作參數(shù)// 配置波特率USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;// 配置 針數(shù)據(jù)字長USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位USART_InitStructure.USART_StopBits = USART_StopBits_1;// 配置校驗(yàn)位USART_InitStructure.USART_Parity = USART_Parity_No ;// 配置硬件流控制USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 配置工作模式,收發(fā)一起USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;// 完成串口的初始化配置USART_Init(DEBUG_USARTx, &USART_InitStructure);// 串口中斷優(yōu)先級配置NVIC_Configuration();// 使能串口接收中斷USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE); // 使能串口USART_Cmd(DEBUG_USARTx, ENABLE); }/***************** 發(fā)送一個字節(jié) **********************/ void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch) {/* 發(fā)送一個字節(jié)數(shù)據(jù)到USART */USART_SendData(pUSARTx,ch);/* 等待發(fā)送數(shù)據(jù)寄存器為空 */while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }/****************** 發(fā)送8位的數(shù)組 ************************/ void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num) {uint8_t i;for(i=0; i<num; i++){/* 發(fā)送一個字節(jié)數(shù)據(jù)到USART */Usart_SendByte(pUSARTx,array[i]); }/* 等待發(fā)送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET); }/***************** 發(fā)送字符串 **********************/ void Usart_SendString( USART_TypeDef * pUSARTx, char *str) {unsigned int k=0;do {Usart_SendByte( pUSARTx, *(str + k) );k++;} while(*(str + k)!='\0');/* 等待發(fā)送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET){} }/***************** 發(fā)送一個16位數(shù) **********************/ void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch) {uint8_t temp_h, temp_l;/* 取出高八位 */temp_h = (ch&0XFF00)>>8;/* 取出低八位 */temp_l = ch&0XFF;/* 發(fā)送高八位 */USART_SendData(pUSARTx,temp_h); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);/* 發(fā)送低八位 */USART_SendData(pUSARTx,temp_l); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }///重定向c庫函數(shù)printf到串口,重定向后可使用printf函數(shù) int fputc(int ch, FILE *f) {/* 發(fā)送一個字節(jié)數(shù)據(jù)到串口 */USART_SendData(DEBUG_USARTx, (uint8_t) ch);/* 等待發(fā)送完畢 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET); return (ch); }///重定向c庫函數(shù)scanf到串口,重寫向后可使用scanf、getchar等函數(shù) int fgetc(FILE *f) {/* 等待串口輸入數(shù)據(jù) */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(DEBUG_USARTx); }usart.h
這里面是GPIO 和 USART 的宏定義,此開發(fā)版USART引腳和TX、RX連接關(guān)系如下。這里使用 USART1,設(shè)定波特率為 115200,選定 USART 的 GPIO 為 PA9 和 PA10。
#ifndef __USART_H #define __USART_H#include "stm32f10x.h" #include <stdio.h>/** * 串口宏定義,不同的串口掛載的總線和IO不一樣,移植時需要修改這幾個宏* 1-修改總線時鐘的宏,uart1掛載到apb2總線,其他uart掛載到apb1總線* 2-修改GPIO的宏*/// 串口1-USART1 #define DEBUG_USARTx USART1 #define DEBUG_USART_CLK RCC_APB2Periph_USART1 #define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200// USART GPIO 引腳宏定義 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd#define DEBUG_USART_TX_GPIO_PORT GPIOA #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10#define DEBUG_USART_IRQ USART1_IRQn #define DEBUG_USART_IRQHandler USART1_IRQHandler// 串口2-USART2 //#define DEBUG_USARTx USART2 //#define DEBUG_USART_CLK RCC_APB1Periph_USART2 //#define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd //#define DEBUG_USART_BAUDRATE 115200 USART GPIO 引腳宏定義 //#define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA) //#define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd // //#define DEBUG_USART_TX_GPIO_PORT GPIOA //#define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_2 //#define DEBUG_USART_RX_GPIO_PORT GPIOA //#define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_3//#define DEBUG_USART_IRQ USART2_IRQn //#define DEBUG_USART_IRQHandler USART2_IRQHandler// 串口3-USART3 //#define DEBUG_USARTx USART3 //#define DEBUG_USART_CLK RCC_APB1Periph_USART3 //#define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd //#define DEBUG_USART_BAUDRATE 115200 USART GPIO 引腳宏定義 //#define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOB) //#define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd // //#define DEBUG_USART_TX_GPIO_PORT GPIOB //#define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_10 //#define DEBUG_USART_RX_GPIO_PORT GPIOB //#define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_11//#define DEBUG_USART_IRQ USART3_IRQn //#define DEBUG_USART_IRQHandler USART3_IRQHandler// 串口4-UART4 //#define DEBUG_USARTx UART4 //#define DEBUG_USART_CLK RCC_APB1Periph_UART4 //#define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd //#define DEBUG_USART_BAUDRATE 115200 USART GPIO 引腳宏定義 //#define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOC) //#define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd // //#define DEBUG_USART_TX_GPIO_PORT GPIOC //#define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_10 //#define DEBUG_USART_RX_GPIO_PORT GPIOC //#define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_11//#define DEBUG_USART_IRQ UART4_IRQn //#define DEBUG_USART_IRQHandler UART4_IRQHandler// 串口5-UART5 //#define DEBUG_USARTx UART5 //#define DEBUG_USART_CLK RCC_APB1Periph_UART5 //#define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd //#define DEBUG_USART_BAUDRATE 115200 USART GPIO 引腳宏定義 //#define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD) //#define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd // //#define DEBUG_USART_TX_GPIO_PORT GPIOC //#define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_12 //#define DEBUG_USART_RX_GPIO_PORT GPIOD //#define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_2//#define DEBUG_USART_IRQ UART5_IRQn //#define DEBUG_USART_IRQHandler UART5_IRQHandlervoid USART_Config(void); void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch); void Usart_SendString( USART_TypeDef * pUSARTx, char *str); void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);#endif /* __USART_H */中斷部分
由于在usart.c的USART_Config函數(shù)中使能了 USART 接收中斷,當(dāng) USART 接收到數(shù)據(jù)就會執(zhí)行 USART_IRQHandler 函數(shù)。
#include "stm32f10x_it.h" #include "bsp_usart.h" // 串口中斷服務(wù)函數(shù) void DEBUG_USART_IRQHandler(void) {uint8_t ucTemp;if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET){ ucTemp = USART_ReceiveData(DEBUG_USARTx);USART_SendData(DEBUG_USARTx,ucTemp); } }串口控制點(diǎn)燈
main.c
這個實(shí)驗(yàn)不用接收中斷,而用查詢標(biāo)志位的方法,就是main里面用了switch去判斷,而不是用中斷來判斷。
結(jié)果就是輸入個2,小燈發(fā)出個綠光。
usart.c
USART_Config進(jìn)行USART初始化配置。和上一個實(shí)驗(yàn)相似,不過沒用接收中斷。
整個實(shí)驗(yàn)流程大致是:初始化配置 RGB 彩色燈 GPIO;使能 RX 和 TX 引腳 GPIO 時鐘和 USART 時鐘;初始化 GPIO,并將 GPIO 復(fù)用到 USART 上;配置 USART 參數(shù); 使能 USART; 獲取指令輸入,根據(jù)指令控制 RGB 彩色燈。
#include "bsp_usart.h"/*** @brief USART GPIO 配置,工作參數(shù)配置* @param 無* @retval 無*/ void USART_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打開串口GPIO的時鐘DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打開串口外設(shè)的時鐘DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);// 將USART Tx的GPIO配置為推挽復(fù)用模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);// 將USART Rx的GPIO配置為浮空輸入模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);// 配置串口的工作參數(shù)// 配置波特率USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;// 配置 針數(shù)據(jù)字長USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位USART_InitStructure.USART_StopBits = USART_StopBits_1;// 配置校驗(yàn)位USART_InitStructure.USART_Parity = USART_Parity_No ;// 配置硬件流控制USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 配置工作模式,收發(fā)一起USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;// 完成串口的初始化配置USART_Init(DEBUG_USARTx, &USART_InitStructure); // 使能串口USART_Cmd(DEBUG_USARTx, ENABLE); }/***************** 發(fā)送一個字符 **********************/ void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch) {/* 發(fā)送一個字節(jié)數(shù)據(jù)到USART */USART_SendData(pUSARTx,ch);/* 等待發(fā)送數(shù)據(jù)寄存器為空 */while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }/***************** 發(fā)送字符串 **********************/ void Usart_SendString( USART_TypeDef * pUSARTx, char *str) {unsigned int k=0;do {Usart_SendByte( pUSARTx, *(str + k) );k++;} while(*(str + k)!='\0');/* 等待發(fā)送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET){} }/***************** 發(fā)送一個16位數(shù) **********************/ void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch) {uint8_t temp_h, temp_l;/* 取出高八位 */temp_h = (ch&0XFF00)>>8;/* 取出低八位 */temp_l = ch&0XFF;/* 發(fā)送高八位 */USART_SendData(pUSARTx,temp_h); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);/* 發(fā)送低八位 */USART_SendData(pUSARTx,temp_l); while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }///重定向c庫函數(shù)printf到串口,重定向后可使用printf函數(shù) int fputc(int ch, FILE *f) {/* 發(fā)送一個字節(jié)數(shù)據(jù)到串口 */USART_SendData(DEBUG_USARTx, (uint8_t) ch);/* 等待發(fā)送完畢 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET); return (ch); }///重定向c庫函數(shù)scanf到串口,重寫向后可使用scanf、getchar等函數(shù) int fgetc(FILE *f) {/* 等待串口輸入數(shù)據(jù) */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(DEBUG_USARTx); }usart.h
進(jìn)行GPIO 和 USART 宏定義。
#ifndef __USART_H #define __USART_H#include "stm32f10x.h" #include <stdio.h>/** * 串口宏定義,不同的串口掛載的總線不一樣,移植時需要修改這幾個宏*/ #define DEBUG_USARTx USART1 #define DEBUG_USART_CLK RCC_APB2Periph_USART1 #define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200// USART GPIO 引腳宏定義 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd#define DEBUG_USART_TX_GPIO_PORT GPIOA #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10#define DEBUG_USART_IRQ USART1_IRQn #define DEBUG_USART_IRQHandler USART1_IRQHandlervoid USART_Config(void); void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch); void Usart_SendString( USART_TypeDef * pUSARTx, char *str); void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);#endif /* __USART_H */總結(jié)
以上是生活随笔為你收集整理的stm32 USART的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .network 中文文档_以太坊链下支
- 下一篇: linux查看端口属性,linux如何查