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

STM32F030F4P6采用外部时钟改为采用内部RC时钟

[复制链接]
心升明月 发布时间:2018-5-31 10:46
STM32F030F4P6单片机由外部时钟改为内部时钟的步骤

一.看程序运行的时候初始化时钟部分:
11.jpg

二.查看systeminit定义如下:
12.jpg


这就是打开的函数内容这就是使用外部时钟的配置,也就是库函数的默认配置):static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
/* Enable HSE */ //打开外部时钟开关
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit *///判断外部时钟是否起振
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
/* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    /* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

    /* PCLK = HCLK *///外设APB总线时钟等于系统时钟
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

    /* PLL configuration = HSE * 6 = 48 MHz *///外部时钟6倍频 =系统时钟
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);

    /* Enable PLL *///使能锁相环倍频开关
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready *///等待锁相环就绪

    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

/* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }  
}

复制代码
三.接下来我们想将系统时钟改为内部时钟,修改办法依旧是修改  SetSysClock()这个函数中的配置.首先我们要知道单片机内部的时钟到底是怎样一种结构,可以通过芯片文档来查找,另外比较方便的方法就是利用cubemx工具来查看,时钟结构如下:


四.那么我们就按照上图的结构配置来修改SetSysClock()中的配置即可采用内部RC时钟作为时钟源,蓝色字体为修改关键处):
static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
  
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
/* Enable HSI*/ //使能内部时钟
  RCC->CR |= ((uint32_t)RCC_CR_HSION;

  /* Wait till HSI is ready and if Time out is reached exit */ //等待内部时钟起振
  do
  {
   HSIStatus = RCC->CR & RCC_CR_HSIRDY;
    StartUpCounter++;  
  } while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));


  if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
  {
  HSIStatus = (uint32_t)0x01;
  }
  else  
  {
  HSIStatus = (uint32_t)0x00;
  }  


  if (HSIStatus == (uint32_t)0x01)
  {
/* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

/* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
/* PCLK = HCLK *///外设APB总线时钟等于系统时钟
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

   /* PLL configuration = HSI/2 * 12= 48 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12); //RC时钟2分频后 进行12倍频</font>

            
/* Enable PLL *///使能锁相环倍频开关
    RCC->CR |= RCC_CR_PLLON;

/* Wait till PLL is ready *///等待锁相环就绪

    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

/* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

/* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }
  }
  else
  { /* If HSI fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
               
  }  
}

复制代码
好了,以上就是外部时钟源改为内部时钟源的总结.





评分

参与人数 1 ST金币 +1 收起 理由
zeh123 + 1 很给力!

查看全部评分

收藏 4 评论7 发布时间:2018-5-31 10:46

举报

7个回答
心升明月 回答时间:2018-5-31 10:57:31
用添加代码文字 把自己坑傻了. 为了让修改的代码没明显看出来,添加了不同的颜色,编辑时一切正常,结果提交完成后,一看便傻眼了,什么颜色都没有,反而出现了 font<> ..color<>之类的在我的代码中,好尴尬,好事不成反而多事! 希望管理员看到了,看这个问题能处理不,这个问题很不利于发帖分享!

点评

收到~  发表于 2018-5-31 11:05
zero99 回答时间:2018-5-31 11:06:51
心升明月 发表于 2018-5-31 10:57
用添加代码文字 把自己坑傻了. 为了让修改的代码没明显看出来,添加了不同的颜色,编辑时一切正常,结果提交完 ...

加超链确实有问题的,最好的方法是去格式在操作,会反馈给技术部门
心升明月 回答时间:2018-5-31 11:09:04
zero99 发表于 2018-5-31 11:06
加超链确实有问题的,最好的方法是去格式在操作,会反馈给技术部门

好的!
zts329547875 回答时间:2018-9-29 14:38:07
外部时钟源改为内部时钟源的总结. 不错
luris 回答时间:2019-1-14 11:46:25
很详细了,英文也一一标注成中文,谢谢你
bl2019 回答时间:2019-6-26 08:01:58
感谢,正在做这个,谢谢

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

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