<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32中USART的使用方法

          STM32中USART的使用方法

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/318098.htm

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

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

          接著相關(guān)設(shè)備需要如果需要使用中斷功能,必須先配置中斷優(yōu)先級,后文詳述。

          然后是配置外圍設(shè)備的相關(guān)屬性,視具體設(shè)備而定,如果設(shè)備需要使用中斷方式,必須使能相應(yīng)設(shè)備的中斷,之后需要使能相關(guān)設(shè)備。

          最后如果設(shè)備使用了中斷功能,則還需要填寫相應(yīng)的中斷服務(wù)程序,在服務(wù)程序中進行相應(yīng)操作。

          2、UART的配置步驟

          2.1、打開時鐘

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

          2.2、GPIO初始化

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

          以下是TX引腳設(shè)置的實例代碼:

          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、中斷優(yōu)先級的配置

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

          特定設(shè)備的中斷優(yōu)先級NVIC的屬性包含在結(jié)構(gòu)體NVIC_InitTypeDef中,其中字段NVIC_IRQChannel包含了設(shè)備的中斷向量,保存在啟動代碼中;字段NVIC_IRQChannelPreemptionPriority為主優(yōu)先級,NVIC_IRQChannelSubPriority為從優(yōu)先級,取值的范圍應(yīng)根據(jù)位數(shù)劃分的情況而定;最后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相關(guān)屬性

          通過結(jié)構(gòu)體USART_InitTypeDef來確定。UART模式下的字段如下

          USART_BaudRate:波特率,視具體設(shè)備而定

          USART_WordLength:字長

          USART_StopBits:停止位

          USART_Parity:校驗方式

          USART_HardwareFlowControl:硬件流控制

          USART_Mode:單/雙工

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

          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()來啟動設(shè)備UART。

          2.5、中斷的服務(wù)程序的設(shè)計

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

          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);
          }
          }
          }

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



          關(guān)鍵詞: STM32USART使用方

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();