[STM8] - 外部时钟 + 内部时钟 的切换

发布者:innovator7最新更新时间:2018-08-16 来源: eefocus关键字:STM8  外部时钟  内部时钟 手机看文章 扫描二维码
随时随地手机看文章
  1. 首先看一下 STM8S103K3 的时钟结构图,可以帮助你很好的理解。 
    这里写图片描述
    这里有几个时钟,就是图中标识的时钟,需要弄清楚一下:

    • fHSE: 外部高速晶振时钟,它是由外部晶振产生,大小由外部晶振大小决定,STM8S的外部晶振范围:1-24M,看图中的”HSE OSC 1-24M“。

    • fHSI:内部RC高速时钟,它是由内部的RC震荡电路产生的,其值16M。但是可以经过后面的分频器分频,四个分频系数可供选择(1,2,4,8)。注:精准度比外部晶振的要稍差一些。

    • fMASTER:主时钟,它是由HSE 或者 HSI提供时钟,主要功能给外围设备(peripherals,如I2C,SPI,ADC等)提供时钟,还有给CPU提供时钟源。

    • fCPU:cpu时钟,它是由fMASTER经过分频得到,其作用就是给CPU提供时钟,一个机械周期就是一个fCPU的时钟周期。

  2. 下面是时钟的源码部分,可供大家参考。 
    这里写了四段程序,分别是:

    • 使用高速内部时钟(寄存器版)

    • 使用高速内部时钟(库函数版)

    • 使用外部时钟(寄存器版)

    • 使用外部时钟(库函数版)

源码如下,看注释应该就可以了。



/*******************************************************************************

* Function Name  : InitCpuClock.

* Description    : Initial CPU clock, .

* Input          : None.

* Output         : None.

* Return         : None.

*******************************************************************************/

static void InitCpuClock(void)

{


#if 1

    // 寄存器版本 - 使用高速内部时钟 


    //Use HSI @8MHZ, div = 2; 8=16/2

    CLK->ECKR &= ~CLK_ECKR_HSEEN;                      // 失能外时钟


    CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV);      // 清零内部时钟预分频

    CLK->CKDIVR |= CLK_PRESCALER_HSIDIV2;               // 设置内部时钟预分频 2; 具体可以参考数据手册 (reference manual)


    CLK->ICKR |= CLK_ICKR_HSIEN;                        // 使能内部高速时钟


    while(!(CLK->ICKR&CLK_ICKR_HSIRDY));                // 等待内部高速时钟稳定, 稳定后则内部时钟已经开跑了。 时钟 = 16/2 M

#endif


#if 0

    // 库函数版本 - 使用内部高速时钟


    //Use HSI @8MHZ, div = 2; 8=16/2

    CLK_HSECmd(DISABLE);                                // 失能外时钟


    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);      // 设置内部时钟预分频 2; 具体可以参考数据手册 (reference manual)


    CLK_HSICmd(ENABLE);                                 // 使能内部高速时钟


    while(!(CLK->ICKR&CLK_ICKR_HSIRDY));                // 等待内部高速时钟稳定, 稳定后则内部时钟已经开跑了。 时钟 = 16/2 M

#endif


#if 0

// 寄存器版本  - 使用外部时钟


    CLK->CKDIVR |= CLK_PRESCALER_CPUDIV1;               // CPU 时钟分频 1,CPU时钟 = 外部时钟(即是外部晶振频率)


    CLK->ECKR |= CLK_ECKR_HSEEN;                        // 允许外部高速振荡器工作

    while(!(CLK->ECKR & CLK_ECKR_HSERDY));              // 等待外部高速振荡器准备好


    CLK->SWCR |= CLK_SWCR_SWEN;                         // 使能切换

    CLK->SWR = CLK_SOURCE_HSE;                          // 选择芯片外部的高速振荡器为主时钟

    while(!(CLK->SWCR&CLK_SWCR_SWIF));                  // 等待切换成功

    CLK->SWCR &= ~(CLK_SWCR_SWEN|CLK_SWCR_SWIF);       // 清除切换标志

#endif



#if 0

// 库函数版本  - 使用外部时钟


    CLK->CKDIVR |= CLK_PRESCALER_CPUDIV1;               // CPU 时钟分频 1,CPU时钟 = 外部时钟(即是外部晶振频率)

    CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO,          // 时钟自动切换模式,注: 参数是自动切换,不然只使用这一个函数是不能切换成功的

                          CLK_SOURCE_HSE,               // 要切换的时钟(这里是外部时钟)

                          DISABLE,                      // 是否使能切换完成中断(这里失能)

                          CLK_CURRENTCLOCKSTATE_ENABLE);// 是否还使能当前时钟(这里选择 关掉当前时钟HSI)

    CLK->SWCR &= ~(CLK_SWCR_SWEN|CLK_SWCR_SWIF);       // 清除切换标志


#endif


}


关键字:STM8  外部时钟  内部时钟 引用地址:[STM8] - 外部时钟 + 内部时钟 的切换

上一篇:STM8 嵌入式特性编程之构建你的系统时间
下一篇:单片机ISP、IAP、ICP烧写方式的概念与区别

推荐阅读最新更新时间:2024-03-16 16:11

STM8 GPIO 寄存器的理解
在学习的时候,要是想完全了解,我觉的不大可能。 为什么人家就规定了那个表格,按照表格写就可以实现对硬件的操作? 抱着心中的疑问走下去吧! 匆匆的读了一下这个STM8手册,不是很理解; 直接看C语言程序,似乎找到了一些规律,对这个手册理解了; C语言程序中出现的“变量”: 参考了以下 电路原理图和实体的板子: 总结出一个经验: PC和PD是分的组; bit.后面跟的是具体的哪个IO口的哪个属性; =后面是IO的属性值; 在回头看一下那个GPIO寄存器表就清楚了 每个GPIO的组都有8个IO口(0-7); PD_DDR_bit.DDR7=1 就表示D组的PD7口,是输出模式;
[单片机]
<font color='red'>STM8</font> GPIO 寄存器的理解
IAR FOR STM8 简单使用教程
一、创建工程 1.先创建一个workplace.选择File New Workplace 2.创建一个新的工程,选择Project Creat New Project,如果用的是IAR FOR STM8 就默认无需更改。保存并输入Project名字,在workplace窗口中显示如下 3.在添加文件到工程之前,先保存Workplace。并输入保存的名字,Workplace的扩展名是eww。 4.添加文件到工程. (1)右击工程名 ADD ADD FILES添加 .c文件 (2)添加头文件文件夹路径:右击工程名 Options C/++compiler PreProcessor中加入头文件所在文件夹的路径 例如: $
[单片机]
IAR FOR <font color='red'>STM8</font> 简单使用教程
stm8 stvd工程头文件包含方式
方式一:在Include Files上右键 add files to folder把.h文件添加到该组下, 添加完编译成功之后,下面窗口会多出一个预处理包含路径(若有错误没有编译成功,则看不到) 方式二:project Settings-c compiler- category-Preprocessor---additional include directories,依次添加要包含的头文件路径
[单片机]
<font color='red'>stm8</font> stvd工程头文件包含方式
STM8的中断系统以及外部中断详解
STM8具有最多32的中断系统,在中断的处理上类似于cortexm系列的芯片,首先是每个中断的向量都是固化在系统内部的,用户需要向相应的中断向量flash位置写入中断处理函数,其二,每个中断向量都具有可编程的优先级,共有两位优先级,两个BIT的优先级可以催化出4个优先级,具体如下 中断控制器内部有一些寄存器专门用来存放相应的中断的中断优先级,同同时,在系统内部也有一个系统寄存器CC他的第三位和第五位分别表示当前正在处理的中断的优先级 可以这样认为,中断发生的时候,系统寄存器在执行中断向量跳转的时候自动载入了相应的中断优先级到系统寄存器CC中. 中断的处理遵循先判断软件优先级后判断硬件优先级的模式,当几个中断同时发生
[单片机]
AVR单片机Atmega16电子时钟程序+仿真,内部定时器实现
Atmega16电子时钟,内部定时器,有可调闹钟。 仿真原理图如下 单片机源程序如下: #include iom16v.h #include macros.h #define key_bz 0b00000111 char smg_zx ={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f};// 全局变量 char hour=12; char min; char sec; char nz_hour=12; char nz_min=1; char mode=0; char set; void delay_ms(unsigned int k)
[单片机]
AVR单片机Atmega16电子<font color='red'>时钟</font>程序+仿真,<font color='red'>内部</font>定时器实现
ATtiny13 外部时钟
为了从外部时钟源驱动芯片, CLKI 必须如 Figure 12 所示的进行连接。同时,ATtiny13 熔丝位 CKSEL 必须编程为 “00”。 选择了这个振荡器之后,启动时间由熔丝位 SUT确定,如 Table 7 所示。 为了保证 MCU 能够稳定工作,不能突然改变外部时钟源的振荡频率。工作频率突变超过 2%将会产生异常现象。应该在 MCU 保持复位状态时改变外部时钟的振荡频率。 注意,系统时钟预分频器可用来实现内部时钟频率运行时间改变且保证稳定工作,详见P24“ 系统时钟预分频器 ” 。
[单片机]
ATtiny13 <font color='red'>外部</font><font color='red'>时钟</font>
从头学STM8单片机之"Hello,world"
  最近做了一个数显电压表,电路上支持交流或直流电压显示,软件上支持七种不同的满量程档位,可以自由切换,有小数点自动移位,无效零消隐,超量程指示等功能,修改外部元件就可以做成不同量程的交流或直流电压表,不会编程的朋友也可以DIY出各种不同量程的交流或直流电压表。   主要元件有STM8S003F3单片机一片,自带ADC,0.56寸三位共阴数码管一个,再就是阻容稳压什么的,电路也很简单,爱好者自制很方便。本贴的程序都能在此硬件上测试通过。下面是电路原理图:   自从去年开始学了单片机以后,发现单片机没有想象中那么难,所以想做一个教程和大家一起共同学习。我的编译环境是IAR的EWSTM8-2102,本贴代码都在此环境下测试通过,
[单片机]
从头学<font color='red'>STM8</font>单片机之
stm8 软件模拟IIC驱动PCF8563T,NOKIA5110液晶显示
调试stm8硬件IIC,弄了几天,搞得人头大,一直程序就是卡在 while((I2C_SR1&0x02))这里,数据手册和网上的各种帖子基本都看了,程序都试了,ARF位也设置了,还是调试不通,最后没办法只能使用软件模拟IIC了。 这次使用软件模拟IIC驱动PCF8563T,这个时钟芯片。其实软件模拟也不难。 我们就来直接看代码吧。具体的实验现象,没有图片,现在硬件也拆了,但是程序都是验证过了的。通过一个NOKIA5110液晶屏显示出来时间数据。 #include IOSTM8S105K4.h #define u16 unsigned int #define u8 unsigned char u8 i;
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved