【问题标题】:Generating system clock configuration for STM32F103C8 with CubeMX使用 CubeMX 为 STM32F103C8 生成系统时钟配置
【发布时间】:2018-03-25 21:46:11
【问题描述】:

我正在尝试生成 system_stm32f1xx.c,它将设置我的时钟,如图所示。

问题是,当我使用 CubeMX 生成代码时,我没有得到这个配置。相反,我得到了(我猜的)启用内部 RC 时钟的默认配置。

在我发现我的时钟配置有问题之前,我在配置定时器和 USART 时遇到了很多问题。

system_init() 函数的内容。

void SystemInit (void)
{
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
  /* Set HSION bit */
  RCC->CR |= 0x00000001U;

  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#if !defined(STM32F105xC) && !defined(STM32F107xC)
  RCC->CFGR &= 0xF8FF0000U;
#else
  RCC->CFGR &= 0xF0FF0000U;
#endif /* STM32F105xC */   

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= 0xFEF6FFFFU;

  /* Reset HSEBYP bit */
  RCC->CR &= 0xFFFBFFFFU;

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
  RCC->CFGR &= 0xFF80FFFFU;

#if defined(STM32F105xC) || defined(STM32F107xC)
  /* Reset PLL2ON and PLL3ON bits */
  RCC->CR &= 0xEBFFFFFFU;

  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x00FF0000U;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000U;
#elif defined(STM32F100xB) || defined(STM32F100xE)
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000U;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000U;      
#else
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000U;
#endif /* STM32F105xC */

#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
  #ifdef DATA_IN_ExtSRAM
    SystemInit_ExtMemCtl(); 
  #endif /* DATA_IN_ExtSRAM */
#endif 

#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif 
}

【问题讨论】:

    标签: arm microcontroller stm32 system-clock


    【解决方案1】:

    时钟配置函数在CubeMx生成的main.c文件中,名为SystemClock_ConfigSystemInit 不设置时钟。我不知道为什么我之前的答案在回答问题时被删除了。

    【讨论】:

    • 我看到 system_init() 没有对我的 RCC 寄存器做任何事情,但我认为 CubeMx 有问题。我试图在没有任何 IDE 的情况下使用我的自定义 Makefile,因此我从未打开过 CubeMx 生成的 main.c。我将尝试找到如何在寄存器中配置时钟(我不喜欢使用 IDE-s 提供的 API),如果有人能指出我可以从哪里开始我的研究,我将不胜感激。
    • 这很容易。我个人使用 CubeMx 只是因为使用此工具分配引脚和查看冲突要容易得多。我还使用时钟配置 - 只需从屏幕上获取乘法器和除法器。 F103是一个非常简单的uC。 F7 的时钟树要复杂得多,这个时钟工具帮助很大。
    • @ACVoltage 我看不到 21 世纪在开发阶段使用 DIY makefile 的理由。我在发布项目时写了一个。 IDE-s 是完美的工具,您拥有完全相同的控制权,但它更容易。
    • PS 我是个注册程序员
    • 我知道 IDE-s 是很棒的工具,但我是 Linux 用户,也是 VIM 的忠实粉丝,将 tmux 和 VIM 结合起来感觉更舒服,我觉得这样工作更有效率。然后,使用 makefile 对我来说很自然,在我的情况下它们是通用的。就像,我有这个用于 STM MCU 的 Makefile(我在 STM32F103 和 STM32F407 上使用它们,我相信我可以在任何其他 STM uC 上使用它们),同样的故事也适用于 Atmel uC。
    【解决方案2】:

    时钟配置函数在 tge main.c 文件中。除非您知道自己在做什么,否则请勿触摸系统文件。

    SystemInit 做了其他事情,你应该保持原样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2020-11-12
      相关资源
      最近更新 更多