你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H750怎么才能把串口频率设置到2M以上?

[复制链接]
小平菜 提问时间:2020-7-11 10:24 /
1ST金币
经过多次测试,发现用STM32CubeMX生成的串口通信程序,串口波特率设置不能超过2M,如果大于2M在 HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) 这个函数会报错!!

我的波特率设置是这样的
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 2500000;//115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_8;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;//UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;


这个是在波特率配置后  usartdiv 不满足条件进入  ret = HAL_ERROR;

    /* USARTDIV must be greater than or equal to 0d16 */
    if ((usartdiv >= UART_BRR_MIN) && (usartdiv <= UART_BRR_MAX))
    {
      brrtemp = (uint16_t)(usartdiv & 0xFFF0U);
      brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U);
      huart->Instance->BRR = brrtemp;
    }
    else
    {
      ret = HAL_ERROR;
    }



下面是我的时钟配置

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

  /** Supply configuration update enable
  */
  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
  /** Configure the main internal regulator output voltage
  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  /** Initializes the CPU, AHB and APB busses clocks
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 2;
  RCC_OscInitStruct.PLL.PLLN = 240;
  RCC_OscInitStruct.PLL.PLLP = 2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  RCC_OscInitStruct.PLL.PLLFRACN = 0;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART3|RCC_PERIPHCLK_USART2
                              |RCC_PERIPHCLK_UART4|RCC_PERIPHCLK_UART7
                              |RCC_PERIPHCLK_FDCAN|RCC_PERIPHCLK_USART1
                              |RCC_PERIPHCLK_UART8|RCC_PERIPHCLK_UART5
                              |RCC_PERIPHCLK_SPI4|RCC_PERIPHCLK_ADC
                              |RCC_PERIPHCLK_I2C4|RCC_PERIPHCLK_LPTIM1
                              |RCC_PERIPHCLK_CKPER;
  PeriphClkInitStruct.CkperClockSelection = RCC_CLKPSOURCE_HSI;
  PeriphClkInitStruct.Spi45ClockSelection = RCC_SPI45CLKSOURCE_D2PCLK1;
  PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_HSE;
  PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
  PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
  PeriphClkInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_D2PCLK1;
  PeriphClkInitStruct.I2c4ClockSelection = RCC_I2C4CLKSOURCE_D3PCLK1;
  PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_CLKP;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
}


串口的时钟 有120M ,理论上配置大于2M波特率应该没有问题,为什么实际上我配置后,在HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) 这个函数会报错,?有没有高手解释一下!!

收藏 评论11 发布时间:2020-7-11 10:24

举报

11个回答
wenyangzeng 回答时间:2020-7-11 11:21:45
串口通讯牵涉到误码率的问题,波特率越高,误码率越大。如果设置到256000的6位数已经很高了,楼主设置到7位数的2500000有点过头了,STM32CubeMX知道已经超限了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

mylovemcu 回答时间:2020-7-11 13:39:39
检查一下主频设置  是不是主频太低了  2M以上的波特率主频都要求比较高  

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

小平菜 回答时间:2020-7-11 14:05:19
wenyangzeng 发表于 2020-7-11 11:21
串口通讯牵涉到误码率的问题,波特率越高,误码率越大。如果设置到256000的6位数已经很高了,楼主设置到7位 ...

这个频率不算高,官方给的是4.5M,理论上官方不会乱说的
小平菜 回答时间:2020-7-11 14:07:08
mylovemcu 发表于 2020-7-11 13:39
检查一下主频设置  是不是主频太低了  2M以上的波特率主频都要求比较高

主频设置没有错,如果错了的话,定时器,PWM,的设置 和低波特率通讯都会不正常,你们有没有试过把频率改高一点
mylovemcu 回答时间:2020-7-11 16:22:16
小平菜 发表于 2020-7-11 14:07
主频设置没有错,如果错了的话,定时器,PWM,的设置 和低波特率通讯都会不正常,你们有没有试过把频率改 ...

那在看看其他问题吧  我最高试过2M的波特率  没有问题  用的是L4的芯片  H7的应该更没有问题  
多说一句  现在的问题不就是波特率不正常吗 为什么还这么确定不是主频的问题   波特率就是和主频匹配的  同样是9600的波特率  主频是80M和140M都可以正常工作  串口初始化的时候就是根据主频设置寄存器得到想要的波特率  从报错内容来看  就是串口的主频太低  不支持这么高的波特率  可以实际仿真看一下  串口的主频和你配置的主频是否一样
wenyangzeng 回答时间:2020-7-11 17:42:05
小平菜 发表于 2020-7-11 14:05
这个频率不算高,官方给的是4.5M,理论上官方不会乱说的

楼主:ST官方这张表给你做参考吧:

无标题.png

评分

参与人数 1蝴蝶豆 +4 收起 理由
STMCU + 4

查看全部评分

radio2radio 回答时间:2020-7-11 18:08:40
wenyangzeng 发表于 2020-7-11 17:42
楼主:ST官方这张表给你做参考吧:

这个表不适合H750.

我用F103的时候,PCLK都要有36MHz,甚至72MHz.

评分

参与人数 1蝴蝶豆 +4 收起 理由
STMCU + 4

查看全部评分

李康1202 回答时间:2020-7-12 08:50:57
我感觉应该看波特率设置寄存器的位数吧
小平菜 回答时间:2020-7-13 11:15:49
wenyangzeng 发表于 2020-7-11 17:42
楼主:ST官方这张表给你做参考吧:

这个表不对,这个表2M都不能用,实际上我跑2M没有问题
小平菜 回答时间:2020-7-13 11:17:54
mylovemcu 发表于 2020-7-11 16:22
那在看看其他问题吧  我最高试过2M的波特率  没有问题  用的是L4的芯片  H7的应该更没有问题  
多说一句  ...

2M是没有问题,刚好是阀值,大于2M就不行了,串口的主频根据CUBLE 设置 的频率,是120M。跟频率设置是有关系,可是我改了频率的话数据就不对了
mylovemcu 回答时间:2020-7-14 19:58:36
小平菜 发表于 2020-7-13 11:17
2M是没有问题,刚好是阀值,大于2M就不行了,串口的主频根据CUBLE 设置 的频率,是120M。跟频率设置是有 ...

那就仿真看一下出错的地方那个值计算的是多少  应该就是时钟或者那个最小值被更改了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版