Saltar a contenido

Notas de desarrollo de la biblioteca HAL - Comunicación serie

Este artículo se basa en el conjunto de desarrollo RobotCtrl de desarrollo propio, con un núcleo de microcontrolador STM32F407ZET6 y utiliza el chip SP3232EEN para la comunicación RS-232. Para ver el esquema y obtener una descripción detallada, por favor consulta RobotCtrl - STM32 Conjunto de Desarrollo Universal.

Principios Básicos

Para comprender los principios básicos de la comunicación serie, consulta el artículo Protocolo de Comunicación - Comunicación Serie.

Experimento de Comunicación Serie

Antes de llevar a cabo el próximo experimento, es necesario configurar varios parámetros en CubeMX, como la descarga de la comunicación serie, la configuración de la frecuencia del reloj, entre otros. Para conocer los detalles completos, consulta el artículo Notas de Desarrollo de la Biblioteca HAL - Configuración del Entorno para obtener instrucciones detalladas.

Configuración en CubeMX

Imagen

De acuerdo con el esquema original, el puerto serie que utilizaremos para el experimento es USART1, es decir, los pines PA9 y PA10. En CubeMX, primero debemos configurar estos dos pines como pines de envío y recepción para USART1. Luego, en la pestaña USART1 de la izquierda, establecer el modo como asíncrono (Asynchronous) y ajustar los parámetros como la velocidad en baudios (Baud Rate):

Imagen

Los detalles de los parámetros son los siguientes:

  • Configuración de Baud Rate: No hay una velocidad de baudios única que sea la mejor; se debe ajustar según las necesidades y para que coincida con el asistente de depuración de comunicación serie.
  • Número de bits de datos (Word Length): Si se habilita la comprobación de paridad, el número real de bits de datos será uno menos.
  • Paridad (Parity): Puede elegir entre la comprobación de paridad par o impar, o no utilizarla.
  • Bits de parada (Stop Bits): Un bit adicional o dos se utilizan como señales de fin de transmisión o recepción.
  • Dirección de datos (Data Direction): Puede seleccionar entre enviar solamente, recibir solamente o el modo de enviar y recibir.
  • Muestreo excesivo (Over Sampling): Una tasa de muestreo 8x o 16x puede prevenir eficazmente errores de datos.

Por último, habilita las interrupciones de USART1 en la pestaña NVIC, como se muestra en la imagen:

Imagen

Configuración en el Código

Primero, debes agregar el siguiente código al final del archivo stm32f4xx_it.c:

stm32f4xx_it.c
/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance==USART1)
    {
        HAL_UART_Receive_IT(huart, &aRxBuffer, 1); // Recibir e ingresar en aRxBuffer
        HAL_UART_Transmit(huart, &aRxBuffer, 10, 0xFFFF); // Enviar el aRxBuffer recibido
    }
}
/* USER CODE END 1 */

Aquí, Buffer es una variable global de tipo uint8_t definida en el archivo main.c. En este código, se genera una interrupción después de recibir cada byte, se devuelve ese byte de datos y se habilita la interrupción nuevamente. Asegúrate de definir esta variable tanto en main.c como en stm32f4xx_it.c.

main.c
/* Variables Privadas -----------------------------------------------------------*/
/* USER CODE BEGIN PV */

uint8_t aTxBuffer[] = "PRUEBA DE USART\r\n"; // Cadena a enviar
uint8_t aRxBuffer[20]; // Cadena de recepción

/* USER CODE END PV */
stm32f4xx_it.c
/* Variables Privadas -----------------------------------------------------------*/
/* USER CODE BEGIN PV */

extern uint8_t aTxBuffer;
extern uint8_t aRxBuffer;

/* USER CODE END PV */

Además, en main.c, necesitamos habilitar la interrupción de recepción después de la inicialización de UART y antes del bucle principal:

main.c
/* USER CODE BEGIN 2 */

HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1); // Habilitar la interrupción de recepción

/* USER CODE END 2 */

También puedes enviar un mensaje de inicialización para indicar que la UART está lista:

main.c
/* USER CODE BEGIN 2 */

HAL_UART_Transmit(&huart1, (uint8_t*) aTxBuffer, sizeof(aTxBuffer) - 1, 0xFFFF); // Enviar la cadena aTxBuffer

/* USER CODE END 2 */

Si necesitas redirigir la función printf para usarla en la salida por UART en un dispositivo STM32, consulta STM32CubeIDE 串口重定向(printf)及输出浮点型 para obtener más información.

Descarga y Verificación

Después de cargar el programa con éxito, abre un programa de asistencia de UART y configura el puerto y la velocidad de baudios correspondientes.

Una vez que estés conectado al puerto UART, se imprimirá inicialmente el contenido de aTxBuffer, y luego se mostrará en la pantalla el contenido recibido en aRxBuffer, tal como se muestra en la imagen:

Imagen

Referencias y Agradecimientos

Dirección original del artículo: https://wiki-power.com/ Este artículo está protegido por la licencia CC BY-NC-SA 4.0. Si desea reproducirlo, por favor indique la fuente.

> Este post está traducido usando ChatGPT, por favor [**feedback**](https://github.com/linyuxuanlin/Wiki_MkDocs/issues/new) si hay alguna omisión.