2016-06-28 13 views
-1

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

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/* Initalisation */

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

は、2つの方法があります非常に

+0

このサイトは実際にはコードソリューションを見つけるのに使用することを意図したものではなく、ウェブ検索を使用する必要があります。 –

+0

あなたのコメントのためのThnks – Ibrahim

答えて

0

をお願いします。

「ブルートフォース」トライアル&エラーを使用して、ボーレートを変更しないで、すべてのUARTフラグにエラーがないかチェックし、正しいものが見つかるまで繰り返します。これは、「遅い」ということです。ボーレートの可能性があるだけ多くの受信データバイトをチェックする必要があります。また、ボーレートを変更したときに受信したバイトがどこにないのか分からないので、バイトをミスすることもあります。すなわち、連続送信を仮定します。

インプットキャプチャ機能を使用して、UART rxラインをタイマーピンに配線することが、より簡単で迅速なソリューションです。単に2つのエッジ間の時間を測定します。あなたがどこかで最短の受信パルスを捕らえたことが確実であるように、x個のサンプルを取る。最短の受信パルスは1ビットに等しくなければなりません。そして、1/t = fなので、単純に1ビットの時間を反転させて、周波数=ボーレートを得る。