STM8教程-第八章 STM8S207时钟编程及其实例_第1页
STM8教程-第八章 STM8S207时钟编程及其实例_第2页
STM8教程-第八章 STM8S207时钟编程及其实例_第3页
STM8教程-第八章 STM8S207时钟编程及其实例_第4页
STM8教程-第八章 STM8S207时钟编程及其实例_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./第八章STM8S207时钟编程及其实例本章介绍STM8S207的时钟编程。STM8S207时钟控制器功能强大而灵活易用,允许程序运行中将主时钟从一个时钟源切换到另一个时钟源,而且同一个时钟源可以任意更改分频系数。8.1STM8时钟控制简介时钟控制器功能强大而且灵活易用。其目的在于使用户在获得最好性能的同时,亦能保证消耗的功率最低。用户可独立地管理各个时钟源,并将它们分配到CPU或各个外设。主时钟和CPU时钟均带有预分频器。具有安全可靠的无故障时钟切换机制,可在程序运行中将主时钟从一个时钟源切换到另一个时钟源。抗电磁干扰时钟配置寄存器为了避免由电磁干扰造成的对应用程序误写操作或系统挂起,大多数关键的时钟配置寄存器都有一个互补寄存器与之相对应。系统将会自动检测这些关键寄存器与其互补寄存器之间是否匹配。如果不匹配,则产生一个EMS复位,从而使应用程序恢复到正常操作。详情请参见时钟寄存器描述。1、主时钟源介绍下面4种时钟源可用做主时钟1、1-24MHz高速外部晶振〔HSE2、最大24MHz高速外部时钟信号3、16MHz高速部RC振荡器〔HSI4、128KHz低速部RC〔LSI所以总的来说可以分为三种时钟源,HSE、HSI、LSI2、时钟树,如下图所示由上图可以发现,作为f_cpu的时钟源可以来源于f_hse、f_hsi经过HSIDIV分频后的时钟、f_lsi这三个时钟源。而选择开关在CKM[7:0]中。由此事实上可以作为f_master的时钟源频率有:外部HSE24MHz部高速HSI16MHz、2分频的8MHz、4分频的4MHz、8分频的2MHz〔复位默认时钟源部低速LSI128KHz上面得到的频率是f_master的频率,然后f_master还可以通过CPUDIV来分频后提供f_cpu的时钟,CPUDIV可以为1、2、4、8、16、32、64、128分频,最终得到是CPU的时钟频率f_cpu。3、时钟切换时钟切换功能为用户提供了一种易用、快速、安全的从一个时钟源切换到另一个时钟源的途径。<1>、系统启动为使系统快速启动,复位后时钟控制器自动使用HSI的8分频<HSI/8>做为主时钟〔2MHz。其原因为HSI的稳定时间短,而8分频可保证系统在较差的VDD条件下安全启动。一旦主时钟源稳定,用户程序可将主时钟切换到另外的时钟源。<2>、主时钟切换的过程用户可选择下面两种方式切换时钟源:自动切换、手动切换自动切换使用户可使用最少的指令完成时钟源的切换。应用软件可继续其它操作而不用考虑切换事件所占的确切时间。具体方法在实例中讲解手动切换与自动切换不同,不能够立即切换,但它允许用户精确地控制切换事件发生的时间。具体方法在实例中讲解8.2时钟控制寄存器及设置第六章的IO口实验之所以能正常运行的原因是在于STM8S207上电复位后有默认的时钟源,所以可以正常工作,但是为了更好使用和理解STM8S207是有必要清楚掌握STM8S207的时钟编程。1、主时钟切换寄存器CLK_SWR由上面的时钟树可知,CLK_SWR对应的就是CKM[7:0],我也很好奇为什么不一致。CLK_SWR有特定的值才有效,是选择三个时钟源之一作为f_master的时钟输入。具体如下所示:0xE1:HSI为主时钟源<复位值>0xD2:LSI为主时钟源<仅当LSI_EN选项位为1时>0xB4:HSE为主时钟源2、主时钟状态寄存器CLK_CMSR对应着CLK_SWR,由硬件置位或清除。用以指示当前所选的主时钟源。如果该寄存器中的值为无效值,则产生MCU复位0xE1:HSI为主时钟源<复位值>0xD2:LSI为主时钟源<仅当LSI_EN选项位为1时>0xB4:HSE为主时钟源3、时钟分频寄存器CLK_CKDIVR这个寄存器对应了时钟树中的HSIDIV以及CPUDIV,正如前面所说的HSIDIV可以把部高速RC时钟源分频后才对f_master提供时钟周期;CPUDIC就是把f_master的时钟周期分频后再对f_cpu提供时钟周期。具体分频倍数为:HSIDIV[1:0]:高速部时钟预分频器,由软件写入,用于指定HSI分频因子。00:fHSI=fHSIRC输出01:fHSI=fHSIRC输出/210:fHSI=fHSIRC输出/411:fHSI=fHSIRC输出/8CPUDIV[2:0]:CPU时钟预分频器,由软件写入,用于指定CPU时钟预分频因子。000:fCPU=fMASTER001:fCPU=fMASTER/2010:fCPU=fMASTER/4011:fCPU=fMASTER/8100:fCPU=fMASTER/16101:fCPU=fMASTER/32110:fCPU=fMASTER/64111:fCPU=fMASTER/1284、切换控制寄存器CLK_SWCR这个寄存器主要是查看时钟源的切换标志位,具体含义如下:SWIF:时钟切换中断标志位由硬件置位或软件写0清除。该位的含义取决于SWEN位的状态。手动切换模式下<SWEN=0>:0:目标时钟源未准备就绪1:目标时钟源准备就绪自动切换模式下<SWEN=0>:0:无时钟切换事件发生1:有时钟切换事件发生SWIEN:时钟切换中断使能由软件置位或清除0:时钟切换中断禁用1:时钟切换中断使能SWEN:切换启动/停止由软件置位或清除。向该位写1将切换主时钟至寄存器CLK_SWR指定的时钟源。0:禁止时钟切换的执行1:使能时钟切换的执行SWBSY:切换忙由硬件置位或清除。可由软件清除以复位时钟切换过程。0:无时钟切换在进行。1:时钟切换正在进行。除上面上面主要涉及到的寄存器之外还有部时钟寄存器CLK_ICKR外部时钟寄存器CLK_ECKR外设时钟门控寄存器1CLK_PCKENR1外设时钟门控寄存器2CLK_PCKENR2时钟安全系统寄存器CLK_CSSR可配置时钟输出寄存器CLK_CCORHIS时钟修正寄存器CLK_HSITRIMRSWIM时钟控制寄存器CLK_SWIMCCR这些寄存器在本章最后小节中才略为说明,时钟编程主要以前面3个寄存器有关。例如CLK_SWR是选择时钟源、CLK_SWCR是时钟切换的控制寄存器,控制切换过程的设置而CLK_CKDIVR是设置HIS的分频系数和f_cpu的分频系数8.3时钟编程基础应用为了从不同角度理解时钟编程,这节分三个基础例程分别实现CPU和部高速时钟分频例程、自动切换时钟源例程以及手动切换时钟源例程。8.3.1CPU分频以及HIS分频例程时钟编程本身并不需要外部设备,为了检验时钟分频的效果,在这里采用了一个LED灯闪耀的效果来检验时钟的快慢,具体实现是相同的延时函数,在不同的时钟频率下跑的效果有很大差异,这样就达到了检查实验的效果。如下图所示:在这里使用了LED1,也就是PD0端口,对应的IO口操作在前一章已经有过详细介绍。本实验操作的寄存器只有一个,就是CLK_CKDIVR,具体如下所示:HSIDIV[1:0]:高速部时钟预分频器,由软件写入,用于指定HSI分频因子。00:fHSI=fHSIRC输出01:fHSI=fHSIRC输出/210:fHSI=fHSIRC输出/411:fHSI=fHSIRC输出/8<默认>CPUDIV[2:0]:CPU时钟预分频器,由软件写入,用于指定CPU时钟预分频因子。000:fCPU=fMASTER001:fCPU=fMASTER/2010:fCPU=fMASTER/4011:fCPU=fMASTER/8100:fCPU=fMASTER/16101:fCPU=fMASTER/32110:fCPU=fMASTER/64111:fCPU=fMASTER/128程序代码如下:/*每一个时钟分频周期为闪耀灯5次HSICPU1:116MHSICPU1:44MHSICPU2:42M*/#include"iostm8s207rb.h"voiddelay_ms<intvalue>;intmain<void>{inti;//配置PD0为输出PD_DDR_DDR0=1;PD_CR1_C10=1;PD_CR2_C20=0;PD_ODR_ODR0=1;while<1>{//HSICPU1:116MCLK_CKDIVR=0x00;for<i=0;i!=10;++i>{PD_ODR_ODR0=~PD_ODR_ODR0;delay_ms<100>;}delay_ms<100>;//HSICPU1:44MCLK_CKDIVR_HSIDIV=0;CLK_CKDIVR_CPUDIV=2;for<i=0;i!=10;++i>{PD_ODR_ODR0=~PD_ODR_ODR0;delay_ms<100>;}delay_ms<100>;//HSICPU2:42MCLK_CKDIVR_HSIDIV=1;CLK_CKDIVR_CPUDIV=2;for<i=0;i!=10;++i>{PD_ODR_ODR0=~PD_ODR_ODR0;delay_ms<100>;}delay_ms<100>;}}/*********************************************简单延时*********************************************/voiddelay_ms<intvalue>{inti,j;if<value<1>value=1;for<i=0;i!=value;++i>for<j=0;j!=5000;++j>;}8.3.2自动切换时钟源因为STM8S单片机上电复位是采用了部时钟源HIS,所以在这里实现的功能是切换外部时钟源。由于STM8S207开发板使用的外部晶振是24M,在主频大于16M以上时,需要更改选项字,这里降低实验的难易程度,决定在这里采用外部时钟然后通过CPUDIV2分频得到的f_cpu主频为12M自动切换时钟源的对应步骤:1、设置切换控制寄存器<CLK_SWCR>中的位SWEN,使能切换机制。2、向主时钟切换寄存器<CLK_SWR>写入一个8位的值,用以选择目标时钟源。寄存器CLK_SWCR中的SWBSY被硬件置位,目标源振荡器启动。原时钟源依然被用于驱动核和外设。一旦目标时钟源稳定,寄存器CLK_SWR中的值将被复制到主时钟状态寄存器<CLK_CMSR>中去。此时,SWBSY位被清除,新时钟源替代旧时钟源。寄存器CLK_SWCR中的标志位SWIF被置位,如果SWIEN为1,则会产生一个中断。硬件采用8.3.1的电路图,也是通过LED实现检测效果详细代码如下:#include"iostm8s207rb.h"voiddelay_ms<intvalue>;intmain<void>{inti;//配置PD0为输出模式PD_DDR_DDR0=1;PD_CR1_C10=1;//推挽输出PD_CR2_C20=0;PD_ODR_ODR0=1;//LED1灭while<1>{//自动切换方式CLK_SWCR_SWIEN=0;//禁止时钟切换中断CLK_SWCR_SWEN=1;//使能切换机制CLK_SWR=0xB4;//0XE1:HSI为主时钟源〔复位值,部16MHz//0XD2:LSI为主时钟源〔仅当LSI_EN选项为1时//0XB4:HSE为主时钟源〔外部时钟CLK_CKDIVR=1;//CPUDIV2分频//切换后的时钟为12Mdelay_ms<100>;for<i=0;i!=10;++i>{PD_ODR_ODR0=~PD_ODR_ODR0;delay_ms<100>;}//自动切换方式CLK_SWCR_SWIEN=0;//禁止时钟切换中断CLK_SWCR_SWEN=1;//使能切换机制CLK_SWR=0xE1;//0XE1:HSI为主时钟源〔复位值,部16MHz//0XD2:LSI为主时钟源〔仅当LSI_EN选项为1时//0XB4:HSE为主时钟源〔外部时钟//切换后的时钟时16M/2=8Mdelay_ms<100>;for<i=0;i!=10;++i>{PD_ODR_ODR0=~PD_ODR_ODR0;delay_ms<100>;}}}/*********************************************简单延时程序*********************************************/voiddelay_ms<intvalue>{inti,j;if<value<1>value=1;for<i=0;i!=value;++i>for<j=0;j!=5000;++j>;}8.3.3手动切换时钟源手动切换与自动切换不同,不能够立即切换,但它允许用户精确地控制切换事件发生的时间。具体操作步骤:1、向主时钟切换寄存器<CLK_SWR>写入一个8位的值,用以选择目标时钟源。寄存器CLK_SWCR中的SWBSY被硬件置位,目标源振荡器启动。原时钟源依然被用于驱动核和外设。2、用户软件需等待至目标时钟源稳定。寄存器CLK_SWCR中的标志位SWIF用以指示目标时钟源是否已稳定,如果SWIEN为1,则会产生一个中断。3、最后,由用户软件在所选的时间点,设置寄存器CLK_SWCR中的位SWEN,执行切换。在前两个例程的基础上,我们可以进行时钟编程的第三个例程了,具体的步骤如上所示,下面进行我们的软件编写。/*************************************************************手动切换顺序1、向CLK_SWR写入一个数据,选择目标时钟源2、等待CLK_SWCR_SWIF=1,时钟稳定3、设置CLK_SWCR_SWEN=1,开启时钟*************************************************************/#include"iostm8s207rb.h"voiddelay_ms<intvalue>;intmain<void>{inti;//配置LED1PD_DDR_DDR0=1;PD_CR1_C10=1;//推挽输出PD_CR2_C20=0;PD_ODR_ODR0=1;//LED1灭CLK_SWCR_SWIEN=0;//禁止中断CLK_CKDIVR=1;//CPUDIV设置为2分频while<1>{//手动切换方式CLK_SWR=0xB4;//0XE1:HSI为主时钟源〔复位值,部16MHz//0XD2:LSI为主时钟源〔仅当LSI_EN选项为1时//0XB4:HSE为主时钟源〔外部时钟while<CLK_SWCR_SWIF==0>;//等待时钟稳定,输出时钟为12MCLK_SWCR_SWEN=1;//切换时钟for<i=0;i!=10;++i>{PD_ODR_ODR0=~PD_ODR_ODR0;delay_ms<100>;}delay_ms<100>;//手动切换方式CLK_SWR=0xE1;//0XE1:HSI为主时钟源〔复位值,部16MHz//0XD2:LSI为主时钟源〔仅当LSI_EN选项为1时//0XB4:HSE为主时钟源〔外部时钟while<CLK_SWCR_SWIF==0>;//等待时钟稳定,输出时钟为8MCLK_SWCR_SWEN=1;//切换时钟for<i=0;i!=10;++i>{PD_ODR_ODR0=~PD_ODR_ODR0;delay_ms<100>;}delay_ms<100>;}}/*********************************************简单延时程序*********************************************/voiddelay_ms<intvalue>{inti,j;if<value<1>value=1;for<i=0;i!=value;++i>for<j=0;j!=5000;++j>;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论