新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32串口實驗

        STM32串口實驗

        作者: 時間:2016-11-26 來源:網絡 收藏
        STM32串口簡介
        串口作為MCU的重要外部接口,同時也是軟件開發重要的調試手段,其重要性不言而喻。現在基本上所有的MCU都會帶有串口,STM32自然也不例外。
        STM32的串口資源相當豐富的,功能也相當強勁。ALIENTEK戰艦STM32開發板所使用的STM32F103ZET6最多可提供5路串口,有分數波特率發生器、支持同步單線通信和半雙工單線通訊、支持LIN、支持調制解調器操作、智能卡協議和IrDA SIRENDEC規范、具有DMA等。
        5.3節對串口有過簡單的介紹,大家看這個實驗的時候記得翻過去看看。接下來我們將主要從庫函數操作層面結合寄存器的描述,告訴你如何設置串口,以達到我們最基本的通信功能。本章,我們將實現利用串口1不停的打印信息到電腦上,同時接收從串口發過來的數據,把發送過來的數據直接送回給電腦。戰艦STM32開發板板載了1個USB串口和1個RS232串口,我們本章介紹的是通過USB串口和電腦通信。
        在4.4.1章節端口復用功能已經講解過,對于復用功能的IO,我們首先要使能GPIO時鐘,然后使能復用功能時鐘,同時要把GPIO模式設置為復用功能對應的模式(這個可以查看手冊《STM32中文參考手冊V10》P110的表格“8.1.11外設的GPIO配置”)。這些準備工作做完之后,剩下的當然是串口參數的初始化設置,包括波特率,停止位等等參數。在設置完成只能接下來就是使能串口,這很容易理解。同時,如果我們開啟了串口的中斷,當然要初始化NVIC設置中斷優先級別,最后編寫中斷服務函數。
        串口設置的一般步驟可以總結為如下幾個步驟: 1) 串口時鐘使能,GPIO時鐘使能 2) 串口復位
        3) GPIO端口模式設置 4) 串口參數初始化
        5) 開啟中斷并且初始化NVIC(如果需要開啟中斷才需要這個步驟) 6) 使能串口
        7) 編寫中斷處理函數
        下面,我們就簡單介紹下這幾個與串口基本配置直接相關的幾個固件庫函數。這些函數和定義主要分布在stm32f10x_usart.h和stm32f10x_usart.c文件中。
        1.串口時鐘使能。串口是掛載在APB2下面的外設,所以使能函數為: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);
        2.串口復位。當外設出現異常的時候可以通過復位設置,實現該外設的復位,然后重新配置這個外設達到讓其重新工作的目的。一般在系統剛開始配置外設的時候,都會先執行復位該外設的操作。復位的是在函數USART_DeInit()中完成:
        void USART_DeInit(USART_TypeDef* USARTx); 比如我們要復位串口1,方法為: USART_DeInit(USART1); //復位串口1
        3.串口參數初始化。串口初始化是通過USART_Init()函數實現的,
        void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); 這個函數的的第一個入口參數是指定初始化的串口標號,這里選擇USART1。
        第二個入口參數是一個USART_InitTypeDef類型的結構體指針,這個結構體指針的成員變量用來設置串口的一些參數。一般的實現格式為:
        USART_InitStructure.USART_BaudRate = bound; //一般設置為9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式 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); //初始化串口
        從上面的初始化格式可以看出初始化需要設置的參數為:波特率,字長,停止位,奇偶校驗位,硬件數據流控制,模式(收,發)。我們可以根據需要設置這些參數。
        4.數據發送與接收。STM32的發送與接收是通過數據寄存器USART_DR來實現的,這是一個雙寄存器,包含了TDR和RDR。當向該寄存器寫數據的時候,串口就會自動發送,當收到收據的時候,也是存在該寄存器內。
        STM32庫函數操作USART_DR寄存器發送數據的函數是:
        void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 通過該函數向串口寄存器USART_DR寫入一個數據。
        STM32庫函數操作USART_DR寄存器讀取串口接收到的數據的函數是:
        uint16_t USART_ReceiveData(USART_TypeDef* USARTx); 通過該函數可以讀取串口接受到的數據。
        5.串口狀態。串口的狀態可以通過狀態寄存器USART_SR讀取。
        圖9.1.1 USART_SR寄存器各位描述
        這里我們關注一下兩個位,第5、6位RXNE和TC。 RXNE(讀數據寄存器非空),當該位被置1的時候,就是提示已經有數據被接收到了,并且可以讀出來了。這時候我們要做的就是盡快去讀取USART_DR,通過讀USART_DR可以將該位清零,也可以向該位寫0,直接清除。
        TC(發送完成),當該位被置位的時候,表示USART_DR內的數據已經被發送完成了。如果設置了這個位的中斷,則會產生中斷。該位也有兩種清零方式:1)讀USART_SR,寫USART_DR。2)直接向該位寫0。
        狀態寄存器的其他位我們這里就不做過多講解,大家需要可以查看中文參考手冊。 在我們固件庫函數里面,讀取串口狀態的函數是:
        FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); 這個函數的第二個入口參數非常關鍵,它是標示我們要查看串口的哪種狀態,比如上面講解的RXNE(讀數據寄存器非空)以及TC(發送完成)。例如我們要判斷讀寄存器是否非空(RXNE),操作庫函數的方法是:
        USART_GetFlagStatus(USART1, USART_FLAG_RXNE); 我們要判斷發送是否完成(TC),操作庫函數的方法是:
        USART_GetFlagStatus(USART1, USART_FLAG_TC);
        這些標識號在MDK里面是通過宏定義定義的:
        #define USART_IT_PE ((uint16_t)0x0028) #define USART_IT_TXE ((uint16_t)0x0727) #define USART_IT_TC ((uint16_t)0x0626) #define USART_IT_RXNE ((uint16_t)0x0525) #define USART_IT_IDLE ((uint16_t)0x0424) #define USART_IT_LBD ((uint16_t)0x0846) #define USART_IT_CTS ((uint16_t)0x096A) #define USART_IT_ERR ((uint16_t)0x0060) #define USART_IT_ORE ((uint16_t)0x0360) #define USART_IT_NE ((uint16_t)0x0260) #define USART_IT_FE ((uint16_t)0x0160)
        6, 串口使能。串口使能是通過函數USART_Cmd()來實現的,這個很容易理解,使用方法 是:
        USART_Cmd(USART1, ENABLE); //使能串口 7,開啟串口響應中斷。有些時候當我們還需要開啟串口中斷,那么我們還需要使能串口中斷,使能串口中斷的函數是:
        void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
        這個函數的第二個入口參數是標示使能串口的類型,也就是使能哪種中斷,因為串口的中斷類型有很多種。比如在接收到數據的時候(RXNE讀數據寄存器非空),我們要產生中斷,那么我們開啟中斷的方法是:
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟中斷,接收到數據中斷 我們在發送數據結束的時候(TC,發送完成)要產生中斷,那么方法是:
        USART_ITConfig(USART1,USART_IT_TC,ENABLE); 8,獲取相應中斷狀態。當我們使能了某個中斷的時候,當該中斷發生了,就會設置狀態寄存器中的某個標志位。經常我們在中斷處理函數中,要判斷該中斷是哪種中斷,使用的函數是:
        ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) 比如我們使能了串口發送完成中斷,那么當中斷發生了, 我們便可以在中斷處理函數中調用這個函數來判斷到底是否是串口發送完成中斷,方法是:
        USART_GetITStatus(USART1, USART_IT_TC) 返回值是SET,說明是串口發送完成中斷發生。


        關鍵詞: STM32串口實

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 平武县| 闽侯县| 安阳县| 湟中县| 巴中市| 石首市| 安泽县| 长沙市| 依安县| 宁陕县| 全椒县| 青州市| 龙岩市| 芜湖市| 登封市| 灌南县| 夏邑县| 苏州市| 长治县| 金湖县| 曲阳县| 平果县| 夏邑县| 昌平区| 吴旗县| 寿宁县| 介休市| 昌宁县| 永和县| 那坡县| 疏附县| 开封市| 涿鹿县| 眉山市| 定襄县| 临颍县| 合山市| 吴旗县| 台中县| 阳泉市| 鄂托克前旗|