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

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

查看全部评分

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

这个表不对,这个表2M都不能用,实际上我跑2M没有问题
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版