安装后,USART不在STM32L475上工作

安装后,USART不在STM32L475上工作,stm32,Stm32,我使用演示板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

我使用演示板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转换器上的两个TX/RX指示灯都亮起。TTL-USB转换器在其他板上测试,工作正常。我错过了什么吗?

首先我启用端口时钟

    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

首先,我启用端口时钟

    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

通过这种方式,我发送一个字符串void USART_SendString(USART_TypeDef*USART x,const char*string){uint32_t timeout;while(*string){timeout=USART_timeout;while((USART->ISR&USART_ISR_TXE)==0){if(!timeout--)break;//写入清除ISR寄存器USARTx->TDR=*string++}中的TXE标志,并在中断中接收。void UART4_IRQHandler(void){//读取清除ISR寄存器uint8_t chr=UART4->RDR;}这样我发送一个字符串void USART_SendString(USART_TypeDef*USARTx,const char*string){uint32_t timeout;while(*string){timeout=USART_timeout;while((USARTx->ISR&USART_ISR_TXE)==0){if(!timeout--)break;//写入ISR寄存器USARTx->TDR=*string++}}并在中断中接收。void UART4_IRQHandler(void){//reading清除ISR寄存器uint8_t chr=UART4->RDR;}