
经过多次测试,发现用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) 这个函数会报错,?有没有高手解释一下!! |
STM32H743vit6无法连接
FW_H7 V1.12.1-HAL库DMA双缓冲配置
X-CUBE-AZRTOS-H7
请教下关于 stm32h7x5,7x7 系列双核 dsi ltdc 显示驱动的时钟频率配置 ?
STM32H750VBT6 + W5500 + 激光雷达点云
STM32H750XBH6的外置SDRAM相关问题
STM32H755双核编程如何入门
请教SPI用LL读取的问题
STM32H7使用HAL库如何控制外置USB HS PHY进入低功耗
请问如何在下载程序时保护flash中的用户数据不被覆盖?
评分
查看全部评分
评分
查看全部评分
这个频率不算高,官方给的是4.5M,理论上官方不会乱说的
主频设置没有错,如果错了的话,定时器,PWM,的设置 和低波特率通讯都会不正常,你们有没有试过把频率改高一点
那在看看其他问题吧 我最高试过2M的波特率 没有问题 用的是L4的芯片 H7的应该更没有问题
多说一句 现在的问题不就是波特率不正常吗 为什么还这么确定不是主频的问题 波特率就是和主频匹配的 同样是9600的波特率 主频是80M和140M都可以正常工作 串口初始化的时候就是根据主频设置寄存器得到想要的波特率 从报错内容来看 就是串口的主频太低 不支持这么高的波特率 可以实际仿真看一下 串口的主频和你配置的主频是否一样
楼主:ST官方这张表给你做参考吧:
评分
查看全部评分
这个表不适合H750.
我用F103的时候,PCLK都要有36MHz,甚至72MHz.
评分
查看全部评分
这个表不对,这个表2M都不能用,实际上我跑2M没有问题
2M是没有问题,刚好是阀值,大于2M就不行了,串口的主频根据CUBLE 设置 的频率,是120M。跟频率设置是有关系,可是我改了频率的话数据就不对了
那就仿真看一下出错的地方那个值计算的是多少 应该就是时钟或者那个最小值被更改了
不同型号的单片机不一样的,不要误导人了