USART не работает на STM32L475 после установки - PullRequest
1 голос
/ 26 января 2020

Я работаю с демонстрационной платой B-L475E-IOT01A. На разъеме CN3 - контакт 1 - PA1-RX, контакт 2 - 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;
}

I go построчно в отладчике, и, похоже, все в порядке. Однако, когда я подключаюсь к терминалу с конвертером TTL-USB, нет передачи и приема. Оба светодиода TX / RX на преобразователе TTL-USB включены. Конвертер TTL-USB протестирован на других платах и ​​работает нормально. Я что-то пропустил?

1 Ответ

0 голосов
/ 29 января 2020

сначала я включаю часы порта

    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
...