5

で動作する自動ボーレート検出を取得できませんSTM32L0。ハードウェア抽象化レイヤー (HAL) を使用しています。

私の初期化コードは次のとおりです。

/* USART1 init function */
void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 300;
  huart1.Init.WordLength = UART_WORDLENGTH_9B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_EVEN;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_AUTOBAUDRATE_INIT;
  huart1.AdvancedInit.AutoBaudRateEnable = UART_ADVFEATURE_AUTOBAUDRATE_ENABLE;
  huart1.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT;
  HAL_UART_Init(&huart1);
  

}

UART1 経由で送信しているバイトは次のとおりです。

        0   1   2   3   4   5   6   7   8   
000x    68  0B  0B  68  53  FD  52  FF  FF  .. etc.

0x68 = 0b01101000
0x0B = 0b00001011
0xFD = 0b11111101  <-- Character starting with 1, baudrate should be detected


0xFD : 
     start  1  1 .....
___  bit   __________
   ¦______¦
...
                                            

ボーレートが検出されないのはなぜですか? 私はもう試した:

UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBITUART_ADVFEATURE_AUTOBAUDRATE_ONFALLINGEDGE

そこで、モード設定の順序とドライバーでの有効化を次のように調整しました。

  /* if required, configure auto Baud rate detection scheme */              
  if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT))
  {
    assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart->AdvancedInit.AutoBaudRateEnable));
    MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable);
    /* set auto Baudrate detection parameters if detection is enabled */
    if(huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE)
    {
      assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode));
      MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode);
    }
  }

  /* if required, configure auto Baud rate detection scheme */              
  if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT))
  {
    assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart-
    /* set auto Baudrate detection parameters if detection is enabled */
    if(huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE)
    {
      assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode));
      MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode);
    }
    MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable);
  }

何もしません。

また、以下は問題ないようです。

クロックソースの周波数は、予想される通信速度と互換性がある必要があります (16 でオーバーサンプリングする場合、ボーレートは fCK/65535 から fCK/16 の間です。8 でオーバーサンプリングする場合、ボーレートは fCK/65535 から fCK/8 の間です)。

私は16でオーバーサンプリングしているので、

fCK= 16000000

fCK >  16000000 / 65535 = 244     = 244  Hz
fCK <  16000000 / 16    = 1000000 = 1   MHz

私の選択したボーレートは次のとおりです。19200/ 9600 /2400 /300

4

3 に答える 3

4

STM32L0 の自動ボー レート検出ハードウェアによって検査される 1 バイトの正確な内容を指定できない場合でも、次の仮定を行うことができれば、「独自の」自動ボー レート検出スキームを作成できる可能性があります。あなたのシステム:

  • 自動ボー検出プロセス中に、任意の数の連続した受信文字を破棄することができます。

  • 複数の文字が受信されている任意の間隔で、ビット シーケンス010またはビット シーケンス101が比較的一般的に発生していると見なすことができます。

  • デバイスには、USART Rx 信号と同じデバイス ピンにマップできる汎用タイマ ペリフェラルがあります。

上記のすべてが当てはまる場合、チップ上の汎用タイマー ペリフェラルのいずれかの入力キャプチャ機能を使用して、独自の自動ボー レート検出方式を作成できます。これらのタイマーは、クロック ソースとして内部 16 MHz クロックを使用するように構成できます。各タイマーには 16 ビットのカウンターが含まれています。16 MHz クロックの場合、タイマーのパルス測定分解能は (1/16,000,000 Hz) = 62.5 nS です。

好みのボー レートでの 1 ビットの持続時間は次のとおりです。

 Baud   Microseconds   62.5-nS Clocks
 ----   ------------   --------------
  300      3,333.3         53,333
 2400        416.7          6,667  
 9600        104.2          1,667
19200         52.1            833

入力キャプチャ モードでタイマーを設定し、隣接する 2 つのエッジ遷移間のクロック数をカウントします。比較的多数のサンプル、たとえば 100 に対してこの操作を実行します。これらのサンプルの多くは、2 つ以上の隣接するゼロ、または 2 つ以上の隣接するゼロの幅を表します。しかし、あなたは最短のサンプルを探しています。831 から 835 カウントの間にあるものを見つけた場合、ボー レートが 19200 であると合理的に確信できます。 9600.など。

このプロセスの間、タイマーがピンに割り当てられている間、USART は無効になります。使用する適切なボー レートを決定した後、ピンを再構成して USART Rx ペリフェラル機能に割り当てます。

于 2016-01-25T16:51:52.580 に答える
3

(自動ボー レート モード 0)を使用しABRMOD[1:0] = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBITているため、自動ボー メカニズムが適切に機能するには、初期化後に受信した最初の文字の MSB が高くなければなりません。しかし、データバイトのシーケンスは

68  0B  0B  68  53  FD  52  FF  FF  .. etc.

このシーケンスの最初のバイト0x68は、下位の MSB を持つ です。したがって、自動ボー検出ハードウェアは正しくない値を BRR に書き込みます。最初のバイトを MSB が高くなるように変更すると、問題が解決するはずです。


編集

STM32L0 には 4 つの自動ボーレート検出モードがあり、測定するバイトのさまざまな特性を指定できます。RM0367リファレンスマニュアルから:

これらのモードは次のとおりです。

  • モード 0: 1 のビットで始まる任意の文字。この場合、USART は開始ビットの持続時間を測定します (立ち下がりエッジから立ち上がりエッジまで)。

  • モード 1: 10xx ビット パターンで始まる任意の文字。この場合、USART は開始と最初のデータ ビットの期間を測定します。測定は立ち下がりエッジから立ち下がりエッジまで行われるため、信号の傾きが遅い場合でも精度が向上します。

  • モード 2: 0x7F 文字フレーム (LSB ファースト モードでは 0x7F 文字、MSB ファースト モードでは 0xFE の場合があります)。この場合、ボーレートは最初にスタート ビット (BR) の終わりで更新され、次にビット 6 の終わりで更新されます (立ち下がりエッジから立ち下がりエッジまでの測定に基づく: BR6)。ビット 0 からビット 6 は BR でサンプリングされ、文字のその他のビットは BR6 でサンプリングされます。

  • モード 3: 0x55 文字フレーム。この場合、ボーレートは最初に開始ビット (BR) の終わりで更新され、次にビット 0 の終わり (立ち下がりエッジから立ち下がりエッジまでの測定に基づく: BR0)、最後にビットの終わりで更新されます。 6 (BR6)。ビット 0 は BRs でサンプリングされ、ビット 1 からビット 6 は BR0 でサンプリングされ、さらに文字のビットは BR6 でサンプリングされます。並行して、RX ラインの中間遷移ごとに別のチェックが実行されます。RX の遷移がレシーバと十分に同期していない場合、エラーが生成されます (レシーバはビット 0 で計算されたボーレートに基づいています)。

自動ボー検出を有効にした後に受信した最初のバイトが上記のモードのいずれかに適合するかどうかを確認できない場合は、ビルトインの自動ボー検出機能が機能しない可能性があります。

ただし、すべてが失われるわけではありません。あなたの質問に対する私の2番目の回答を参照してください。

于 2016-01-23T12:10:29.127 に答える
2

データシートから ( This one、759ページ)。"自動ボーレート検出を有効にする前に、自動ボーレート検出モードを選択する必要があります" . --> 行を次のように切り替えてみてください:

huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_AUTOBAUDRATE_INIT; huart1.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT; huart1.AdvancedInit.AutoBaudRateEnable = UART_ADVFEATURE_AUTOBAUDRATE_ENABLE;`

HAL_UART_Init(&huart1);とにかくinit プロセスを開始しても大きな違いはないと思います。しかし、試してみる価値はあります。クロックソースの周波数も確認できます。

于 2016-01-19T11:23:03.113 に答える