固原人才網

    STM32F103ZET6的USART3和USART1,2有什么區別

    發布時間:2017-04-14 17:54

    百為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; //設置通信波特率為115200
    USART_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->CR3

    USART_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

    回復:

    stm32f103vet6 和STM32F103R8T6的區別: 微處理器stm32f103VET6:是100腳,內置512kB 閃存存儲器(Flash),用于存放程序和數據。 微處理器stm32f103R8T6:是64腳,內置64kB閃存儲器(Flash),用于存放程序和數據。 STM32F103xx增強型系列使用...

    回復:

    當接收引腳有數據時,狀態寄存器的USART_FLAG_RXNE就會為1,此時USART_GetFlagStatus(USART1, USART_FLAG_RXNE)的返回值就為1(SET),若無數據則為RESET 本語句一般用于while(SET == USART_GetFlagStatus(USART1, USART_FLAG_RXNE)),或if語句作...

    回復:

    百為STM32開發板教程之三——USART串口通信 一、簡介 STM32F103ZET6有3個USART(通用同步和異步收發器) + 2個UART(通用異步收發器) 分別是USART1,USART2,USART3 和UART4,UART5 二、USART和UART有什么區別呢? 當進行異步通信時,這兩者是沒有區別...

    回復:

    時鐘使能不太一樣,一個APB1,一個APB2,其他沒啥區別

    回復:

    1. 速度,跟51和AVR相比,相當快了。 2. 容量,目前能直接購買到512K FLASH的。 3. 管腳,64,100,144等,只可惜,小管腳(少于32腿的),沒有。 4. RAM, 48K,跟AVR的4K相比,太龐大了,太綽綽有余了。 5. 外設,5個USART,2個IIC,2個SPI,USB,等...

    回復:

    意思是如果在你的程序中,某些外設用的是復用IO口,就必須開該復用時鐘。 比如在STM32F103VET6中USART3的IO口為(TX/PB10,RX/PB11)。但是如果你要是將給外設IO口映射到(TX/PC10,RX/PC11)或者(TX/PD8,RX/PD9),那就必須開啟AFIO時鐘了,...

    上一篇:窗含西嶺千秋雪,門泊東吳萬里船。這兩首詩句里泊的意思 下一篇:工傷九級傷殘能賠多少錢,我今年三十一歲,

    返回主頁:固原人才網

    本文網址:http://www.gz-riland.top/view-156119-1.html
    信息刪除