如题,第一次玩STM32L476,从网上下载了1个串口例程,波特率设置9600后,没问题,然后自己配置时钟(使用外部有源晶振),输出时钟都一样,比特率设置9600后,实际波特率竟然是19200.。。 实在找不到问题了,下面是代码。屏蔽的部分是9600波特率正常,没屏蔽的是实际是19200.
- void SystemClock_Config12(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct;
- RCC_ClkInitTypeDef RCC_ClkInitStruct;
- RCC_PeriphCLKInitTypeDef PeriphClkInit;
- /**Initializes the CPU, AHB and APB busses clocks
- */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
- RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
- RCC_OscInitStruct.PLL.PLLM = 1;
- RCC_OscInitStruct.PLL.PLLN = 10;
- RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
- RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
- RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- /**Initializes the CPU, AHB and APB busses clocks
- */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
- PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- // RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
- // RCC_OscInitStruct.MSIState = RCC_MSI_ON;
- // RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
- // RCC_OscInitStruct.MSICalibrationValue = 0;
- // RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- // RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
- // RCC_OscInitStruct.PLL.PLLM = 1;
- // RCC_OscInitStruct.PLL.PLLN = 40;
- // RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
- // RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
- // RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
- // if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- // {
- // _Error_Handler(__FILE__, __LINE__);
- // }
- //
- // RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
- // RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- // RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- // RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
- // RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
- // if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
- // {
- // _Error_Handler(__FILE__, __LINE__);
- // }
- // PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
- // PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
- // if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
- // {
- // _Error_Handler(__FILE__, __LINE__);
- // }
- }
复制代码
|
评分
查看全部评分
你波特率不对。应该是时钟频率不对,原来配置的PCLK2是80M的,你先把时钟频率改成80M试试,
(HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1);可以在PA8脚输出系统时钟波形,你可以看下是否是80M。)
评分
查看全部评分
评分
查看全部评分
如果外部晶振频率为8MHZ时,系统时钟的配置如下:
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 20;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
红色部分与楼主的配置有所不同
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
然后再配置一下你的串口模块即可!
评分
查看全部评分
你的代码时钟使用的是HSE,
肯定是系统时钟 、或者时钟分频系数没有设置正确。
请仔细检查对应头文件中的定义。
评分
查看全部评分
注意看RCC_OSCILLATORTYPE_MSI 还是 RCC_OSCILLATORTYPE_HSE 一定要选择好基础震荡频率
评分
查看全部评分
各种外设驱动样例:
2、其次,楼主只贴了RCC代码,无法明确问题原因,只能帮楼主分析下,如果使用完整的HAL驱动的话,串口初始化,会执行底层的HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart)函数,里面会获取UART时钟源,并根据时钟源去查找系统当前时钟,进而进行波特率等更时钟相关的寄存器设置,而程序是如何知道系统当前时钟的呢?答案是stm32l4xx_hal_conf.h中定义的,并不是神奇的软件能够自动识别硬件得到的,只是根据RCC寄存器值获取分频、倍频等参数状态+基础时钟(HSE\HSI\LSE\LSI等)计算出来的,关键的就在这些定义上,如:
评分
查看全部评分