小平菜 发表于 2020-7-11 10:24:57

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

经过多次测试,发现用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) 这个函数会报错,?有没有高手解释一下!!

wenyangzeng 发表于 2020-7-11 11:21:45

串口通讯牵涉到误码率的问题,波特率越高,误码率越大。如果设置到256000的6位数已经很高了,楼主设置到7位数的2500000有点过头了,STM32CubeMX知道已经超限了。

mylovemcu 发表于 2020-7-11 13:39:39

检查一下主频设置是不是主频太低了2M以上的波特率主频都要求比较高

小平菜 发表于 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官方这张表给你做参考吧:


radio2radio 发表于 2020-7-11 18:08:40

wenyangzeng 发表于 2020-7-11 17:42
楼主:ST官方这张表给你做参考吧:

这个表不适合H750.

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

likang1202 发表于 2020-7-12 08:50:57

我感觉应该看波特率设置寄存器的位数吧

小平菜 发表于 2020-7-13 11:15:49

wenyangzeng 发表于 2020-7-11 17:42
楼主:ST官方这张表给你做参考吧:

这个表不对,这个表2M都不能用,实际上我跑2M没有问题
页: [1] 2
查看完整版本: STM32H750怎么才能把串口频率设置到2M以上?