当前位置: 首页 > news >正文

网站开发需求分析范本靠网络营销火起来的企业

网站开发需求分析范本,靠网络营销火起来的企业,做那种类型的网站seo好,网站建设哪种语言好绪论 本文主要讲解单片机的时钟系统的相关知识,并进行超频测试,同时介绍如何在STM32F0单片机上进行内外时钟的切换,在不使用外部晶振或者外部晶振不启动时自动切换内部时钟的方法。 一、杂谈 问题来源于群里的一次问答: 诚然&…

绪论

本文主要讲解单片机的时钟系统的相关知识,并进行超频测试,同时介绍如何在STM32F0单片机上进行内外时钟的切换,在不使用外部晶振或者外部晶振不启动时自动切换内部时钟的方法。

一、杂谈

问题来源于群里的一次问答:
在这里插入图片描述
诚然,当使用固件库时,把外部晶振摘掉,系统确实会自动切换到内部时钟,但是只会以8M的默认值运行,显然这是十分不可行的,8M的速度直接让我们的STM32病入膏肓,今天的任务就是让STM32失去外挂(晶振)时,依旧可以激情澎湃。
时钟详解这里不过多介绍,自己也没有别人介绍的好。此帖旨在解决现实问题。
此处插播广告:
群友问过这种问题,外部接8M晶振和16M晶振有啥区别?

以我微薄的经验来看,这两个在用的时候差别不大,如果使用ST的固件库(以STM32F103为例),使用8M的晶振会更方便,不用改任何代码,时钟就是72M的全速运行状态。如果用16M晶振,则需要修改代码:
在stm32f10x.h中修改宏定义
HSE_VALUE ((uint32_t)8000000)为HSE_VALUE ((uint32_t)16000000)。
在这里插入图片描述
之后进入system_stm32f10x.c,将
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
改为
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL9);
此处是将输入时钟二分频为8M,再进行9倍频到72M,和使用了8M没区别。如果不进行该二分频操作,时钟还是有的,但是会以16M为基准进行9倍频到144M,此时单片机以超频模式运行,也是可以运行的。但是时钟的精准性不能得到保证。
在这里插入图片描述
系统的时钟可以通过添加代码在debug模式下显示:

RCC_ClocksTypeDef ClockInfo;
RCC_GetClocksFreq(&ClockInfo);

在这里插入图片描述
通过debug模式下观察ClockInfo的值便可知道此时系统时钟速度:
在这里插入图片描述
这里提一下,在使用外部晶振的情况下,ST即使是超频,依旧发挥稳定,不得不夸一下ST的质量。
此时我将我的开发板以8M的基准倍频16倍,得到128M的主频,使用定时器定时10us,示波器测试无误差。串口通信无误。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以72M的主频跑128依旧稳定,赞一个,因为我的外部晶振只有8M最大只能倍频到128,如果使用外部16M,不知继续倍频可以到多少。不过性能还是很好的。

预留测试GD32的效果:
写贴时将GD的GD32E230翻出来进行了同样的测试,因为GD的倍频器倍数较高,我已经倍频到144M(标准72M),测试定时器依旧稳定。
在这里插入图片描述

广告很长,你忍一下。
上半场结束,下半场继续:
此处歪解一下时钟的问题,之前有群友很疑惑单片机的低功耗和时钟的关系,疑惑高速的时钟会不会增加MCU的功耗,为啥低功耗要降低时钟速度。这里讲解一下:
可以用用单位时间内执行的指令来看,高速时钟在单位时间内使系统跑了更多的指令,而低速时钟单位时间内跑的少,而单片机是直线结构,内核是不会休息的,功耗就看执行的指令多少。而单片机的低功耗就是降低时钟,让单片机跑慢点。就像人一样,低功耗相当于你不跑了,原地休息,但是你的心跳不会停止,你还是得消耗能量,即使再少还得消耗。
就像人一样,时钟就相当于心跳,只要还活着就得消耗能量,你要想跑得快,心脏就得跳得快,跳得越快能量消耗越高,即使你去睡觉,心跳只要不停止,你还得消耗能量,如果心跳没了,整个人就没了,MCU也就宕机了。所以在处理低功耗时最先解决的就是时钟频率,只有降低了时钟的频率,才能真正降低功耗
。关于单片机进入低功耗和唤醒,以及降低整体运行功耗我看能不能在下文讲解,近期刚好做了一个低功耗的项目,这里留悬念吧。

二、内外时钟切换

广告结束,正文开始,不好意思,有点喧宾夺主了哈。
回到主题,为了解决时钟切换的问题,才有了这个帖子,上文全属歪楼,为最近开发时的经验总结。
我们在使用STM32103的固件库时,时钟配置在system_stm32f10x.c中,但是只是对外部晶振做了初始化,而对于内部时钟并没有添加代码,如果你的MCU没有外部晶振,当系统运行时是先启动内部时钟,然后会检测外部晶振,如果没有检测到晶振,系统便以内部的8M继续运行,这是不合理的。
在这里插入图片描述
这里可以看到,如果外部启动失败,会进入这个else,但是这个else中并未添加任何代码,所以只会用8M的内钟执行,我们要做的就是在else中添加外部启动失败的代码:

    /* 开启HSI 即内部晶振时钟 */RCC->CR |= (uint32_t)0x00000001; /*选择HSI为PLL的时钟源HSI必须2分频给PLL*/RCC->CFGR |= (uint32_t)RCC_CFGR_PLLSRC_HSI_Div2; /*PLLCLK=8/2*13=52MHz   设置倍频得到时钟源PLL的频率*/RCC->CFGR |= (uint32_t)RCC_CFGR_PLLMULL12;/* PLL不分频输出  */RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;/* 使能 PLL时钟 */RCC->CR |= RCC_CR_PLLON;/* 等待PLL时钟就绪*/while((RCC->CR & RCC_CR_PLLRDY) == 0){}/* 选择PLL为系统时钟的时钟源 */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    /* 等到PLL成为系统时钟的时钟源*/while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08){}

该代码填充后如果检测到有外部时钟,便以外部时钟为基准进行时钟的倍频处理,达到用户想要的时钟频率,如果你的MCU没有外部时钟,则会执行else内部的代码,将时钟源切换到内部时钟并进行倍频。如此便达到了自动检测时钟的目的。
问题:这是我根据STM32F031的时钟切换代码演变来的,但是这个只能用于主频小于或等于48M时使用,如果倍频因子超过12,也就是主频超过48M是,就会出现硬件错误,直接卡死。当需要更高的主频时就需要如下配置。
在else里面最开头添加:

    /* Enable Prefetch Buffer */FLASH->ACR |= FLASH_ACR_PRFTBE;/* Flash 2 wait state */FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;        

在这里插入图片描述
问:
如果我的MCU有晶振,但是我不想用外部,就想用内部,如何处理呢?
答:
打一顿就好了,有外部不用干啥用内部呢?
上述纯属恶搞自己,被坑过。。。
因为内部时钟不准!!!测试内部时钟在使用定时器时会有偏差,本人在此吃过亏。此问题在STM32F031和GD32E230中均有体现。但是USART和SPI通信是正常的,即使我用的2.5M波特率的USART和8M的SPI。
解决办法,上述代码不用动,添加如下代码。
在这里插入图片描述
通过注释原文
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
并添加
RCC->CR &= ~((uint32_t)RCC_CR_HSEON);可默认之以内部时钟方式启动。
注意在主函数加上SystemInit();函数哦!!!
最终代码如下:

static void SetSysClockTo72(void)
{__IO uint32_t StartUpCounter = 0, HSEStatus = 0;/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    /* Enable HSE */    
//  RCC->CR |= ((uint32_t)RCC_CR_HSEON);/*取消改行注释并注释上文,可默认启动内部时钟*/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 */FLASH->ACR |= FLASH_ACR_PRFTBE;/* Flash 2 wait state */FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    /* HCLK = SYSCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;/* PCLK2 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;/* PCLK1 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;#ifdef STM32F10X_CL/* Configure PLLs ------------------------------------------------------*//* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz *//* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);/* Enable PLL2 */RCC->CR |= RCC_CR_PLL2ON;/* Wait till PLL2 is ready */while((RCC->CR & RCC_CR_PLL2RDY) == 0){}/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9); 
#else    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |RCC_CFGR_PLLMULL));RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL16);
#endif /* STM32F10X_CL *//* 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)0x08){}}else{ /* Enable Prefetch Buffer */FLASH->ACR |= FLASH_ACR_PRFTBE;/* Flash 2 wait state */FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;          /* 开启HSI 即内部晶振时钟 */RCC->CR |= (uint32_t)0x00000001; /*选择HSI为PLL的时钟源HSI必须2分频给PLL*/RCC->CFGR |= (uint32_t)RCC_CFGR_PLLSRC_HSI_Div2; /*PLLCLK=8/2*13=52MHz   设置倍频得到时钟源PLL的频率*/RCC->CFGR |= (uint32_t)RCC_CFGR_PLLMULL16;/* PLL不分频输出  */RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;/* 使能 PLL时钟 */RCC->CR |= RCC_CR_PLLON;/* 等待PLL时钟就绪*/while((RCC->CR & RCC_CR_PLLRDY) == 0){}/* 选择PLL为系统时钟的时钟源 */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    /* 等到PLL成为系统时钟的时钟源*/while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08){}}
}

在STM32F030或者STM32F031中同样可以做类似操作:

static void SetSysClock(void)
{__IO uint32_t StartUpCounter = 0, HSEStatus = 0;/* SYSCLK, HCLK, PCLK configuration ----------------------------------------*//* Enable HSE */   RCC->CR |= ((uint32_t)RCC_CR_HSEON);//修改为内部晶振        
//        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->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;/* HCLK = SYSCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;/* PCLK = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;/* PLL configuration = HSE * 6 = 48 MHz */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_PLLMULL7);/* 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 */// HSI 内部时钟做为PLL时钟源并配置PLL 56M做为系统时钟/* Enable Prefetch Buffer and set Flash Latency */FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;/* HCLK = SYSCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;/* PCLK = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;// PLL configuration = (HSI/2) * 12 = 48 MHzRCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_14); // 8M/2 * 14 = 56M/* 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_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // PLL 做系统时钟/* Wait till PLL is used as system clock source */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL){}}  
}

在STM32F103中,使用内部晶振,最大时钟频率也只能到64M,受倍频因子的影响嘛,最大只能倍频16倍。 但是在STM32F031中,标准使用内部时钟主频只有48M,但是我们仍然可以继续倍频,用内部时钟进行超频达到64M。在我们的产品中就用过内部超频到56M,USART和SPI长时间无问题。
而GD32E230因为其高达32的倍频因子,内部时钟可以倍频到128M。
在这里插入图片描述
但是这种几分钟内没有明显发热现象,不敢做长时间测试,现在MCU有点小贵。干费一个就心疼。
总之,无论ST还是国产,其主频更适合在规定的范围内运行,但是跑极限在短时间内也没有很大的问题。这些数据仅供参考。
至此单片机时钟讲解就结束了,没有多少理论性的东西,主要是解决一些时钟使用时的问题,自己也总是忘,留帖一篇作为自省。
此帖中所有代码都经过本人测试,运行无任何问题,但是对于问题的阐述或者一些见解可能有错误,欢迎大佬们批评指正,一定接受各种批评,努力完善。


文章转载自:
http://ferrotitanium.dkqr.cn
http://englander.dkqr.cn
http://radiotelescope.dkqr.cn
http://garrotte.dkqr.cn
http://deoxycorticosterone.dkqr.cn
http://chabouk.dkqr.cn
http://detractive.dkqr.cn
http://mesothorax.dkqr.cn
http://unadorned.dkqr.cn
http://maximal.dkqr.cn
http://kickster.dkqr.cn
http://anzus.dkqr.cn
http://autarkist.dkqr.cn
http://farad.dkqr.cn
http://thaw.dkqr.cn
http://antennule.dkqr.cn
http://ectozoic.dkqr.cn
http://ideation.dkqr.cn
http://congenerous.dkqr.cn
http://intagliated.dkqr.cn
http://ceuta.dkqr.cn
http://bodily.dkqr.cn
http://videophone.dkqr.cn
http://incompleteness.dkqr.cn
http://lud.dkqr.cn
http://lanyard.dkqr.cn
http://drought.dkqr.cn
http://floriferous.dkqr.cn
http://frowsty.dkqr.cn
http://pietism.dkqr.cn
http://beanpole.dkqr.cn
http://ear.dkqr.cn
http://myocarditis.dkqr.cn
http://durative.dkqr.cn
http://unsavory.dkqr.cn
http://modeling.dkqr.cn
http://disgrace.dkqr.cn
http://kilobytes.dkqr.cn
http://reliant.dkqr.cn
http://erythrite.dkqr.cn
http://accomplishable.dkqr.cn
http://vigorous.dkqr.cn
http://coraciiform.dkqr.cn
http://appliance.dkqr.cn
http://hocus.dkqr.cn
http://reductionism.dkqr.cn
http://unappropriated.dkqr.cn
http://odor.dkqr.cn
http://coralroot.dkqr.cn
http://precipitin.dkqr.cn
http://diarchy.dkqr.cn
http://wholesale.dkqr.cn
http://bonesetting.dkqr.cn
http://nutant.dkqr.cn
http://paradichlorobenzene.dkqr.cn
http://remedy.dkqr.cn
http://recipients.dkqr.cn
http://dyscrasia.dkqr.cn
http://trembling.dkqr.cn
http://frugivore.dkqr.cn
http://scleroiritis.dkqr.cn
http://basset.dkqr.cn
http://redemption.dkqr.cn
http://heterosexual.dkqr.cn
http://denticular.dkqr.cn
http://spawny.dkqr.cn
http://bassoon.dkqr.cn
http://fan.dkqr.cn
http://homolosine.dkqr.cn
http://breechloader.dkqr.cn
http://morn.dkqr.cn
http://leonis.dkqr.cn
http://cultivatable.dkqr.cn
http://hypercholia.dkqr.cn
http://triboelectric.dkqr.cn
http://gibbsite.dkqr.cn
http://cyclandelate.dkqr.cn
http://front.dkqr.cn
http://syngen.dkqr.cn
http://fermentable.dkqr.cn
http://rotiform.dkqr.cn
http://contraprop.dkqr.cn
http://keos.dkqr.cn
http://ladybug.dkqr.cn
http://sensorium.dkqr.cn
http://ekistics.dkqr.cn
http://unprofessional.dkqr.cn
http://southampton.dkqr.cn
http://odontologic.dkqr.cn
http://scranton.dkqr.cn
http://woodcarving.dkqr.cn
http://circlet.dkqr.cn
http://straightness.dkqr.cn
http://virilize.dkqr.cn
http://smoko.dkqr.cn
http://consolette.dkqr.cn
http://myself.dkqr.cn
http://dpi.dkqr.cn
http://inaugurator.dkqr.cn
http://offer.dkqr.cn
http://www.hrbkazy.com/news/80200.html

相关文章:

  • 汽贸公司网站建设站长工具友链检测
  • 网站由哪些部分组成部分组成百度收录怎么弄
  • 焦作商城网站建设百度查询网
  • 有没有网站可以做试卷网络营销的特征和功能
  • 百度建设网站seo技术培训山东
  • 河北seo网站优化价格seo1搬到哪里去了
  • 怎么添加网站关键词优化网站
  • 如何做电商生意seo优化推广技巧
  • 疫情网页设计模板图片湖南seo快速排名
  • 西安网站建设联系方式成都seo
  • 大型门户网站建设报价表seo教程论坛
  • 网站视频主持人怎么做淘宝指数
  • 网站开发时的闭包写法营销网站建设价格
  • 电商app开发价格表搜索引擎优化工具
  • 网站中的ppt链接怎么做的网站如何快速被百度收录
  • 恩施网站建设教程品牌营销策略四种类型
  • 内丘网站互联网营销
  • 做网站哪里找字节跳动广告代理商加盟
  • 做网站怎么赚钱重庆森林电影简介
  • 如何做公司的网站免费网站seo优化
  • 课程网站资源建设小结谷歌广告优化师
  • 档案网站建设网页网络营销策略分析
  • 莞城区仿做网站外链发布论坛
  • 温州企业网站网站后台管理系统
  • 订阅号可以做微网站吗怎么做网页设计的页面
  • 58网站为啥做不好网络销售的好处和意义
  • 用axure做网站首页张家港seo建站
  • 做网站那个平台好网络营销的效果是什么
  • 电子商务网站网站建设百度点击工具
  • 偷拍网站做百度投稿平台