
经过多次测试,发现用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) 这个函数会报错,?有没有高手解释一下!! |
MotorControl Workbench_6.3.2配置单片机时找不到STM32H743VIT6E
STM32H743IIT6同时配置ADC3通道中的温度及内部参考电压,扫描单次转换,怎样读出这二个数据?
TouchGFX Designer下载工程到STM32H7S7-DK报错
Demo 例程
关于STM32H743VIT6 在用QSPI的接口,想换个CS的管脚,但芯片内置是绑死的,这个要怎么处理,用个其他的IO口做片选
定时器使用DMA突发传输功能时,传入指针从常量数组改为变量数组后,传输功能异常。测试官方用例一样,是何原因?
STM32H745XIH6不能进行双核调试,CM4不能进行在线调试
正点原子阿波罗H743使用DMA2D后普通刷出现问题
STM32CubeMX在配置DCMI的腳位時,在Mode的選項中, 只有8bits, 10bits與12bits, 為何沒有14bits?
STM32H7双核调试问题:CM7能成功调试但CM4始终报"Failed to read ROM table via AP 3"错误
评分
查看全部评分
评分
查看全部评分
这个频率不算高,官方给的是4.5M,理论上官方不会乱说的
主频设置没有错,如果错了的话,定时器,PWM,的设置 和低波特率通讯都会不正常,你们有没有试过把频率改高一点
那在看看其他问题吧 我最高试过2M的波特率 没有问题 用的是L4的芯片 H7的应该更没有问题
多说一句 现在的问题不就是波特率不正常吗 为什么还这么确定不是主频的问题 波特率就是和主频匹配的 同样是9600的波特率 主频是80M和140M都可以正常工作 串口初始化的时候就是根据主频设置寄存器得到想要的波特率 从报错内容来看 就是串口的主频太低 不支持这么高的波特率 可以实际仿真看一下 串口的主频和你配置的主频是否一样
楼主:ST官方这张表给你做参考吧:
评分
查看全部评分
这个表不适合H750.
我用F103的时候,PCLK都要有36MHz,甚至72MHz.
评分
查看全部评分
这个表不对,这个表2M都不能用,实际上我跑2M没有问题
2M是没有问题,刚好是阀值,大于2M就不行了,串口的主频根据CUBLE 设置 的频率,是120M。跟频率设置是有关系,可是我改了频率的话数据就不对了
那就仿真看一下出错的地方那个值计算的是多少 应该就是时钟或者那个最小值被更改了
不同型号的单片机不一样的,不要误导人了