新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32中USART的使用方法

        STM32中USART的使用方法

        作者: 時間:2016-11-19 來源:網絡 收藏
        USART作為一種標準接口在應用中十分常見。本文著重分析其作為UART的配置和應用方法。

        1、STM32固件庫使用外圍設備的主要思路

        本文引用地址:http://www.104case.com/article/201611/318098.htm

        在STM32中,外圍設備的配置思路比較固定。首先是使能相關的時鐘,一方面是設備本身的時鐘,另一方面如果設備通過IO口輸出還需要使能IO口的時鐘;最后如果對應的IO口是復用功能的IO口,則還必須使能AFIO的時鐘。

        其次是配置GPIO,GPIO的各種屬性由硬件手冊的AFIO一章詳細規定,較為簡單。

        接著相關設備需要如果需要使用中斷功能,必須先配置中斷優先級,后文詳述。

        然后是配置外圍設備的相關屬性,視具體設備而定,如果設備需要使用中斷方式,必須使能相應設備的中斷,之后需要使能相關設備。

        最后如果設備使用了中斷功能,則還需要填寫相應的中斷服務程序,在服務程序中進行相應操作。

        2、UART的配置步驟

        2.1、打開時鐘

        由于UART的TX和RX和AFIO都掛在APB2橋上,因此采用固件庫函數RCC_APB2PeriphClockCmd()進行初始化。UARTx需要分情況討論,如果是UART1,則掛在APB2橋上,因此采用RCC_APB2PeriphClockCmd()進行初始化,其余的UART2~5均掛在APB1上。

        2.2、GPIO初始化

        GPIO的屬性包含在結構體GPIO_InitTypeDef,其中對于TX引腳,GPIO_Mode字段設置為GPIO_Mode_AF_PP(復用推挽輸出),GPIO_Speed切換速率設置為GPIO_Speed_50MHz;對于RX引腳,GPIO_Mode字段設置為GPIO_Mode_IN_FLOATING(浮空輸入),不需要設置切換速率。最后通過GPIO_Init()使能IO口。

        以下是TX引腳設置的實例代碼:

        GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin = UART_TX_PIN[COM];
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(UART_TX_PORT[COM], &GPIO_InitStructure);

        2.3、中斷優先級的配置

        這是STM32比較奇怪的地方,在只有一個中斷的情況下,仍然需要配置優先級,其作用是使能某條中斷的觸發通道。STM32的中斷有至多兩個層次,分別是先占優先級和從優先級,而整個優先級設置參數的長度為4位,因此需要首先劃分先占優先級位數和從優先級位數,通過NVIC_PriorityGroupConfig()實現;

        特定設備的中斷優先級NVIC的屬性包含在結構體NVIC_InitTypeDef中,其中字段NVIC_IRQChannel包含了設備的中斷向量,保存在啟動代碼中;字段NVIC_IRQChannelPreemptionPriority為主優先級,NVIC_IRQChannelSubPriority為從優先級,取值的范圍應根據位數劃分的情況而定;最后NVIC_IRQChannelCmd字段是是否使能,一般定位ENABLE。最后通過NVIC_Init()來使能這一中斷向量。實例代碼如下:

        /* Configure theNVIC Preemption Priority Bits */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

        /* Enable the USARTy Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        2.4、配置UART相關屬性

        通過結構體USART_InitTypeDef來確定。UART模式下的字段如下

        USART_BaudRate:波特率,視具體設備而定

        USART_WordLength:字長

        USART_StopBits:停止位

        USART_Parity:校驗方式

        USART_HardwareFlowControl:硬件流控制

        USART_Mode:單/雙工

        最后通過USART_Init()來設置。實例代碼為:

        USART_InitStructure.USART_BaudRate= 9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);

        最后還要使用USART_Cmd()來啟動設備UART。

        2.5、中斷的服務程序的設計

        目前使用了UART的兩個中斷USART_IT_RXNE(接收緩存補空中斷)和USART_IT_TXE(發送緩存空中斷),前一個中斷保證了一旦有數據接收到就進入中斷以接收特定長度的數據,后一個中斷表示一旦發完一個數據就進入中斷函數,保證連續發送一段數據。一個設備的所有中斷都包含在一個中斷服務程序中,因此必須首先分清楚這次響應的是哪一個中斷,使用USART_GetITStatus()函數確定;采用USART_ReceiveData()函數接收一個字節數據,采用USART_SendData()函數發送一個字節數據,當關閉中斷時采用USART_ITConfig()失能響應的中斷。實例程序:

        voidUART4_IRQHandler(void)
        {

        if(USART_GetITStatus(UART4,USART_IT_RXNE) != RESET)
        {//當檢測掉讀入中斷
        RxBuffer[RxCounter++] = USART_ReceiveData(UART4);

        if (RxCounter ==NbrOfDataToRead)
        {
        USART_ITConfig(UART4, USART_IT_RXNE, DISABLE); //禁止中斷
        }
        }

        if(USART_GetITStatus(UART4, USART_IT_TXE) != RESET)
        {
        /* Write one byte to the transmit data register */
        USART_SendData(UART4, TxBuffer[TxCounter++]);

        if(TxCounter ==NbrOfDataToTransfer)
        {
        //TxCounter = 0;
        /* Disable the USARTy Transmit interrupt */
        USART_ITConfig(UART4, USART_IT_TXE, DISABLE);
        }
        }
        }

        其中主程序與中斷服務程序通過全局變量來通信,這也是一種多進程共享存儲區的體現形式。



        關鍵詞: STM32USART使用方

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 永和县| 溧阳市| 明溪县| 崇礼县| 两当县| 类乌齐县| 常德市| 巨野县| 沈丘县| 桃园市| 海伦市| 烟台市| 宁乡县| 南充市| 宝鸡市| 改则县| 灵山县| 镇平县| 陕西省| 武功县| 东丽区| 吴堡县| 揭西县| 景德镇市| 萍乡市| 长岛县| 东丽区| 孝昌县| 时尚| 石阡县| 盘锦市| 东乡族自治县| 西青区| 铜鼓县| 理塘县| 咸阳市| 泾源县| 云霄县| 罗山县| 富顺县| 乐业县|