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

关于STM32L476时钟设置使得串口波特率加倍问题

[复制链接]
天堂隔壁 提问时间:2017-9-9 14:49 /
悬赏10ST金币未解决
如题,第一次玩STM32L476,从网上下载了1个串口例程,波特率设置9600后,没问题,然后自己配置时钟(使用外部有源晶振),输出时钟都一样,比特率设置9600后,实际波特率竟然是19200.。。 实在找不到问题了,下面是代码。屏蔽的部分是9600波特率正常,没屏蔽的是实际是19200.
  1. void SystemClock_Config12(void)
  2. {
  3.         RCC_OscInitTypeDef RCC_OscInitStruct;
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  5.   RCC_PeriphCLKInitTypeDef PeriphClkInit;

  6.     /**Initializes the CPU, AHB and APB busses clocks
  7.     */
  8.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  9.   RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
  10.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  11.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  12.   RCC_OscInitStruct.PLL.PLLM = 1;
  13.   RCC_OscInitStruct.PLL.PLLN = 10;
  14.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
  15.   RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  16.   RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  17.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  18.   {
  19.     _Error_Handler(__FILE__, __LINE__);
  20.   }

  21.     /**Initializes the CPU, AHB and APB busses clocks
  22.     */

  23.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  24.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  25.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  26.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  27.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  28.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  29.   {
  30.     _Error_Handler(__FILE__, __LINE__);
  31.   }

  32.   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  33.   PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  34.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  35.   {
  36.     _Error_Handler(__FILE__, __LINE__);
  37.   }


  38. //        RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  39. //  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  40. //  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
  41. //        RCC_OscInitStruct.MSICalibrationValue = 0;
  42. //  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  43. //  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
  44. //  RCC_OscInitStruct.PLL.PLLM = 1;
  45. //  RCC_OscInitStruct.PLL.PLLN = 40;
  46. //  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
  47. //  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  48. //  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  49. //  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  50. //  {
  51. //    _Error_Handler(__FILE__, __LINE__);
  52. //  }
  53. //       
  54. //        RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  55. //  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  56. //  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  57. //  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  58. //  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  59. //  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  60. //  {
  61. //    _Error_Handler(__FILE__, __LINE__);
  62. //  }

  63. //  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  64. //  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  65. //  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  66. //  {
  67. //    _Error_Handler(__FILE__, __LINE__);
  68. //  }
  69. }
复制代码


<
收藏 2 评论10 发布时间:2017-9-9 14:49

举报

10个回答
す疯Ⅱ恒す 回答时间:2018-1-19 09:08:30
不应该是先配置好时钟再去配置串口的么?我记得串口配置波特率里有用到当前的系统时钟,如果你配置串口时系统时钟的值时旧的,肯定是按旧的时钟达到9600,但是你后面又改了时间,串口又不知道,天知道波特率会变成怎么样。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

morphlings2014 回答时间:2018-1-19 09:50:14
我在使用的时候好像没这个问题。
你波特率不对。应该是时钟频率不对,原来配置的PCLK2是80M的,你先把时钟频率改成80M试试,
(HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1);可以在PA8脚输出系统时钟波形,你可以看下是否是80M。)

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

大碗刚 回答时间:2018-1-19 09:51:38
下图是STM32L476的时钟树,我觉得你需要先确定外部晶振的频率是多少MHz,之后分别配置系统时钟和AHB、APB时钟。注释的代码里有使用MSI时钟为系统时钟,也有选择HSE时钟为系统时钟,可能是这个产生的原因,可以修改试一试。
1.png

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

wenyangzeng 回答时间:2018-1-19 09:52:15
无标题.png

如果外部晶振频率为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;


红色部分与楼主的配置有所不同

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

yu0405jie 回答时间:2018-1-19 09:52:17
我建议在确认一遍时钟的计算是否正确,同时确认一下 oversampling的设置是16还是8,最好写进程序之后读寄存器,看寄存器的配置

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

队长shiwo 回答时间:2018-1-19 10:02:33
时钟没设置对,可以使用CUBEMX来配置系统时钟和串口的时钟源,我都没遇到过波特率倍增的

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

Inc_brza 回答时间:2018-1-19 10:06:56
百分百代码问题,楼主可以首先通过HAL的GetSystemClock获取当前的各个总线时钟,检查是否正确,
然后再配置一下你的串口模块即可!

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2018-1-19 14:13:03
屏蔽部分时钟使用的是MSI,
你的代码时钟使用的是HSE,
肯定是系统时钟 、或者时钟分频系数没有设置正确。
请仔细检查对应头文件中的定义。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wolfgang2015 回答时间:2018-1-19 14:23:22
按顺时钟初始化顺序来,先初始化PPL及系统时钟,然后再使能AHBx的RCC,
注意看RCC_OSCILLATORTYPE_MSI 还是 RCC_OSCILLATORTYPE_HSE 一定要选择好基础震荡频率

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

12下一页

所属标签

相似问题

官网相关资源

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