版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章 STM8S207时钟编程及其实例本章介绍 STM8S207 的时钟编程。STM8S207 时钟控制器功能强大而灵活易用,允许程序运行中将主时钟从一个时钟源切换到另一个时钟源,而且同一个时钟源可以任意更改分频系数。 8.1 STM8 时钟控制简介 时钟控制器功能强大而且灵活易用。其目的在于使用户在获得最好性能的同时,亦能保证消耗的功率最低。 用户可独立地管理各个时钟源,并将它们分配到 CPU 或各个外设。主时钟和CPU 时钟均带有预分频器。 具有安全可靠的无故障时钟切换机制,可在程序运行中将主时钟从一个时钟源切换到另一个时钟源。 抗电磁干扰时钟配置寄存器 为了避免由电磁干扰造成的对应用程
2、序误写操作或系统挂起,大多数关键的时钟配置寄存器都有一个互补寄存器与之相对应。系统将会自动检测这些关键寄存器与其互补寄存器之间是否匹配。如果不匹配,则产生一个 EMS 复位,从而使应用程序恢复到正常操作。详情请参见时钟寄存器描述。 1、主时钟源介绍 下面 4种时钟源可用做主时钟 1、1-24MHz 高速外部晶振(HSE) 2、最大 24MHz 高速外部时钟信号 3、16MHz 高速内部 RC 振荡器(HSI) 4、128KHz 低速内部 RC(LSI) 所以总的来说可以分为三种时钟源,HSE、HSI、LSI 2、时钟树,如下图所示由上图可以发现,作为 f_cpu 的时钟源可以来源于 f_hse
3、、f_hsi 经过 HSIDIV分频后的时钟、f_lsi 这三个时钟源。而选择开关在 CKM7:0中。由此事实上可以作为 f_master 的时钟源频率有: 外部 HSE 24MHz 内部高速 HSI 16MHz、2 分频的8MHz、4 分频的4MHz、8 分频的2MHz(复位默认时钟源) 内部低速 LSI 128KHz 上面得到的频率是 f_master 的频率,然后 f_master 还可以通过 CPUDIV 来分频后提供 f_cpu 的时钟,CPUDIV 可以为 1、2、4、8、16、32、64、128 分频,最终得到是 CPU 的时钟频率 f_cpu。3、时钟切换 时钟切换功能为用户提
4、供了一种易用、快速、安全的从一个时钟源切换到另一个时钟源的途径。 (1)、系统启动 为使系统快速启动,复位后时钟控制器自动使用 HSI 的 8 分频(HSI/8)做为主时钟(2MHz)。其原因为 HSI 的稳定时间短,而 8 分频可保证系统在较差的 VDD条件下安全启动。 一旦主时钟源稳定,用户程序可将主时钟切换到另外的时钟源。 (2)、主时钟切换的过程 用户可选择下面两种方式切换时钟源:自动切换、手动切换 自动切换使用户可使用最少的指令完成时钟源的切换。应用软件可继续其它操作而不用考虑切换事件所占的确切时间。具体方法在实例中讲解 手动切换与自动切换不同,不能够立即切换,但它允许用户精确地控制
5、切换事件发生的时间。具体方法在实例中讲解 8.2 时钟控制寄存器及设置 第六章的 IO 口实验之所以能正常运行的原因是在于 STM8S207 上电复位后有默认的时钟源,所以可以正常工作,但是为了更好使用和理解 STM8S207 是有必要清楚掌握 STM8S207 的时钟编程。 1、主时钟切换寄存器 CLK_SWR由上面的时钟树可知,CLK_SWR 对应的就是 CKM7:0,我也很好奇为什么不一致。 CLK_SWR 有特定的值才有效,是选择三个时钟源之一作为 f_master 的时钟输入。具体如下所示: 0xE1:HSI 为主时钟源(复位值) 0xD2:LSI 为主时钟源(仅当 LSI_EN 选
6、项位为 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 的时钟周期分频后
7、再对 f_cpu 提供时钟周期。具体分频倍数为: HSIDIV1:0:高速内部时钟预分频器,由软件写入,用于指定 HSI 分频因子。 00:fHSI = fHSI RC 输出 01:fHSI = fHSI RC 输出/2 10:fHSI = fHSI RC 输出/4 11:fHSI = fHSI RC 输出/8 CPUDIV2:0:CPU 时钟预分频器,由软件写入,用于指定 CPU 时钟预分频因子。 000:fCPU = fMASTER 001:fCPU = fMASTER/2 010:fCPU = fMASTER/4 011:fCPU = fMASTER/8 100:fCPU = fMAST
8、ER/16 101:fCPU = fMASTER/32 110:fCPU = fMASTER/64 111:fCPU = fMASTER/128 4、切换控制寄存器 CLK_SWCR这个寄存器主要是查看时钟源的切换标志位,具体含义如下: SWIF:时钟切换中断标志位 由硬件置位或软件写 0 清除。该位的含义取决于 SWEN 位的状态。 手动切换模式下(SWEN=0): 0:目标时钟源未准备就绪 1:目标时钟源准备就绪 自动切换模式下(SWEN=0): 0:无时钟切换事件发生 1:有时钟切换事件发生 SWIEN:时钟切换中断使能由软件置位或清除 0:时钟切换中断禁用 1:时钟切换中断使能 SWE
9、N:切换启动/停止由软件置位或清除。向该位写 1 将切换主时钟至寄存器 CLK_SWR 指定的时钟源。 0:禁止时钟切换的执行 1:使能时钟切换的执行 SWBSY:切换忙由硬件置位或清除。可由软件清除以复位时钟切换过程。 0:无时钟切换在进行。 1:时钟切换正在进行。 除上面上面主要涉及到的寄存器之外还有 内部时钟寄存器 CLK_ICKR 外部时钟寄存器 CLK_ECKR 外设时钟门控寄存器 1 CLK_PCKENR1 外设时钟门控寄存器 2 CLK_PCKENR2 时钟安全系统寄存器 CLK_CSSR 可配置时钟输出寄存器 CLK_CCOR HIS 时钟修正寄存器 CLK_HSITRIMR
10、SWIM 时钟控制寄存器 CLK_SWIMCCR 这些寄存器在本章最后小节中才略为说明,时钟编程主要以前面3个寄存器有关。例如 CLK_SWR 是选择时钟源、CLK_SWCR 是时钟切换的控制寄存器,控制切换过程的设置而 CLK_CKDIVR 是设置 HIS 的分频系数和 f_cpu 的分频系数8.3 时钟编程基础应用 为了从不同角度理解时钟编程,这节分三个基础例程分别实现 CPU 和内部高速时钟分频例程、自动切换时钟源例程以及手动切换时钟源例程。 8.3.1 CPU 分频以及 HIS 分频例程 时钟编程本身并不需要外部设备,为了检验时钟分频的效果,在这里采用了一个 LED 灯闪耀的效果来检验
11、时钟的快慢,具体实现是相同的延时函数,在不同的时钟频率下跑的效果有很大差异,这样就达到了检查实验的效果。 如下图所示:在这里使用了 LED1,也就是 PD0 端口,对应的 IO 口操作在前一章已经有过详细介绍。本实验操作的寄存器只有一个,就是 CLK_CKDIVR ,具体如下所示: HSIDIV1:0:高速内部时钟预分频器,由软件写入,用于指定 HSI 分频因子。 00:fHSI = fHSI RC 输出 01:fHSI = fHSI RC 输出/2 10:fHSI = fHSI RC 输出/4 11:fHSI = fHSI RC 输出/8(默认) CPUDIV2:0:CPU 时钟预分频器,由
12、软件写入,用于指定 CPU 时钟预分频因子。 000:fCPU = fMASTER 001:fCPU = fMASTER/2 010:fCPU = fMASTER/4 011:fCPU = fMASTER/8 100:fCPU = fMASTER/16 101:fCPU = fMASTER/32 110:fCPU = fMASTER/64 111:fCPU = fMASTER/128 程序代码如下: /* 每一个时钟分频周期为闪耀灯5次 HSI CPU 1:1 16M HSI CPU 1:4 4MHSI CPU 2:4 2M */ #include "iostm8s207rb.h&q
13、uot; void delay_ms(int value); int main( void ) int i; /配置PD0为输出 PD_DDR_DDR0 = 1; PD_CR1_C10 = 1; PD_CR2_C20 = 0; PD_ODR_ODR0 = 1; while(1) /HSI CPU 1:1 16M CLK_CKDIVR = 0x00; for(i=0;i!=10;+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(100); delay_ms(100); /HSI CPU 1:4 4M CLK_CKDIVR_HSIDIV = 0; CLK_CKDIVR
14、_CPUDIV = 2; for(i=0;i!=10;+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(100); delay_ms(100); /HSI CPU 2:4 2M CLK_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); /* * 简单延时 * */ void delay_ms(int value) int i,j; if(value < 1) value = 1
15、; for(i=0;i!=value;+i) for(j=0;j!=5000;+j); 8.3.2 自动切换时钟源 因为 STM8S 单片机上电复位是采用了内部时钟源 HIS,所以在这里实现的功能是切换外部时钟源。由于 STM8S207 开发板使用的外部晶振是 24M,在主频大于 16M 以上时,需要更改选项字,这里降低实验的难易程度,决定在这里采用外部时钟然后通过 CPUDIV 2 分频得到的 f_cpu 主频为12M 自动切换时钟源的对应步骤: 1、设置切换控制寄存器(CLK_SWCR)中的位 SWEN,使能切换机制。 2、向主时钟切换寄存器(CLK_SWR)写入一个 8 位的值,用以选择
16、目标时钟源。寄存器 CLK_SWCR 中的 SWBSY 被硬件置位,目标源振荡器启动。原时钟源依然被用于驱动内核和外设。 一旦目标时钟源稳定,寄存器 CLK_SWR 中的值将被复制到主时钟状态寄存器(CLK_CMSR)中去。此时,SWBSY 位被清除,新时钟源替代旧时钟源。寄存器CLK_SWCR 中的标志位 SWIF 被置位,如果 SWIEN 为 1,则会产生一个中断。硬件采用 8.3.1 的电路图,也是通过 LED 实现检测效果 详细代码如下: #include "iostm8s207rb.h" void delay_ms(int value); int main( vo
17、id ) int i; /配置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; /CPUDIV 2分
18、频 /切换后的时钟为12M delay_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 = 8M delay_ms(100); for(i=0;i!=10;
19、+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(100); /* * 简单延时程序 * */ void delay_ms(int value) int i,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 被硬件置位,目
20、标源振荡器启动。原时钟源依然被用于驱动内核和外设。 2、用户软件需等待至目标时钟源稳定。寄存器 CLK_SWCR 中的标志位 SWIF用以指示目标时钟源是否已稳定,如果 SWIEN 为 1,则会产生一个中断。 3、最后,由用户软件在所选的时间点,设置寄存器 CLK_SWCR 中的位 SWEN,执行切换。 在前两个例程的基础上,我们可以进行时钟编程的第三个例程了,具体的步骤如上所示,下面进行我们的软件编写。 /* * 手动切换顺序 1、向CLK_SWR写入一个数据,选择目标时钟源 2、等待CLK_SWCR_SWIF = 1,时钟稳定 3、设置CLK_SWCR_SWEN = 1,开启时钟 * */
21、 #include "iostm8s207rb.h" void delay_ms(int value); int main( void ) int i; /配置LED1 PD_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: LS
22、I为主时钟源(仅当LSI_EN选项为1时) /0XB4: HSE为主时钟源(外部时钟) while(CLK_SWCR_SWIF = 0); /等待时钟稳定,输出时钟为12M CLK_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); /等待时钟稳定,输出时钟为8M CLK_SWCR_SWEN = 1; /切换时钟 for(i=0;i!=10;+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(100); delay_ms(100); /* * 简单延时程序 * */ void delay_ms(int value) int i,j; if(value < 1) value = 1; for(i=0;i!=value;+i) for(j=0;j!=5000;+j); 8.4 其它关于时钟编程寄存器 时钟编程的其它寄存器涉及到外设和时钟安全方面
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025承包合同钢筋
- 2025常用购销合同范文
- 2025正规的个人借款合同模板
- 2024年度医疗影像存储与传输系统采购协议3篇
- 新建山梨糖醇液项目立项申请报告
- 新建绝缘材料冲型项目立项申请报告
- 色谱仪项目立项报告
- 填料填充剂项目立项申请报告
- DB12T 705-2016 商贸物流绿色配送管理规范
- DB12T 628-2016 天津市社会组织法人治理结构准则
- 2024年甘肃兰州生物制品研究所有限责任公司招聘笔试参考题库附带答案详解
- 保单检视报告活动策划
- 室外消火栓安装工程检验批质量验收记录表
- 辽宁省沈阳市铁西区2023-2024学年七年级上学期期末考试英语试题(含听力)
- 于永正教育文集:于永正:我怎样教语文
- 税务主管工作总结
- 《宪法学》2023-2024期末试题及答案(试卷号2106)
- 苯-甲苯分离精馏塔化工原理课程设计
- 《地籍与房产测绘》课程课程标准
- 病毒 课件 初中生物人教版八年级上册(2023~2024学年)
- 2022年1月福建省普通高中学生学业基础会考生物试卷
评论
0/150
提交评论