首页 > 解决方案 > 设置后 USART 无法在 STM32L475 上工作

问题描述

我使用演示板 B-L475E-IOT01A。在 CN3 连接器上 - pin1 - PA1-RX,pin2 - PA0-TX。所以我为UART4配置。

#define UART4_PORT GPIOA
#define UART4_TX_PIN LL_GPIO_PIN_0
#define UART4_RX_PIN LL_GPIO_PIN_1

int USART_Setup(USART_TypeDef *USARTx, uint32_t baud_rate)
{
    LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);

    if (USARTx == UART4)
    {
        irq_num = UART4_IRQn;

        /* Configure Tx Pin as : Alternate function, High Speed, Push pull, Pull up */
        LL_GPIO_SetPinMode(UART4_PORT, UART4_TX_PIN, LL_GPIO_MODE_ALTERNATE);
        LL_GPIO_SetAFPin_8_15(UART4_PORT, UART4_TX_PIN, LL_GPIO_AF_8);
        LL_GPIO_SetPinSpeed(UART4_PORT, UART4_TX_PIN, LL_GPIO_SPEED_FREQ_HIGH);
        LL_GPIO_SetPinOutputType(UART4_PORT, UART4_TX_PIN, LL_GPIO_OUTPUT_PUSHPULL);
        LL_GPIO_SetPinPull(UART4_PORT, UART4_TX_PIN, LL_GPIO_PULL_UP);

        /* Configure Rx Pin as : Alternate function, High Speed, Push pull, Pull up */
        LL_GPIO_SetPinMode(UART4_PORT, UART4_RX_PIN, LL_GPIO_MODE_ALTERNATE);
        LL_GPIO_SetAFPin_8_15(UART4_PORT, UART4_RX_PIN, LL_GPIO_AF_8);
        LL_GPIO_SetPinSpeed(UART4_PORT, UART4_RX_PIN, LL_GPIO_SPEED_FREQ_HIGH);
        LL_GPIO_SetPinOutputType(UART4_PORT, UART4_RX_PIN, LL_GPIO_OUTPUT_PUSHPULL);
        LL_GPIO_SetPinPull(UART4_PORT, UART4_RX_PIN, LL_GPIO_PULL_UP);

        LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_UART4);

        LL_RCC_SetUSARTClockSource(LL_RCC_UART4_CLKSOURCE_PCLK1);
    }

    NVIC_SetPriority(irq_num, 0);  
    NVIC_EnableIRQ(irq_num);

    /* TX/RX direction */
    LL_USART_SetTransferDirection(USARTx, LL_USART_DIRECTION_TX_RX);

    /* 8 data bit, 1 start bit, 1 stop bit, no parity */
    LL_USART_ConfigCharacter(USARTx, LL_USART_DATAWIDTH_8B, LL_USART_PARITY_NONE, LL_USART_STOPBITS_1);

    LL_USART_SetBaudRate(USARTx, SystemCoreClock, LL_USART_OVERSAMPLING_16, baud_rate); 

    LL_USART_Enable(USARTx);

    //enable RX buffer not empty interrupt
    USARTx->CR1 |= USART_CR1_RXNEIE;

    /* Polling USART initialisation */
   while((!(LL_USART_IsActiveFlag_TEACK(USARTx))) || (!(LL_USART_IsActiveFlag_REACK(USARTx))))
   { 
        timeout++;
        if (timeout > 1000000)
        {
            return USART_ERROR;
        }
   }

    return USART_OK;
}

我在调试器中逐行进行,似乎没问题。但是,当我使用 TTL-USB 转换器连接到终端时,没有传输也没有接收。TTL-USB 转换器上的两个 LED TX/RX 均亮起。TTL-USB 转换器在其他板上经过测试,工作正常。我错过了什么吗?

标签: stm32

解决方案


首先我启用端口时钟

    LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
    LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
    LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
    LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD);
    LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOE);
    LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH);

    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);

之后我看到

GPIOA->AFRL - 0x00000000
GPIOA->AFRH - 0x00000000

然后

LL_GPIO_SetAFPin_8_15(UART4_PORT, UART4_TX_PIN, LL_GPIO_AF_8);
LL_GPIO_SetAFPin_8_15(UART4_PORT, UART4_RX_PIN, LL_GPIO_AF_8);

它保持全零。

GPIOA->AFRL - 0x00000000
GPIOA->AFRH - 0x00000000

推荐阅读