安装后,USART不在STM32L475上工作
我使用演示板B-L475E-IOT01A。在CN3连接器上-pin1-PA1-RX,pin2-PA0-TX。因此我配置UART4安装后,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
#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;}