溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

STM32串口的示例分析

發(fā)布時間:2021-12-27 11:00:18 來源:億速云 閱讀:121 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章主要為大家展示了“STM32串口的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“STM32串口的示例分析”這篇文章吧。

01、USART的特點

USART是通用異步收發(fā)傳輸器(UniversalAsynchronousReceiver/Transmitter),通常稱作UART,是一種異步收發(fā)傳輸器,是設(shè)備間進行異步通信的關(guān)鍵模塊。UART負責處理數(shù)據(jù)總線和串行口之間的串/并、并/串轉(zhuǎn)換,并規(guī)定了幀格式;通信雙方只要采用相同的幀格式和波特率,就能在未共享時鐘信號的情況下,僅用兩根信號線(Rx和Tx)就可以完成通信過程,因此也稱為異步串行通信。

全雙工異步通信。

小數(shù)波特率發(fā)生器系統(tǒng),提供精確的波特率。

可配置的16倍過采樣或8倍過采樣,因而為速度容差與時鐘容差的靈活配置提供了可能。

可編程的數(shù)據(jù)字長度(8位或者9位);

可配置的停止位(支持1或者2位停止位);

可配置的使用DMA多緩沖器通信。

單獨的發(fā)送器和接收器使能位。

檢測標志:① 接受緩沖器  ②發(fā)送緩沖器空 ③傳輸結(jié)束標志

多個帶標志的中斷源。觸發(fā)中斷。

其他:校驗控制,四個錯誤檢測標志。

通信結(jié)構(gòu)

 STM32串口的示例分析

 02、USART簡介

2.1、數(shù)據(jù)傳輸模型

STM32串口的示例分析

 1.數(shù)據(jù)包

串口通訊的數(shù)據(jù)包由發(fā)送設(shè)備通過自身的TXD接口傳輸?shù)浇邮赵O(shè)備得RXD接口,在協(xié)議層中規(guī)定了數(shù)據(jù)包的內(nèi)容,具體包括起始位、主體數(shù)據(jù)(8位或9位)、校驗位以及停止位,通訊的雙方必須將數(shù)據(jù)包的格式約定一致才能正常收發(fā)數(shù)據(jù)。

2.波特率

由于異步通信中沒有時鐘信號,所以接收雙方要約定好波特率,即每秒傳輸?shù)拇a元個數(shù),以便對信號進行解碼,常見的波特率有4800、9600、115200等。STM32中波特率的設(shè)置通過串口初始化結(jié)構(gòu)體來實現(xiàn)。

3.起始和停止信號

數(shù)據(jù)包的首尾分別是起始位和停止位,數(shù)據(jù)包的起始信號由一個邏輯0的數(shù)據(jù)位表示,停止位信號可由0.5、1、1.5、2個邏輯1的數(shù)據(jù)位表示,雙方需約定一致。STM32中起始和停止信號的設(shè)置也是通過串口初始化結(jié)構(gòu)體來實現(xiàn)。

4.有效數(shù)據(jù)

有效數(shù)據(jù)規(guī)定了主題數(shù)據(jù)的長度,一般為8或9位,其在STM32中也是通過串口初始化結(jié)構(gòu)體來實現(xiàn)的。

5.數(shù)據(jù)校驗

在有效數(shù)據(jù)之后,有一個可選的數(shù)據(jù)校驗位。由于數(shù)據(jù)通信相對更容易受到外部干擾導致傳輸數(shù)據(jù)出現(xiàn)偏差,可以在傳輸過程加上校驗位來解決這個問題。校驗方法有奇校驗(odd)、偶校驗(even)、0 校驗(space)、1 校驗(mark)以及無(noparity)。這些也都可以在串口初始化結(jié)構(gòu)體中實現(xiàn)的。

2.3、波特率

STM32串口的示例分析

 如果時鐘時84M

USARTDIV = 84000000/(115200*16) = 45.572

那么得到:

DIV_Fraction = 16*0.572 = 0x09;

DIV_Mantissa = 45 = 0x2D;

03、STM32的USART

根據(jù)STM32F207數(shù)據(jù)手冊,STM32F207一共6個串口

 STM32串口的示例分析

 04、代碼配置

配置中斷優(yōu)先級。

  /* Enable the USARTx Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

打開串口與相應的GPIO引腳,配置好相應串口信息與GPIO引腳的工作模式。

/* Enable GPIO clock */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  /* Enable UART1 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  /* Connect PXx to USARTx_Tx*/
  GPIO_PinAFConfig(GPIOA, 9, GPIO_AF_USART1);
  
  /* Connect PXx to USARTx_Rx*/
  GPIO_PinAFConfig(GPIOA, 10, GPIO_AF_USART1);
  
  /* Configure USART Tx as alternate function  */
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Configure USART Rx as alternate function  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

配置USART1。

  USART_InitStructure.USART_BaudRate = 115200;//配置波特率
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//配置數(shù)據(jù)字長
  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;//配置工作模式,收發(fā)一起
  
  /* USART configuration */
  USART_Init(USART1, &USART_InitStructure);// 完成串口的初始化配置

使能中斷配置。

USART_ITConfig(USART1, USART_IT_TC, ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)

我們配置了發(fā)送傳輸完成中斷和接收數(shù)據(jù)寄存器非空中斷。我們可以配置很多類型中斷,在ST提供的標準庫函數(shù)中看到。

/**
  * @brief  Enables or disables the specified USART interrupts.
  * @param  USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or 
  *         UART peripheral.
  * @param  USART_IT: specifies the USART interrupt sources to be enabled or disabled.
  *          This parameter can be one of the following values:
  *            @arg USART_IT_CTS:  CTS change interrupt
  *            @arg USART_IT_LBD:  LIN Break detection interrupt
  *            @arg USART_IT_TXE:  Transmit Data Register empty interrupt
  *            @arg USART_IT_TC:   Transmission complete interrupt
  *            @arg USART_IT_RXNE: Receive Data register not empty interrupt
  *            @arg USART_IT_IDLE: Idle line detection interrupt
  *            @arg USART_IT_PE:   Parity Error interrupt
  *            @arg USART_IT_ERR:  Error interrupt(Frame error, noise error, overrun error)
  * @param  NewState: new state of the specified USARTx interrupts.
  *          This parameter can be: ENABLE or DISABLE.
  * @retval None
  */

最后使能串口。

  /* Enable USART */
  USART_Cmd(USART1, ENABLE);

main主函數(shù),功能是LCD顯示串口接收的10個字符(如果不是ascii碼則不顯示),串口倒序返回接收到的10個字節(jié)。

int main(void)
{
/*省略初始化部分代碼*/
  while (1)
  {
    if(LCD_refresh_flg){
      LCD_refresh_flg = 0;
      LCD_ShowString(0,16,receive_data);
      receive_num--;
      USART_SendData(USART1, receive_data[receive_num--]);
      send_flg = 1;
    }
  }
}

因為使能了中斷,我們還需要編寫中斷函數(shù)。

void USART1_IRQHandler(void)
{
  if(USART_GetFlagStatus(USART1, USART_FLAG_TC))
  {
    if(send_flg == 1){
      if(receive_num==0){
        USART_SendData(USART1, receive_data[receive_num]);
        send_flg = 0;
        receive_flg = 1;
      }else{
        USART_SendData(USART1, receive_data[receive_num--]);
      }
    }
    USART_ClearFlag(USART1, USART_FLAG_TC);
  }
  if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
  {
    if((receive_flg)&&(send_flg == 0)){
      receive_data[receive_num++] = USART_ReceiveData(USART1);
      if(receive_num==10){
        receive_flg = 0;
        LCD_refresh_flg = 1;
      }
    }
    USART_ClearFlag(USART1, USART_FLAG_RXNE);
  }
}

下載驗證

LCD顯示屏可以顯示接收的10個字符,且PC以100ms為間隔發(fā)送數(shù)據(jù),發(fā)送977包收到977包回復,測試demo就夠健壯,沒有出現(xiàn)丟包。

STM32串口的示例分析

以上是“STM32串口的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI