STM8教程-第八章STM8S207时钟编程及其实例[整理]

上传人:x****育 文档编号:143416792 上传时间:2020-08-29 格式:PDF 页数:13 大小:644.18KB
返回 下载 相关 举报
STM8教程-第八章STM8S207时钟编程及其实例[整理]_第1页
第1页 / 共13页
STM8教程-第八章STM8S207时钟编程及其实例[整理]_第2页
第2页 / 共13页
STM8教程-第八章STM8S207时钟编程及其实例[整理]_第3页
第3页 / 共13页
STM8教程-第八章STM8S207时钟编程及其实例[整理]_第4页
第4页 / 共13页
STM8教程-第八章STM8S207时钟编程及其实例[整理]_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《STM8教程-第八章STM8S207时钟编程及其实例[整理]》由会员分享,可在线阅读,更多相关《STM8教程-第八章STM8S207时钟编程及其实例[整理](13页珍藏版)》请在金锄头文库上搜索。

1、1 第八章STM8S207时钟编程及其实例 本章介绍 STM8S207 的时钟编程。STM8S207 时钟控制器功能强大而灵活易用,允许程 序运行中将主时钟从一个时钟源切换到另一个时钟源,而且同一个时钟源可以任意更改分频 系数。 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、时钟树,如下图所示 2 由上图可以发现,作为 f_cpu 的

3、时钟源可以来源于 f_hse 、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 分频, 最终得到是 CP

4、U 的 时钟频率 f_cpu 。 3、时钟切换 时钟切换功能为用户提供了一种易用、快速、安全的从一个时钟源切换到另一个时钟源 的途径。 3 (1) 、系统启动 为使系统快速启动,复位后时钟控制器自动使用 HSI 的 8 分频 (HSI/8)做为主时钟 (2MHz ) 。其原因为 HSI 的稳定时间短,而 8 分频可保证系统在较差的 VDD条件下安全启 动。一旦主时钟源稳定,用户程序可将主时钟切换到另外的时钟源。 (2) 、主时钟切换的过程 用户可选择下面两种方式切换时钟源:自动切换、手动切换自动切换使用户可使用最 少的指令完成时钟源的切换。应用软件可继续其它操作而不用考虑切换事件所占的确切时

5、间。具体方法在实例中讲解手动切换与自动切换不同,不能够立即切换,但它允许用户精 确地控制切换事件发生的时间。具体方法在实例中讲解 时钟控制寄存器及设置 第六章的 IO 口实验之所以能正常运行的原因是在于 STM8S207 上电复位后有默认的 时钟源,所以可以正常工作,但是为了更好使用和理解 STM8S207 是有必要清楚掌握 STM8S207 的时钟编程。 1、主时钟切换寄存器 CLK_SWR 由上面的时钟树可知,CLK_SWR 对应的就是 CKM7:0 ,我也很好奇为什么不一致。 CLK_SWR 有特定的值才有效,是选择三个时钟源之一作为 f_master 的时钟输入。 具体如下所示: 0

6、xE1:HSI 为主时钟源 ( 复位值 ) 0 xD2:LSI 为主时钟源 ( 仅当 LSI_EN 选项位为 1 时) 0 xB4:HSE 为主时钟源 2、主时钟状态寄存器 CLK_CMSR 对应着 CLK_SWR ,由硬件置位或清除。用以指示当前所选的主时钟源。如果该 寄存器中的值为无效值,则产生 MCU 复位 0 xE1:HSI 为主时钟源 ( 复位值 ) 0 xD2:LSI 为主时钟源 ( 仅当 LSI_EN 选项位为 1 时) 0 xB4:HSE 为主时钟源 3、时钟分频寄存器 CLK_CKDIVR 这个寄存器对应了时钟树中的 HSIDIV 以及 CPUDIV,正如前面所说的 HSID

7、IV 4 可以把内部高速 RC 时钟源分频后才对 f_master 提供时钟周期;CPUDIC 就是把 f_master 的时钟周期分频后再对 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:

8、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 4、切换控制寄存器 CLK_SWCR 这个寄存器主要是查看时钟源的切换标志位,具体含义如下: SWIF : 时钟切换中断标志位由硬件置位或软件写 0 清除。该位的含义取决于 SWEN 位的状态。 手动切换模式下(SWEN=0) : 0:目标时钟源未准备就绪 1:目标时钟源准备就绪 自动切换模式下(SWE

9、N=0) : 0:无时钟切换事件发生 1:有时钟切换事件发生 SWIEN :时钟切换中断使能由软件置位或清除 0:时钟切换中断禁用 1:时钟切换中断使能 SWEN :切换启动 / 停止由软件置位或清除。向该位写 1 将切换主时钟至寄存器 CLK_SWR 指定的时钟源。 0:禁止时钟切换的执行 1:使能时钟切换的执行 SWBSY:切换忙由硬件置位或清除。可由软件清除以复位时钟切换过程。 5 0:无时钟切换在进行。 1:时钟切换正在进行。 除上面上面主要涉及到的寄存器之外还有 内部时钟寄存器 CLK_ICKR 外部时钟寄存器 CLK_ECKR 外设时钟门控寄存器 1 CLK_PCKENR1 外设时

10、钟门控寄存器 2 CLK_PCKENR2 时钟安全系统寄存器 CLK_CSSR 可配置时钟输出寄存器 CLK_CCOR HIS 时钟修正寄存器 CLK_HSITRIMR SWIM 时钟控制寄存器 CLK_SWIMCCR 这些寄存器在本章最后小节中才略为说明,时钟编程主要以前面3 个寄存器有关。 例如 CLK_SWR 是选择时钟源、CLK_SWCR 是时钟切换的控制寄存器,控制切换过程的设 置而 CLK_CKDIVR 是设置 HIS 的分频系数和 f_cpu 的分频系数 时钟编程基础应用 为了从不同角度理解时钟编程,这节分三个基础例程分别实现 CPU 和内部高速时 钟分频例程、自动切换时钟源例程

11、以及手动切换时钟源例程。 CPU 分频以及 HIS 分频例程 时钟编程本身并不需要外部设备,为了检验时钟分频的效果,在这里采用了一个 LED 灯闪耀的效果来检验时钟的快慢,具体实现是相同的延时函数,在不同的时钟频率 下跑的效果有很大差异,这样就达到了检查实验的效果。 如下图所示:在这里使用了 LED1,也就是 PD0 端口,对应的 IO 口操作在前一章 已经有过详细介绍。 本实验操作的寄存器只有一个,就是 CLK_CKDIVR ,具体如下所示: HSIDIV1:0:高速内部时钟预分频器,由软件写入,用于指定 HSI 分频因子。 00:fHSI = fHSI RC 输出 01:fHSI = fH

12、SI RC 输出 /2 10:fHSI = fHSI RC 输出 /4 11:fHSI = fHSI RC 输出 /8( 默认 ) 6 CPUDIV2:0 :CPU 时钟预分频器,由软件写入,用于指定 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 程序代码如下: /* 每一个时

13、钟分频周期为闪耀灯5 次 HSI CPU 1:1 16M HSI CPU 1:4 4M HSI CPU 2:4 2M */ #include 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 = 0 x00; for(i=0;i!=10;+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(1

14、00); delay_ms(100); /HSI CPU 1:4 4M CLK_CKDIVR_HSIDIV = 0; CLK_CKDIVR_CPUDIV = 2; for(i=0;i!=10;+i) 7 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); /* *

15、 简单延时 * */ 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); 自动切换时钟源 因为 STM8S 单片机上电复位是采用了内部时钟源 HIS ,所以在这里实现的功能是 切换外部时钟源。由于 STM8S207 开发板使用的外部晶振是 24M,在主频大于 16M 以 上时,需要更改选项字,这里降低实验的难易程度,决定在这里采用外部时钟然后通过 CPUDIV 2 分频得到的 f_cpu 主频为 12M 自动切换时钟源的对应步骤: 1、设置切换控制寄存器(CLK_SWCR) 中的位 SWEN ,使能切换机制。 2、向主时钟切换寄存器(CLK_SWR) 写入一个 8 位的值,用以选择目标时钟源。寄 存器 CLK_SWCR 中的 SWBSY 被硬件置位,目标源振荡器启动。原时钟源依然被用于驱 动内核和外设。一旦目标时钟源稳定,寄存器 CLK_SWR 中的值将被复制到主时钟状态 寄存器 (CLK_CMSR) 中去。此时, SWBSY 位被清除,新时钟源替代旧时钟源。寄存器 CLK_SWCR 中的标志位 SWIF 被置位,如果 SWIEN 为 1 ,则会产生一个中断。硬件采用 的电路图,也是通过 LED 实现检测效

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 习题/试题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号