OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5339|回复: 3

整个HAL库工程里面找不到UART9和UART10的配置说明,那UART9和UART10怎么使用呢?大家谁用过UART9和UART10,知道怎么回事吗

[复制链接]

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2021-9-10 11:28:48 | 显示全部楼层 |阅读模式
1金钱
整个HAL库工程里面找不到UART9和UART10的配置说明,那UART9和UART10怎么使用呢?大家谁用过UART9和UART10,知道怎么回事吗

最佳答案

查看完整内容[请看2#楼]

找到原因了,HAL库函数中没有考虑UART9和UART10这两种串口的情形,只把USART1和USART6按照所在的APB2时钟设置波特率了,UART9和UART10也在APB2时钟下面。但是没考虑UART9和UART10,程序中除了USART1和USART6,其他串口都按照最后的else情况 ,按照APB1时钟设置了,时钟差别2倍关系,BRR按照APB1设置,实际UART9,UART10时钟确是APB2,所以波特率也是2倍关系。详情查看UART_SetConfig(UART_HandleTypeDef *huart) iif(huart->Init.O ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
 楼主| 发表于 2021-9-10 11:28:49 | 显示全部楼层
本帖最后由 yuanzinpl 于 2021-9-11 17:00 编辑

找到原因了,HAL库函数中没有考虑UART9和UART10这两种串口的情形,只把USART1和USART6按照所在的APB2时钟设置波特率了,UART9和UART10也在APB2时钟下面。但是没考虑UART9和UART10,程序中除了USART1和USART6,其他串口都按照最后的else情况 ,按照APB1时钟设置了,时钟差别2倍关系,BRR按照APB1设置,实际UART9,UART10时钟确是APB2,所以波特率也是2倍关系。详情查看UART_SetConfig(UART_HandleTypeDef *huart)
iif(huart->Init.OverSampling == UART_OVERSAMPLING_8)  {
    /*-------------------------- USART BRR Configuration ---------------------*/
#if defined(USART6)
    if((huart->Instance == USART1) || (huart->Instance == USART6))
    {
      huart->Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate);
    }
#else
    if(huart->Instance == USART1)
    {
      huart->Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate);
    }      
#endif /* USART6 */
    else
    {
      huart->Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate);
    }
  }
  else
  {
    /*-------------------------- USART BRR Configuration ---------------------*/
#if defined(USART6)
    if((huart->Instance == USART1) || (huart->Instance == USART6))
    {
      huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate);
    }
#else
    if(huart->Instance == USART1)
    {
      huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate);
    }      
#endif /* USART6 */
    else
    {
      huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate);
    }
  }

USART1    APB2

USART2    APB1

USART3    APB1

UART4      APB1

UART5      APB1

USART6   APB2

UART7      APB1

UART8      APB1

UART9      APB2

UART10     APB2


根据串口初始化函数推测,HAL库函数确是没有专门针对UAR9,UART10进行设置
大部分参数This parameter can be UARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or   *         UART peripheral.
但是一些串口的库函数是可以用的,只不过要注意类似波特率设置的BUG,修正这些BUG后,UART9,UART10也是可以按照这些库函数操作的

后来发现STM32CUBE生成的UART9代码工程中对应的HAL库函数就增加了UART9,UART10这两种串口如下
static void UART_SetConfig(UART_HandleTypeDef *huart)
{
  uint32_t tmpreg;
  uint32_t pclk;
  /* Check the parameters */
  assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate));
  assert_param(IS_UART_STOPBITS(huart->Init.StopBits));
  assert_param(IS_UART_PARITY(huart->Init.Parity));
  assert_param(IS_UART_MODE(huart->Init.Mode));
  /*-------------------------- USART CR2 Configuration -----------------------*/
  /* Configure the UART Stop Bits: Set STOP[13:12] bits
     according to huart->Init.StopBits value */
  MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits);
  /*-------------------------- USART CR1 Configuration -----------------------*/
  /* Configure the UART Word Length, Parity and mode:
     Set the M bits according to huart->Init.WordLength value
     Set PCE and PS bits according to huart->Init.Parity value
     Set TE and RE bits according to huart->Init.Mode value
     Set OVER8 bit according to huart->Init.OverSampling value */
  tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling;
  MODIFY_REG(huart->Instance->CR1,
             (uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8),
             tmpreg);
  /*-------------------------- USART CR3 Configuration -----------------------*/
  /* Configure the UART HFC: Set CTSE and RTSE bits according to huart->Init.HwFlowCtl value */
  MODIFY_REG(huart->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE), huart->Init.HwFlowCtl);

#if defined(USART6) && defined(UART9) && defined(UART10)
    if ((huart->Instance == USART1) || (huart->Instance == USART6) || (huart->Instance == UART9) || (huart->Instance == UART10))
    {
      pclk = HAL_RCC_GetPCLK2Freq();

    }
#elif defined(USART6)
    if ((huart->Instance == USART1) || (huart->Instance == USART6))
    {
      pclk = HAL_RCC_GetPCLK2Freq();
    }
#else
    if (huart->Instance == USART1)
    {
      pclk = HAL_RCC_GetPCLK2Freq();
    }
#endif /* USART6 */
    else
    {
      pclk = HAL_RCC_GetPCLK1Freq();
    }
  /*-------------------------- USART BRR Configuration ---------------------*/
  if (huart->Init.OverSampling == UART_OVERSAMPLING_8)
  {
    huart->Instance->BRR = UART_BRR_SAMPLING8(pclk, huart->Init.BaudRate);
  }
  else
  {
    huart->Instance->BRR = UART_BRR_SAMPLING16(pclk, huart->Init.BaudRate);
  }

}


回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2021-9-10 15:33:41 | 显示全部楼层
串口配置都差不多,不清楚的可以网上找案例
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10561
金钱
10561
注册时间
2017-2-18
在线时间
1912 小时
发表于 2021-9-10 19:06:49 | 显示全部楼层
yuanzinpl 发表于 2021-9-10 13:47
找到原因了,HAL库函数中没有考虑UART9和UART10这两种串口的情形,只把USART1和USART6按照所在的APB2时钟设 ...

感谢踩坑
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 23:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表