2016-06-28 40 views
-1

IHello :) STM32L031K6이 있고 CubeMx를 사용합니다. 일부 수신자 기능을 원한다면 수신 기능이 내가 할 수있는 전송 속도 (전송 속도)의 자동 감지 기능을 추가하는 것입니다. 내가하지 그것을 어떻게 온라인 코드 예제를 찾을 수 있습니다 :/자동 감지 budrate serial 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(); 
    } 
} 

에게

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

    } 
} 
Main.c 파일을

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

(210)는 당신에게 매우

+0

이 사이트는 실제로 코드 솔루션을 찾는 데 사용하기위한 것이 아니며 대신 웹 검색을 사용해야합니다. –

+0

Thnks 님의 의견 – Ibrahim

답변

0

많은 방법은 두 가지가 있습니다 감사합니다.

"brute force"trial & 오류를 사용하십시오. 여기서 baudrate를 계속 변경하고 모든 UART 플래그에 오류가 있는지 확인한 다음 올바른 UART 플래그를 찾을 때까지 반복하십시오. 이것의 아래쪽은 "느리다"는 것입니다, 당신은 가능한 많은 baudrates가있는 것처럼 많은 수신 된 데이터 바이트를 체크 할 필요가 있습니다. 당신은 또한 baudrate를 변경할 때 수신 된 바이트가 어디에 있는지 알지 못하기 때문에 바이트를 놓칠 수도 있습니다. 즉, 지속적인 전송을 가정합니다.

UART rx 라인을 입력 캡처 기능으로 타이머 핀에 연결하는 것이 더 간단하고 빠른 솔루션입니다. 단순히 두 모서리 사이의 시간을 측정하십시오. 당신이 가장 짧은 펄스를 어딘가에 잡았 음을 확신 할 수 있도록 x 개의 샘플을 취하십시오. 최단 수신 펄스는 1 비트와 같아야합니다. 그리고 1/t = f 이후, 단순히 1 비트의 시간을 반전하여 주파수 = 보오율을 얻습니다.