回覆列表
  • 1 # 最NEW資訊

    百為STM32開發板教程之三——USART串列埠通訊一、簡介STM32F103ZET6有3個USART(通用同步和非同步收發器) + 2個UART(通用非同步收發器)分別是USART1,USART2,USART3和UART4,UART5二、USART和UART有什麼區別呢?當進行非同步通訊時,這兩者是沒有區別的。區別在於USART比UART多了同步通訊功能,同步通訊需要STM32提供時鐘來同步的,這個同步通訊功能可以把USART當做SPI來用,比如用USART來驅動SPI裝置。同步通訊的連線示例圖:其中RX,TX,SCLK引腳的定義,在資料手冊上都可以找到:百為stm32開發板光碟\晶片資料手冊\資料手冊STM32F103xC STM32F103xD STM32F103xE.pdf這個區別在初學STM32的時候我們不需要去深入研究,只要知道USART有很多功能,除了全雙工非同步通訊之外,還包括支援同步通訊和單線半雙工通訊,支援LIN(區域性互連網),智慧卡協議和IrDA紅外通訊,以及調變解調器(CTS/RTS)等操作。三、資料通訊格式我們用得最多的是全雙工非同步通訊功能,下面我們來研究下怎麼透過串列埠1(USART1)來收發資訊,和printf功能的實現。通常串列埠通訊的資料格式如下圖:我們需要設定的資料有通訊速率,資料字長,奇偶檢驗位,停止位。一個典型的設定是115200波特率,8位資料,無奇偶校驗,1位停止位。這個設定在韌體函式庫裡面,我們是透過設定USART_InitStructure結構體,然後呼叫USART_Init函式來實現的:USART_InitStructure.USART_BaudRate = 115200; //設定通訊波特率為115200USART_InitStructure.USART_WordLength = USART_WordLength_8b; //設定通訊資料格式為8位資料USART_InitStructure.USART_StopBits = USART_StopBits_1; //設定停止位為1位USART_InitStructure.USART_Parity = USART_Parity_No ; //設定為無奇偶校驗USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //設定為無硬體流控制,即無CTS/RTS控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //設定傳送使能,接收使能USART_Init(USART1, &USART_InitStructure); //呼叫USART_Init,把上面的引數分別設定進USART的控制暫存器USART1->CR1,USART1->CR2,USART1->CR3USART_Cmd(USART1, ENABLE); //使能串列埠大家發現,在2.0韌體庫的USART例程裡並沒有看到USART1,因為是它用USARTx宏代替的,其中USARTx是platform_config.h裡定義的,大概是這個樣子:#ifdef USE_USART1#define USARTx USART1#define GPIOx GPIOA#define RCC_APB2Periph_GPIOx RCC_APB2Periph_GPIOA#define GPIO_RxPin GPIO_Pin_10#define GPIO_TxPin GPIO_Pin_9#endif只有定義了USE_USART1,上面的#ifdef USE_USART1和#endif之間的內容才會被編譯,所以在platform_config.h裡也需要定義USE_USART1:#define USE_USART1這裡GPIO_Pin_9是串列埠1的傳送引腳,GPIO_Pin_10是串列埠1的接收引腳,也可以從百為STM32開發板的電路圖上看出來:四、串列埠引腳配置上面USART_Init函式配置了USART1的資料通訊格式,但串列埠能工作的前提是需要配置相應的TX,RX的引腳,這個是透過GPIO_Configuration函式來配置的:void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //開啟USART1時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //開啟AFIO時鐘/* 配置 USARTx_Tx 為複用推輓輸出 */GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOx, &GPIO_InitStructure);/* 配置 USARTx_Rx 為輸入懸空 */GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOx, &GPIO_InitStructure);}五、收發資料配置好USART1使用的引腳,資料通訊格式,下面就可以收發資料了,USART_GetFlagStatus函式可以讀取收發狀態等,讀取狀態標誌可以是以下幾個:傳送資料示例:USART_SendData(USART1, "a"); //傳送一個字元a接收資料示例:u16 RxData;RxData = USART_ReceiveData(USART1); //從USART1接收資料到RxData變數下面是串列埠通訊printf程式裡的主要功能,上電列印一串資訊,把接收到的資料回顯到PC上:/* 用printf列印一串資訊到PC的超級終端或串列埠除錯軟體上 */printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");while (1){if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==SET) //判斷是否有資料要接收{i = USART_ReceiveData(USARTx); //接收資料printf("%c\n\r",i&0xff); //回顯到PC的超級終端或串列埠除錯軟體上}}六、printf的實現上面的printf是怎麼實現的呢,這個是C標準庫裡定義的函式,我們是怎樣把它的輸出重定向到串列埠的呢?我們知道printf是呼叫fputc函式來列印的,所以我們只要把fputc函式重定義就可以了:#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)PUTCHAR_PROTOTYPE{/* 呼叫USARTx傳送一個字元*/USART_SendData(USARTx, (u8) ch);/* 等待發送完成 */while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){}return ch;}另外還要加上標頭檔案#include "stdio.h"還要注意的是,在工程裡要勾上USE MicroLIB

  • 中秋節和大豐收的關聯?
  • 護膚品用便宜的好還是貴的好?