STM32L4 problema USART

-2

Intenté desarrollar un ejemplo de USART en el kit de descubrimiento stm32L476, pero tengo algunos problemas con los controladores HAL, creo que estoy usando la función de activación de reloj de la interfaz de USART incorrecta y las funciones de activación del reloj de USART GPIO.

Aquí está mi código:

void HAL_USART_MspInit(USART_HandleTypeDef* U)
{

    RCC_APB2ENR_USART1EN;
    RCC_AHB2ENR_GPIOBEN;


    GPIO_InitTypeDef G;
    G.Pin = GPIO_PIN_6 |GPIO_PIN_7;
    G.Mode = GPIO_MODE_AF_PP;
    G.Pull = GPIO_NOPULL;
    G.Alternate = GPIO_AF7_USART1;
    G.Speed = GPIO_SPEED_HIGH;
    HAL_GPIO_Init(GPIOB,&G);
}

void USART_Init()
{
    USART_HandleTypeDef U;
    U.Instance = USART1_BASE;
    U.Init.BaudRate = 9600;
    U.Init.WordLength = USART_WORDLENGTH_8B;
    U.Init.Parity = USART_PARITY_NONE;
    U.Init.StopBits = USART_STOPBITS_1;
    U.Init.Mode = USART_MODE_TX_RX;
    HAL_USART_Init(&U);
}

Y aquí está la descripción del controlador:

    The USART HAL driver can be used as follows:

  (#) Declare a USART_HandleTypeDef handle structure (eg. USART_HandleTypeDef husart).
  (#) Initialize the USART low level resources by implementing the HAL_USART_MspInit() API:
      (++) Enable the USARTx interface clock.
      (++) USART pins configuration:
        (+++) Enable the clock for the USART GPIOs.
        (+++) Configure these USART pins as alternate function pull-up.
      (++) NVIC configuration if you need to use interrupt process (HAL_USART_Transmit_IT(),
            HAL_USART_Receive_IT() and HAL_USART_TransmitReceive_IT() APIs):
        (+++) Configure the USARTx interrupt priority.
        (+++) Enable the NVIC USART IRQ handle.
        (++) USART interrupts handling:
          -@@-   The specific USART interrupts (Transmission complete interrupt,
              RXNE interrupt and Error Interrupts) will be managed using the macros
              __HAL_USART_ENABLE_IT() and __HAL_USART_DISABLE_IT() inside the transmit and receive process.
      (++) DMA Configuration if you need to use DMA process (HAL_USART_Transmit_DMA()
           HAL_USART_Receive_DMA() and HAL_USART_TransmitReceive_DMA() APIs):
        (+++) Declare a DMA handle structure for the Tx/Rx channel.
        (+++) Enable the DMAx interface clock.
        (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
        (+++) Configure the DMA Tx/Rx channel.
        (+++) Associate the initialized DMA handle to the USART DMA Tx/Rx handle.
        (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx channel.

  (#) Program the Baud Rate, Word Length, Stop Bit, Parity, Hardware
      flow control and Mode (Receiver/Transmitter) in the husart handle Init structure.

  (#) Initialize the USART registers by calling the HAL_USART_Init() API:
      (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
           by calling the customized HAL_USART_MspInit(&husart) API.

[..]
 (@) To configure and enable/disable the USART to wake up the MCU from stop mode, resort to UART API's
    HAL_UARTEx_StopModeWakeUpSourceConfig(), HAL_UARTEx_EnableStopMode() and                 
    HAL_UARTEx_DisableStopMode() in casting the USART handle to UART type UART_HandleTypeDef.                

Desafortunadamente, creo que me he perdido algo, pero no puedo entenderlo. Intento buscar algunos ejemplos, pero no encontré nada.

    
pregunta pthben

2 respuestas

1

Intenté generar lo que quieres con stm32CubeMX, esto es lo que ofrece:

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(huart->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();

    /**USART1 GPIO Configuration    
    PB6     ------> USART1_TX
    PB7     ------> USART1_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN USART1_MspInit 1 */

  /* USER CODE END USART1_MspInit 1 */
  }

}
/* USART1 init function */
void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  HAL_UART_Init(&huart1);

}

tienes que habilitar el reloj periférico usando __HAL_RCC_USART1_CLK_ENABLE () También podría ser el pull-up que olvidaste ...

¿Podrías precisar cuál es el problema? ¿Y mostrarnos tu principal?

    
respondido por el Florent
1

Aquí hay un ejemplo copiado del proyecto STM32F4. Tienes que reemplazar los pines y la instancia de USART.

void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    __GPIOA_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_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}



UART_HandleTypeDef huart2;

void MX_USART2_UART_Init(void)
{
    __USART2_CLK_ENABLE();

    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;
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart2);
}

Me gustaría resaltarle las funciones de habilitación de reloj provistas por HAL:

__GPIOA_CLK_ENABLE();
__USART1_CLK_ENABLE();

Úsalos para habilitar el reloj. En su código actual, RCC_APB2ENR_USART1EN; y RCC_AHB2ENR_GPIOBEN; son solo posiciones de bit en el registro de control de reloj. Si desea establecer estos bits directamente, debe hacerse algo como esto:

RCC->APB2ENR |= (APB2_EN_MASK | RCC_APB2ENR_USART1EN);

Como ya está utilizando el controlador HAL, le sugiero que use estas funciones, son las mismas para el STM32L4:

__GPIOA_CLK_ENABLE();
__USART1_CLK_ENABLE();

Para enviar datos usa la siguiente función:

HAL_UART_Transmit(&huart1, "msg\r\n", 5, 0xFFFFFF);

Y como ya se ha señalado, STMicroelectronics ofrece una herramienta llamada STM32CubeMX , que le proporciona una serie de códigos de ejemplo y le ayuda a inicializar su hardware.

    
respondido por el Bence Kaulics

Lea otras preguntas en las etiquetas