STM32シリアルポートの詳細な説明

目次

01.USARTの機能

02.USARTの概要

2.1、データ送信モデル

2.2、フレーム構造

2.3、ボーレート

03、STM32のUSART

04、コード構成


01.USARTの機能

USARTは、通常UARTと呼ばれるユニバーサル非同期受信機/送信機(UniversalAsynchronousReceiver / Transmitter)であり、非同期受信機/送信機であり、デバイス間の非同期通信の主要モジュールです。UARTは、データバスとシリアルポート間のシリアル/パラレルおよびパラレル/シリアル変換の処理を担当し、フレーム形式を指定します。通信当事者が同じフレーム形式とボーレートを採用している限り、共有せずに実行できます。クロック信号。、2本の信号線(RxとTx)のみが通信プロセスを完了できるため、非同期シリアル通信とも呼ばれます。

  • 全二重非同期通信。

  • フラクショナルボーレートジェネレータシステムは、正確なボーレートを提供します。

  • 構成可能な16倍のオーバーサンプリングまたは8倍のオーバーサンプリングにより、速度許容値とクロック許容値を柔軟に構成できます。

  • プログラム可能なデータワード長(8ビットまたは9ビット);

  • 構成可能なストップビット(1つまたは2つのストップビットをサポート)。

  • DMAマルチバッファ通信を使用するように構成可能。

  • 送信機と受信機のイネーブルビットを分離します。

  • 検出フラグ:①バッファを受け入れる②バッファを空にする③送信終了フラグ

  • 複数のフラグ付き割り込みソース。割り込みをトリガーします。

  • その他:チェック制御、4つのエラー検出フラグ。

コミュニケーション構造

02.USARTの概要

2.1、データ送信モデル

2.2、フレーム構造

シリアル非同期通信用に定義する必要のあるパラメーター

①スタートビット

②データビット(8ビットまたは9ビット)

③パリティビット(9ビット目)

④ストップビット(1,15,2ビット)

⑤ボーレート設定

パリティチェック付きのデータは9ビットです

1.データパケット

シリアル通信のデータパケットは、送信側デバイスが独自のTXDインターフェイスを介して受信側デバイスのRXDインターフェイスに送信します。データパケットの内容は、スタートビット、本文データ(8ビットまたは9ビット)を含め、プロトコル層で指定されます。 、およびチェックサム。ビットとストップビット。データを正常に送受信するには、通信の両当事者がデータパケットの形式について合意する必要があります。

2.ボーレート

非同期通信にはクロック信号がないため、受信側は信号をデコードするためにボーレート、つまり1秒あたりに送信されるシンボルの数について合意する必要があります。一般的なボーレートは4800、9600、115200などです。STM32でのボーレートの設定は、シリアルポート初期化構造によって実現されます。

3.開始信号と停止信号

データパケットの開始と終了はスタートビットとストップビットです。データパケットのスタート信号はロジック0のデータビットで表され、ストップビット信号は0.5、1、1.5、ロジック1の2データビットであり、両者が合意する必要があります。全会一致。STM32の開始信号と停止信号の設定も、シリアルポート初期化構造によって実現されます。

4.有効なデータ

有効なデータは、サブジェクトデータの長さ(通常は8ビットまたは9ビット)を指定します。これは、シリアルポート初期化構造を介してSTM32でも実装されます。

5.データ検証

有効なデータの後に、オプションのデータチェックビットがあります。データ通信は外部干渉の影響を比較的受けやすく、送信データに偏差が生じるため、送信プロセス中にチェックビットを追加してこの問題を解決できます。チェック方法は奇数、偶数、0チェック(スペース)、1チェック(マーク)、およびいいえ(パリティなし)です。これらは、シリアルポート初期化構造に実装することもできます。

2.3、ボーレート

OVER8は、オーバーサンプリングを構成するために使用されます。通常、OVER8は0に設定されます。

時計が84Mの場合

USARTDIV = 84000000 /(115200 * 16)= 45.572

次に、取得します。

DIV_Fraction = 16 * 0.572 = 0x09;

DIV_Mantissa = 45 = 0x2D;

03、STM32のUSART

STM32F207データマニュアルによると、STM32F207には合計6つのシリアルポートがあります

以下では、USART1を例として説明します。

表10.STM32F207データシートの代替機能マッピングから、USART1の対応するピンを確認できます。以下では、USART1のピンとしてPA9とPA10を選択します。

04、コード構成

割り込み優先度を設定します。

  /* 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;//配置数据字长
  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 configuration */
  USART_Init(USART1, &USART_InitStructure);// 完成串口的初始化配置

割り込み設定を有効にします。

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

送信完了割り込みと受信データレジスタの空でない割り込みを設定しました。STが提供する標準ライブラリ関数に見られるように、多くのタイプの割り込みを設定できます。

/**
  * @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);

主な機能の主な機能は、LCDがシリアルポートで受信した10文字を表示し(ASCIIコードでない場合は表示されません)、シリアルポートは受信した10バイトを逆の順序で返します。

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

割り込みが有効になっているため、割り込み関数も作成する必要があります。

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間隔でデータを送信し、977パケットを送信し、977パケット応答を受信します。テストデモは十分に堅牢で、パケット損失はありません。

 

KeilおよびIARエンジニアリングコードとハードウェアPCBオープンソースアドレス:

https://github.com/strongercjd/STM32F207VCT6

 

この記事が掲載されているアルバム、STM32F207チュートリアルを表示するにはクリックしてください

 

公式アカウントに注意を払い、できるだけ早く記事の更新を受け取りますコメントエリアが間に合わないので、連絡が必要な場合は公式アカウントにアクセスして連絡することができます

 

おすすめ

転載: blog.csdn.net/Firefly_cjd/article/details/109529573