¿Puede esta rutina de interrupción stm32f0 que se activa en cada byte recibido ser lo suficientemente rápida para 6Mbps?

0

Estoy utilizando el panel de descubrimiento STM32F0. Estoy viendo este tutorial en UART con el STM32F0. enlace

//variables need to be declared at the beginning 
char Rx_indx, Rx_data[2], Rx_Buffer[100], Transfer_cplt;

//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    uint8_t i;
    if (huart->Instance == USART1)  //current UART
        {
        if (Rx_indx==0) {for (i=0;i<100;i++) Rx_Buffer[i]=0;}   //clear Rx_Buffer before receiving new data 

        if (Rx_data[0]!=13) //if received data different from ascii 13 (enter)
            {
            Rx_Buffer[Rx_indx++]=Rx_data[0];    //add data to Rx_Buffer
            }
        else            //if received data = 13
            {
            Rx_indx=0;
            Transfer_cplt=1;//transfer complete, data is ready to read
            }

        HAL_UART_Receive_IT(&huart1, Rx_data, 1);   //activate UART receive interrupt every time
        }

}

La rutina de interrupción se activa al recibir un solo byte en UART. No estoy seguro de si puede soportar 6 Mbps como se menciona en la hoja de datos. Si no, ¿puede soportar hasta al menos 115 kbps? ¿Cómo se puede hacer que el código soporte hasta 6Mbps?

    
pregunta user768421

2 respuestas

3

Necesitaría usar la transferencia DMA en FIFO y un temporizador de captura conectado en el mismo pin que UART RX. Al recibir todos los datos que se transfieren en FIFO con DMA, el temporizador de captura debe configurarse para que después de un tiempo de espera (con respecto a la longitud del bit a esa velocidad) se active una interrupción. En ese ISR usted evalúa el FIFO y analiza el telegrama. Por supuesto, tiene que haber lagunas en la comunicación para poder evaluar, no para una transmisión continua

EDITAR: Obtuve un documento que explica exactamente: enlace

    
respondido por el Marko Buršič
4

La posible velocidad de cualquier rutina de software, ya sea una rutina de interrupción o no, se puede perfilar fácilmente. La forma en que se hace esto es comprometer uno de los pines GPIO de la MCU como un pin de salida conectado a un osciloscopio. (Un analizador lógico puede funcionar también). En el fragmento de código que desea perfilar, configure el GPIO al comienzo de la rutina y bórrelo al final de la rutina. Ejecute el código y mida los pulsos GPIO resultantes en el alcance.

Al utilizar esta técnica, ya no es necesario hacer preguntas sobre "si esto es lo suficientemente rápido" o "si cambio el código, ¿cómo afecta el tiempo?".

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas