問題
芯片:STM32F407,軟件:標準庫
使用串口時,直接把之前STM32F103的串口配置移植過來,同樣以串口4為例,代碼如下:
STM32F103 UART4:
void UART4_Configuration(uint32_t BaudRate)
{USART_InitTypeDef USART_InitStructure;GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //配置端口的TXGPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);//配置端口的RXGPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOC, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = BaudRate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(UART4, &USART_InitStructure); //Enables UART4 Receive Data register not empty interruptUSART_ITConfig(UART4,USART_IT_RXNE,ENABLE);//Enables UART4USART_Cmd(UART4,ENABLE);
}
STM32F407 UART4(錯誤):
void UART4_Init(uint32_t BaudRate)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC);RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_UART4);GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_UART4);//UART4_TX PC10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);
//UART4_RX PC11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOC, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = BaudRate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_ITConfig(UART4, USART_IT_RXNE, ENABLE); //Enable rx enable, /* Configure the USARTx */ USART_Init(UART4, &USART_InitStructure);/* Enable the USARTx */USART_Cmd(UART4, ENABLE);
}
問題來了,同樣的配置,在F103中串口的收發都是正常的。但在F407中,串口就死活接收不到數據。為啥嘞?
解決
仔細檢查代碼發現:時鐘使能,串口參數配置都沒有問題,
那問題應該出現在引腳配置上。
果然! 是UART4_RX的配置出了問題,沒有開啟AF功能。
STM32F407 UART4(正確):
void UART4_Init(uint32_t BaudRate)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC);RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_UART4);GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_UART4);//UART4_TX PC10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);
//UART4_RX PC11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOC, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = BaudRate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_ITConfig(UART4, USART_IT_RXNE, ENABLE); //Enable rx enable, /* Configure the USARTx */ USART_Init(UART4, &USART_InitStructure);/* Enable the USARTx */USART_Cmd(UART4, ENABLE);
}
補充
那F103和F407關于串口的配置有什么區別呢?大概研究了一下,主要有兩點區別:
1,AF(Alternate Function)映射
F103:有 AFIO 模塊,需要使能 AFIO 時鐘(RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
),且很多復用操作通過 AFIO 實現。
F407:F4 系列沒有獨立的 AFIO 模塊(外設復用通過獨立的 GPIO_PinAFConfig 函數配置),所以不需要使能 AFIO 時鐘。
2,GPIO配置
F103中,UART_RX只需要配置為GPIO_Mode_IN即可,AF功能在很多情況下默認已經匹配。
而F407中,UART_RX必須明確配置為GPIO_Mode_AF,并且還需要調用GPIO_PinAFConfig()函數來指定該引腳的具體復用功能,否則UART模塊與引腳之間并沒有正確關聯。
初次使用F407串口時容易遇到的一個小bug,還是挺折磨人的。
如果對您有所幫助,麻煩點贊分享,這對我非常重要,感謝!