[ARM入门] 【盲盒开发板】分享一个FM33LG0X的外置晶振PLL倍频64MHz的工程

[复制链接]
3462|1
 楼主| 邹姆斯特朗 发表于 2021-11-22 00:57 | 显示全部楼层 |阅读模式
官方提供的FM33LG0X例程,时钟源都是基于内部RC振荡器,默认主频为8Mhz,最多可以设置为32Mhz。
  1.         FL_CMU_RCHF_FREQUENCY_8MHZ
  2.         FL_CMU_RCHF_FREQUENCY_16MHZ
  3.         FL_CMU_RCHF_FREQUENCY_24MHZ
  4.         FL_CMU_RCHF_FREQUENCY_32MHZ
用户手册描述FM33LG0X的CPU 和总线最高频率 64MHz。我们可以通过PLL将外部的8M晶振倍频到64MHz.
  1. void Set_Clock_64MHZ()
  2. {

  3.     //PC2:XTHIN   PC3:XTHOUT   
  4.     FL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  5.    
  6.     GPIO_InitStruct.pin = FL_GPIO_PIN_2|FL_GPIO_PIN_3;
  7.     GPIO_InitStruct.mode = FL_GPIO_MODE_ANALOG;
  8.     GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
  9.     GPIO_InitStruct.pull = FL_DISABLE;
  10.     GPIO_InitStruct.remapPin = FL_DISABLE;
  11.     FL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  12.       
  13.     //使能XTHF
  14.     FL_CMU_XTHF_Enable();
  15.     FL_CMU_XTHF_WriteDriverStrength(7);   
  16.     FL_DelayMs(2);
  17.     while (!FL_CMU_XTHF_IsEnabled());

  18.     //FLASH 等待周期为1
  19.     FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_2CYCLE);
  20.    
  21.     FL_CMU_SetSystemClockSource(FL_CMU_SYSTEM_CLK_SOURCE_XTHF);
  22.    
  23.    // // 初始化时钟:启用PLL,以64M主频运行
  24.    
  25.     FL_CMU_PLL_SetClockSource(FL_CMU_PLL_CLK_SOURCE_XTHF);
  26.     FL_CMU_PLL_SetPrescaler(FL_CMU_PLL_PSC_DIV8); //8分频为1M
  27.     FL_CMU_PLL_WriteMultiplier(64 - 1);; //倍频64M
  28.     FL_CMU_PLL_Enable();

  29.     while (!FL_CMU_IsActiveFlag_PLLReady());  //等待建立
  30.    
  31.     FL_CMU_SetSystemClockSource(FL_CMU_SYSTEM_CLK_SOURCE_PLL);
  32.     FL_CMU_SetAHBPrescaler(FL_CMU_AHBCLK_PSC_DIV1);
  33.     FL_CMU_SetAPBPrescaler(FL_CMU_APBCLK_PSC_DIV1);

  34. }

外部高速晶振XTHF上电后默认关闭。上电复位完成后,软件可以根据需要打开XTHF。由于晶振引脚与GPIO复用,软件使能XTHF前,需要将PC2和PC3引脚配置为模拟功能。

8MHz的的外部时钟,需要经过分频等到1MHZ的时钟,然后输入PLL,PPL在进行64倍的倍频,即可得到64MHz的主频。


需要注意的是,在使能XTHF之后,需要延时几毫秒,以让时钟信号稳定。FL_DelayMs(2)不能缺,否者外部时钟开启会失败(耗费了我一下午找bug),然后系统会自动选择RCHF 8MHZ作为时钟源。
main()函数中打印SystemClock的值
  1.     SystemClock = FL_CMU_GetSystemClockFreq();
  2.     printf("SystemClock is: %d Hz\r\n", SystemClock);



基于IAR8.2的工程



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yangjiaxu 发表于 2022-2-16 11:37 | 显示全部楼层
挺不错的,倍频就是有成就感
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

59

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部