芯片F030:
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(uartHandle->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/* USART1 clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspInit 1 */
/* USER CODE END USART1_MspInit 1 */
}
}
RX和TX均设置为复用推挽输出
这和以往的认识是不同的:
RX:浮空输入
TX:复用推挽输出
解答:
F103与F030的uart寄存器操作是不同的!F103才是如上这种配置!
图1:
图2:
图1就是配置所需寄存器的说明图,对应下图代码:
所以可知,uart的RX是pp,uart的TX是od开漏输出!!引脚功能的区分是由第四步决定的,见图2
F030的uart引脚输入输出配置并不是如代码中1的表面意思:PA9和PA10都是复用推挽输出,本质上是理解GPIO_MODE_AF_PP错误,这里的GPIO_MODE_AF_PP值是2,见下图,本意是复用模式而不是复用推挽输出
F030的HAL库沿用的其他产品的定义,将GPIOx_MODER和GPIOx_OTYPER寄存器的定义混在一块,导致了产生此疑惑,同时证明一点,依赖库HAL库不了解底层实现是不行的。
继续翻看F030标准库的uart配置:
GPIO_InitTypeDef GPIO_InitStructure;
/* USART1 Pins configuration ************************************************/
/* Connect pin to Periph */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
/* Configure pins as AF pushpull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
以上配置清晰易懂,将GPIO_OType 设为推挽输出,PA9和PA10都会设为推挽输出!?????
或者该寄存器的设置是无效的!最终还是通过外设自动对两个IO口进行控制?????
验证:GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;或注释掉
UART是否正常???
上图可知,一旦是复用,那么控制权归外设!外设设置PA9,10的输入输出状态??