Cómo usar el puerto serial STM32 Nucleo

Cómo usar el puerto serial STM32 Nucleo

Como hemos visto en el tutorial anterior sobre esta nueva placa de desarrollo de ST, el STM32 Nucleo proporciona una interfaz integrada de ST Link v2.1. ST Link está diseñado principalmente para permitir el flasheo de la MCU de destino a través de la interfaz mini-USB. Pero, proporciona al menos otra característica realmente útil: un puerto COM virtual. Cuando instala los controladores ST-Link, aparece un nuevo dispositivo en su lista de dispositivos de hardware: el puerto COM virtual de ST-Link.

2015-01-24 08_38_11-Administrador de dispositivos

Si usa una PC con Linux o una Mac, encontrará un nuevo terminal en el directorio / dev . Generalmente, este dispositivo se llama algo similar a tty.usbmodemXXXX , como se muestra a continuación.

Pantalla 2015-01-24 a las 08.40.43

El puerto serie es útil sobre todo por dos razones: si desea depurar sus mensajes de impresión de firmware (no es estrictamente necesario con la arquitectura ARM, ya que también podemos usar semihosting ARM ) o si desea intercambiar comandos y mensajes entre su placa Nucleo y su PC (quizás, utilizando una aplicación dedicada que está construyendo).

En esta publicación, le mostraré cómo configurar y usar correctamente el puerto COM virtual integrado de la placa Núcleo STM32. Pero, antes de comenzar a codificar, podría ser realmente útil echar un vistazo al hardware. ST proporciona el proyecto de hardware completo del STM32 Nucleo (la placa está diseñada con Altium Designer CAD , un CAD profesional usado en la industria electrónica, pero no es necesario que tenga un software tan costoso para usar su Nucleo). Asumiré el modelo Nucleo-F401RE, pero debería ser realmente fácil reorganizar las instrucciones para usar adecuadamente su Nucleo específico.

Primero: pinout

Un MCU complejo pero flexible como el STM32 proporciona E / S que tienen funcionalidades de “sobrecarga”. Esto significa que, antes de que podamos usar un periférico (en nuestro caso, el USART), necesitamos configurar los periféricos asociados a los pines correspondientes. Mirando a la herramienta STM32CubeMX, descubrimos que el procesador STM32F401RETx tiene 3 USART diferentes: USART1 , USART2 y USART6 .

2015-01-24 08_52_46-STM32CubeMX uart2.ioc_ STM32F401RETx

Ahora tenemos que echar un vistazo a los esquemas de Nucleo . Como podemos ver en la siguiente imagen, los puertos USART_TX y USART_RX están conectados a los pines PA2 y PA3. Esto significa que la placa Nucleo está configurada para usar el periférico USART2 de la MCU de destino.

stm32-nucleo-usart-pinout

De acuerdo. Hemos recopilado toda la información necesaria relacionada con el hardware necesario para iniciar la codificación.

LEER MAS  Huawei : su nueva Smart TV 4K es básicamente un enorme móvil de hasta 75 pulgadas

Segundo: el codigo

Antes de comenzar a configurar el periférico USART2, necesitamos un proyecto de prueba. Generaremos un proyecto vacío usando el complemento GCC ARM Eclipse, como se muestra en mi serie sobre la cadena de herramientas GCC para la plataforma STM32. Cuando genera el proyecto de prueba, puede usar los siguientes parámetros de configuración.

Pantalla 2015-01-24 a 09.17.09

Si ha seguido mi tutorial anterior sobre el complemento Eclipse de GNU, ya sabe que los complementos generan una configuración de reloj incorrecta para la placa Nucleo-F4. He mostrado cómo usar la herramienta STM32CubeMX para generar el código de inicialización de reloj correcto. Para simplificar, este es el código que debe ingresar dentro del archivo _initialize_hardware.c .

12345678910111213141516171819202122232425262728voidconfigure_system_clock(void){ RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct;  __PWR_CLK_ENABLE();  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = 6; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 16; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLQ = 7; HAL_RCC_OscConfig(&RCC_OscInitStruct);  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);}

A continuación, tenemos que agregar una función para configurar la interfaz USART. Lo llamamos  MX_USART2_UART_Init , como se muestra a continuación.

12345678910111213UART_HandleTypeDef huart2;…void MX_USART2_UART_Init(void){ huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; HAL_UART_Init(&huart2);}

La función es realmente auto-explicativa. huart2 es una instancia del  descriptor UART_HandleTypeDef. Es una estructura utilizada para configurar el periférico UART. Sin embargo, este código aún no es suficiente para usar el UART. Necesitamos configurar la parte de hardware, configurando los pines correctos e inicializando los relojes correctos asociados al periférico UART. Este trabajo se realiza con la siguiente función de gancho:

12345678910111213141516171819202122…void HAL_UART_MspInit(UART_HandleTypeDef* huart){  GPIO_InitTypeDef GPIO_InitStruct;  if(huart->Instance==USART2)  {    __GPIOA_CLK_ENABLE();    __USART2_CLK_ENABLE();     /**USART2 GPIO Configuration    PA2     ——> USART2_TX    PA3     ——> USART2_RX    */    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;    GPIO_InitStruct.Pull = GPIO_NOPULL;    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  }}…

Incluso en este caso, el código es realmente autoexplicativo. Primero, necesitamos inicializar el reloj periférico para PORTA GPIOs. A continuación, debemos habilitar el reloj asociado al periférico UART2. Finalmente, tenemos que configurar PIN2 y PIN3 como UART2 TX y UART2 RX.

LEER MAS  EW - Design Edition - Cadence Electromagnetic Simulation, Fujitsu Deep Learning y más

Un aspecto importante a destacar es que no necesitamos llamar explícitamente a esta función en la sección de inicialización. Esta es una función de enlace llamada automáticamente por la función  HAL_UART_Init () que llamamos dentro de la función  MX_USART2_UART_Init () . El lugar correcto para llamar a esta función de inicialización es dentro de la función  __initialize_hardware ()  en el  archivo _initialize_hardware.c .

De acuerdo. Ahora solo necesitamos escribir una función main () simple para probar el UART.

1234567int main(int argc, char* argv[]){  char *msg = “Hello Nucleo Fun!\n\r”;   HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 0xFFFF);  while(1);}

El main () es realmente simple: simplemente imprime un mensaje en el UART y se cuelga para siempre.

Antes de que podamos compilar todo el proyecto, necesitamos hacer otra operación final. De forma predeterminada, el complemento GNU-ARM para Eclipse deshabilita los archivos HAL STM32 no utilizados, para acelerar la operación de compilación. Por lo tanto, necesitamos habilitar la compilación del  archivo stm32f4xx_hal_uart.c . 
Vaya a Project Explorer-> system-> src-> stm32f4-hal y haga clic con el botón derecho del mouse en el  archivo stm32f4xx_hal_uart.c , como se muestra en la siguiente imagen:

Captura de pantalla 02-2457080 en 1.25.27

Haga clic en “Propiedades” y vaya a C / C ++ Build y desmarque “Excluir de la compilación”, como se muestra a continuación.

Pantalla 02-2457080 en 14.10.44

De acuerdo. Ahora podemos compilar el proyecto de prueba y cargarlo en nuestro tablero Nucleo usando GDB y OpenOCD.

Para ver los mensajes en el UART, tiene varias opciones según el sistema operativo que utilice. En el Eclipse Marketplace encontrará varios complementos de emulador de terminal. TCF es uno de estos. Otra opción para los sistemas operativos Windows es usar masilla . En Mac y Linux, ckermit es una opción adecuada.

Captura de pantalla 02-2457080 en 15.08.19

Deja un comentario

Tu dirección de correo electrónico no será publicada.

CUANTAS HORAS FALTA PARA MAÑANA...