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

【经验分享】MCU_STM32H7XX系列通过STM32CUBEMX配置MCO2

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
因为要给STM32H7xx系列的芯片配置MCO2输出,发现按网上的通过STM32CUBEMX配置死活不能启动MCO2,系统时钟配置如下

  1. void SystemClock_Config(void)
  2. {
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  5.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

  6.   /** Supply configuration update enable
  7.   */
  8.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
  9.   /** Configure the main internal regulator output voltage
  10.   */
  11.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

  12.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  13.   /** Macro to configure the PLL clock source
  14.   */
  15.   __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
  16.   /** Initializes the CPU, AHB and APB busses clocks
  17.   */
  18.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  19.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  20.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  21.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  22.   RCC_OscInitStruct.PLL.PLLM = 1;
  23.   RCC_OscInitStruct.PLL.PLLN = 80;
  24.   RCC_OscInitStruct.PLL.PLLP = 2;
  25.   RCC_OscInitStruct.PLL.PLLQ = 40;
  26.   RCC_OscInitStruct.PLL.PLLR = 2;
  27.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
  28.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  29.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
  30.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  31.   {
  32.     Error_Handler();
  33.   }
  34.   /** Initializes the CPU, AHB and APB busses clocks
  35.   */
  36.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  37.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  38.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  39.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  40.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  41.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  42.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  43.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  44.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  45.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  46.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  47.   {
  48.     Error_Handler();
  49.   }
  50.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
  51.                               |RCC_PERIPHCLK_FMC;
  52.   PeriphClkInitStruct.PLL2.PLL2M = 4;
  53.   PeriphClkInitStruct.PLL2.PLL2N = 80;
  54.   PeriphClkInitStruct.PLL2.PLL2P = 20;
  55.   PeriphClkInitStruct.PLL2.PLL2Q = 10;
  56.   PeriphClkInitStruct.PLL2.PLL2R = 2;
  57.   PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
  58.   PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
  59.   PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
  60.   PeriphClkInitStruct.PLL3.PLL3M = 8;
  61.   PeriphClkInitStruct.PLL3.PLL3N = 128;
  62.   PeriphClkInitStruct.PLL3.PLL3P = 2;
  63.   PeriphClkInitStruct.PLL3.PLL3Q = 2;
  64.   PeriphClkInitStruct.PLL3.PLL3R = 8;
  65.   PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
  66.   PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
  67.   PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
  68.   PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK;
  69.   PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2;
  70.   PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3;
  71.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  72.   {
  73.     Error_Handler();
  74.   }
  75.   HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLL1QCLK, RCC_MCODIV_1);
  76.   HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);
  77.         
  78.         //HAL_EnableCompensationCell();
  79. }
复制代码

可以看到HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_PLL2PCLK, RCC_MCODIV_2);是一个只有几个MHz的频率(8M晶振的情况下是4M),相关的MCO引脚配置如下,其中PC9脚就是MCO2,

  1. void MX_GPIO_Init(void)
  2. {

  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};

  4.   /* GPIO Ports Clock Enable */
  5.   __HAL_RCC_GPIOE_CLK_ENABLE();
  6.   __HAL_RCC_GPIOF_CLK_ENABLE();
  7.   __HAL_RCC_GPIOH_CLK_ENABLE();
  8.   __HAL_RCC_GPIOC_CLK_ENABLE();
  9.   __HAL_RCC_GPIOA_CLK_ENABLE();
  10.   __HAL_RCC_GPIOB_CLK_ENABLE();
  11.   __HAL_RCC_GPIOG_CLK_ENABLE();
  12.   __HAL_RCC_GPIOD_CLK_ENABLE();

  13.   /*Configure GPIO pin : PC9 */
  14.   GPIO_InitStruct.Pin = GPIO_PIN_9;
  15.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  16.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  17.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
  18.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
  19.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  20.   /*Configure GPIO pin : PA8 */
  21.   GPIO_InitStruct.Pin = GPIO_PIN_8;
  22.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  23.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  24.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //why LOW;
  25.   GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
  26.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  27. }
复制代码

所以,超出引脚承受范围是不可能的
里面提到一定要运行这一句:RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE); 如果你选择的外设中没有一个需要这个PLL2P,那么很有可能就不会启动这个DIVIDER_P_UPDATE。

赶紧试着改了一下stm32h7xx_hal_rcc_ex.c中的HAL_RCCEx_PeriphCLKConfig函数,问题解决!修改后的代码如下,

  1. HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit)
  2. {
  3.    。。。。。 原来的代码原封不动。。。。。

  4.   // 下面这一行是另外添加的,确保DIVIDER_P_UPDATE会被运行到
  5.   ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);
  6.         
  7.   if (status == HAL_OK)
  8.   {
  9.     return HAL_OK;
  10.   }
  11.   return HAL_ERROR;
  12. }
复制代码



收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

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