历史上的今天
返回首页

历史上的今天

今天是:2024年10月09日(星期三)

正在发生

2019年10月09日 | STM32F030F4P6单片机由外部时钟改为内部时钟的步骤

2019-10-09 来源:eefocus

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

二.查看systeminit定义如下:
 


这就是打开的函数内容这就是使用外部时钟的配置,也就是库函数的默认配置):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 */
  }  
}

  1.  


三.接下来我们想将系统时钟改为内部时钟,修改办法依旧是修改  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倍频
            
/* 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 */
                
  }  
}


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


推荐阅读

史海拾趣

Gustav Klauke GmbH公司的发展小趣事

Gustav Klauke GmbH在电子行业中的五个发展故事

故事一:创立与电气时代的崛起

1879年,Gustav Klauke GmbH在德国雷姆沙伊德成立,正值第二次工业革命带来的“电气时代”大爆发。创始人Gustav Klauke凭借其对精工品质的执着追求,将公司的业务聚焦于电气连接技术和电缆作业工具的研发。随着全球电气工业的迅速发展,Klauke迅速成为该领域的佼佼者,为供电系统的各个环节提供可靠且实用的解决方案,满足了社会对电气产品日益增长的多元化需求。

故事二:产品创新与多元化发展

历经百年开拓,Klauke的产品线不断丰富和完善。从最初的钟表维修钳子,到电缆接线端子的生产,再到电池驱动的液压工具的研发,Klauke始终走在行业前沿。特别是1994年推出的首款电池驱动液压工具,标志着公司在电气连接技术上的重大突破。至今,Klauke已拥有多达280种工具,2000多个型号,超过10000个优质部件,广泛应用于电力、铁路和工业等多个领域。

故事三:品质与认证的国际认可

Klauke深知电气连接作业对安全可靠性的极高要求,因此始终将产品质量放在首位。公司不仅拥有IEC(国际电工委员会)、UL(美国保险商试验所)、DNV(挪威船级社)和GL(德国劳氏船级社)等特殊行业的权威资质认证,还通过严格的产品测试报告,确保每一款产品都能达到国际最高标准。这种对品质的坚持,让Klauke在全球客户中赢得了极高的信誉和口碑。

故事四:全球化布局与业务拓展

随着全球市场的不断扩大,Klauke积极实施全球化战略。从德国本土出发,公司在全球范围内设立了多个分公司和销售办事处,如印度、奥地利、西班牙等。同时,公司还通过并购和合作等方式,不断拓展业务领域和市场份额。例如,2018年Gustav Klauke GmbH被艾默生收购,现隶属于“专业工具”部门,这一举措进一步提升了公司在全球电气工具市场的竞争力。

故事五:未来展望与技术创新

面对未来,Klauke继续秉承德国精工品质的优良传统,致力于技术创新和服务优化。公司正密切关注物联网和工业4.0等下一代趋势,并制定相应的战略计划。例如,新型电池供电液压工具配备了蓝牙接口,实现了移动数据读取和工具配置的便捷性。此外,Klauke还计划推出更多高适应性、精准性的电气连接解决方案,以更好地满足全球日益多元的施工作业需求。展望未来,Klauke将继续向下一个百年目标迈进,为电子行业的发展贡献更多力量。

Hilscher Gesellschaft für Systemautomation mbH公司的发展小趣事

随着在高压电源领域的深入发展,HVPSI逐渐参与到行业标准的制定工作中。公司凭借其在技术上的深厚积累和市场经验,为行业标准的制定提供了宝贵的建议和数据支持。这些标准的出台不仅规范了市场秩序,也进一步巩固了HVPSI在行业内的领先地位。

华润微(CRMICRO)公司的发展小趣事

2001年,华润微成立矽科公司,开始涉足芯片设计业务。这一举措使公司能够为客户提供更加完整的解决方案,并进一步提升其市场竞争力。同时,华润微也意识到封装测试在半导体产业链中的重要性,于是在2003年成立安盛公司,开始进入封装测试领域。通过建立6英寸产线,华润微进一步巩固了其在半导体产业链中的地位。

意普(ESPE)公司的发展小趣事

作为一家有社会责任感的企业,意普(ESPE)公司始终关注环保和可持续发展。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还积极参与社会公益活动,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,也为企业的长期发展奠定了良好的社会基础。

ENERGIZER公司的发展小趣事

ENERGIZER公司,作为全球领先的电池制造商,自1896年以来就以其技术革新引领着电池能源行业的发展。1896年,ENERGIZER发明了全球第一粒电池,这一创新性的产品为电子行业的发展奠定了基石。随着科技的不断进步,ENERGIZER的电池技术也在不断革新,以满足日益增长的电子设备需求。如今,ENERGIZER的电池已经广泛应用于各种电子设备中,从遥控器、手电筒到高端电子设备,其优良的品质和耐用的性能受到了全球消费者的广泛认可。

Delta Electronics公司的发展小趣事

Delta Electronics在电源管理技术方面一直处于行业领先地位。公司不断投入研发资源,推动电源技术的创新和进步。其中,Delta开发的高效率开关式电源供应器,以其高效、稳定和可靠的性能,赢得了全球客户的广泛认可。此外,公司还积极推广绿色能源和节能技术,为客户提供环保、节能的电源解决方案。

问答坊 | AI 解惑

有谁有鉴相器的资料?有卖的不?

正弦波信号射频频率范围4-30MHZ,输入信号VPP…

查看全部问答>

[资料] 背光及照明用LED驱动IC技术

[资料] 背光及照明用LED驱动IC技术…

查看全部问答>

eboot 启动问题。

我用的是nboot+eboot启动,下面是输信息。请高手指点一下。 \\par Mini(4k) NandBoot V2.0. [2007-09-28] \\par \\par \\par NAND Boot Start \\par NAND Boot End \\par Boot time=nTCNT*82uS. nTCNT=0x052f. \\par I/O Strength Max \ ...…

查看全部问答>

高手帮忙,在CE上的Bluetooth问题

在CE上Bluetooth设置PIN问题 我用的SDK是STANDARDSDK_500,可是这SDK里没有Btdrt.lib,因此找了个Btdrt.lib 但是在使用BthGetPINRequest()、BthSetPIN()函数还是不能用 可能是手动加入的Btdrt.lib关连到其它的LIB,这要如何解决? 或者谁做的,你 ...…

查看全部问答>

wince6.0 是否支持SHLoadImageResource?

请各位帮帮忙看看! 我在windows moible 5.0 上使用SHLoadImageResource是可以的 而在wince6.0上 却找不到SHLoadImageResource 是不是wince6.0 不支持 SHLoadImageResource? …

查看全部问答>

转让一些板子(已结束)

1.    ok6410 买来2.3个月,具体我也不知道了。装了android系统后当时间看看。没真正开发过。720元。 2.    lm3s8962 申请来的。芯片太贵,放弃学习。248元。加钱换cc2530板子最好,我有无限龙3700元那个套件的光盘 ...…

查看全部问答>

关于自加,自减,和标准输出

#include <stdio.h> void main() {   int x=3,y;     y=––x+––x+x++;     printf(\"x=%d   y=%d\\n\",x,y);  } x=2,y=3     不懂 ??????? &n ...…

查看全部问答>

有关IAP使用HEX或BIN文件格式的探讨

BIN优点,下载时二进制传输效率高,一个起始地址和长度(均可事先知道)搞定.因起始地址和长度在 下载一开始就可以知道,所以只需要擦除实际代码大小的FLASH,避免大FLASH空间小代码时擦除FLASH的时间和FLASH损耗. 缺点:当代码分段在不同地址时,如 ...…

查看全部问答>

STM8S105PA1脚不能设置为上拉输入

STM8S105  PA1脚不能设置为上拉输入,是什么原因?? PA2脚都可以设置为上拉输入;…

查看全部问答>

智能家居的技术

用zigbee技术做智能家居已经快六年了, 而且也用了zigbee技术作了些抄表系统。 最近突然有个想法,就是利用PLC(power line communication 电线载波通信)来做智能家居, 这几天也挺认真的研究了下PLC技术,两者其实各有千秋, 各位有什么好的建议 ...…

查看全部问答>