芯片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:

stm32 HAL库UART配置的疑惑

 

图2:

stm32 HAL库UART配置的疑惑

 

图1就是配置所需寄存器的说明图,对应下图代码:

stm32 HAL库UART配置的疑惑

所以可知,uart的RX是pp,uart的TX是od开漏输出!!引脚功能的区分是由第四步决定的,见图2

F030的uart引脚输入输出配置并不是如代码中1的表面意思:PA9和PA10都是复用推挽输出,本质上是理解GPIO_MODE_AF_PP错误,这里的GPIO_MODE_AF_PP值是2,见下图,本意是复用模式而不是复用推挽输出

stm32 HAL库UART配置的疑惑

 

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是否正常???

 

 

stm32 HAL库UART配置的疑惑

上图可知,一旦是复用,那么控制权归外设!外设设置PA9,10的输入输出状态??

 

相关文章: