-1

IHello :) 私は STM32L031K6 を持っていて、CubeMx を使用しています。私の受信機能は、どうすれば伝送速度(ボーレート)の自動検出を追加することができますか。私はそれを行う方法をオンラインでコード例を見つけることができません:/

Usart.c

UART_HandleTypeDef huart2;

/* USART2 init function */

void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 9600;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_EVEN;
  huart2.Init.Mode = UART_MODE_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart2.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE;
  huart2.AdvancedInit.DMADisableonRxError = UART_ADVFEATURE_DMA_DISABLEONRXERROR;  
 huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_AUTOBAUDRATE_INIT;

      /* Configure the AutoBaudRate method */
  huart2.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT; //Mode 0

  /* Enable AutoBaudRate feature */
  huart2.AdvancedInit.AutoBaudRateEnable = UART_ADVFEATURE_AUTOBAUDRATE_ENABLE;

  /* Wait until Receive enable acknowledge flag is set */
  while(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_REACK) == RESET)
  {} 

  /* Wait until Transmit enable acknowledge flag is set */ 
  while(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TEACK) == RESET)
  {} 

  /* Loop until the end of Autobaudrate phase */
  while(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_ABRF) == RESET)
  {}

  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  } 
}

Main.c

int main(void)
{
    //Initialisation de la carte STM32L031K6
    HW_Init(); 
  while (1)
  {
  }

Hardware.c /* 初期化 */

void HW_Init(void)
{  
    /* Remise à zéro de tous les périphériques, Initialise l'interface flash    */
    /* et System Timer (SysTick) */
  HAL_Init();

    /* Configuration de l'horloge à 8Mhz pour notre cas */
  SystemClock_Config();

  /* Initialisation tous les périphériques configurés GPIO (Led verte) */
    /* et USART2*/
  MX_GPIO_Init();
  MX_USART2_UART_Init();

    /* If AutoBaudBate error occurred */
  if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_ABRE) != RESET)
  {}
  else
  {  
    /* Wait until RXNE flag is set */
    while(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) == RESET)
    {}

    /* Wait until TXE flag is set */   
    while(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE) == RESET)
    {}

      /* Receive data */
        HAL_UART_Receive_IT(&huart2, Rx_data, 1);

  }
}

IRQ_Receive.c /* 割り込み受信後 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    //Tester L'UART selectionner en l'occurence pour nous c'est l'USART2
    if (huart->Instance == USART2)
    {  
        /* Appeler notre fonction receive qui permet de sauvegarder chaque octet */
        /* reçu dans un Buffer */
        Receive();
        HAL_UART_Receive_IT(&huart2, Rx_data, 1);   
    }
}

どうもありがとうございます

4

1 に答える 1

0

2つの方法があります。

ボーレートを変更し続ける「総当たり」の試行錯誤を使用し、すべての UART フラグでエラーをチェックしてから、正しいフラグが見つかるまで繰り返します。これの欠点は、「遅い」ことです。可能なボーレートと同じ数の受信データバイトをチェックする必要があるかもしれません。ボーレートを変更すると、受信したバイトのどこにいるのかわからないため、バイトを見逃す可能性もあります。つまり、連続送信を前提としています。

より簡単で迅速な解決策は、UART rx ラインを入力キャプチャ機能を備えたタイマー ピンに配線することです。2 つのエッジ間の時間を測定するだけです。どこかで最短の受信パルスをキャッチしたことを確認できるように、x 個のサンプルを取得します。最短の受信パルスは 1 ビットに相当する必要があります。また、1/t=f であるため、単に 1 ビットの時間を反転して周波数 = ボーレートを取得します。

于 2016-06-29T07:04:13.367 に答える