就我个人看来,研究一块单片机,分为新手和老手两种模式,新人迫切的想先用,你得告诉他们怎么样最快的写出一个能跑起来的程序,告诉他们每一个外设的使用方式,老手不同,用的单片机多了外设对于他们而言没太多好奇的,中断,无非配置中断,连接中断,打开中断,中断模式,中断函数,定时器,无非打开时钟,设置分频率,设置值,等中断到来计数,千篇一律,没什么花样

但是老手关注的是不同,这个和那个的差异是什么,这样就能避免惯性思维,不会用错,学起来差不多,都是对着手册读呗,但是学的心态不一样,更加的举重若轻

闲话少叙,下面说说STM8的时钟系统

STM8时钟系统看起来是这样的,有一个外部输入时钟OSC,一个外部输出时钟CCO,CCO可选输出

内部的时钟五大块,CPU时钟,外设时钟,看门狗时钟,CAN总线时钟以及自动唤醒时钟

CPU时钟的来源包括外部晶振,外部振荡器输入,内部高速振荡器输入,三种输入经过主时钟选择,再经过主时钟分频输出CPU以及内部窗口看门狗

外设时钟和CPU时钟来源一样,并不经过主时钟分频,二十有一个外设使能控制,输入到各个外设,从这里我们可以判断,外设里面肯定还有分频器

自动唤醒时钟直接来源于内部低速振荡器或者直接来源于外部始终,经过选项字节选择输入

独立看门狗的时钟只可能来自于内部高速振荡器

而CAN总线的时钟也是直接从晶振上获取的,同时内部低速振荡器是可以关掉的

接下来我们看看寄存器

控制内部低速振荡器和内部高速振荡器的开关以及开关状态标识,细节是什么,观察这个复位值,0x01,也就是说,复位的时候内部低速振荡器使能这代表着系统复位的时候肯定是使用内部低速振荡器的,不用看文档的其他部分这一点几乎就能确定

外部时钟使能以及时钟状态

八个位都是只读,标识当前我们选用的系统主时钟是谁,也就是框图中master clock switch的标识

让你来选择哪一个做主时钟

对时钟切换的过程进行监控

时钟分频,一是内部高速时钟的分频,二是外部高速时钟的分频

还有一个2,用来确定各个外设是否连接到时钟上,相当于外设使能,外设没有时钟是跑不起来的

时钟安全系统配置

时钟输出的配置,也就是刚才说的CCO的来源

CAN总线的时钟分频

剩下来的一个是HIS的始终修正,另一个是SWIM时钟的配置,都是不需要我们去关注的

初始化时钟的流程包括

1.      想要选择的主时钟使能,等待稳定

2.      选择主时钟并进行切换,等待切换完成

3.      选择系统时钟分频数

4.      选择相应的外设时钟

代码如下

Clock.c

#include "clock.h"

void ClockInit(u8 clockSel)
{
if(clockSel == HSE_CLOCK)
{
//切换到外部始终之前,因为我使用的是24M时钟,所以需要修改插入flash等待时间
//此处讲解选项字节再补上 //注意,下面这一段只能在使用16M一下时钟的时候有用
CLK->ECKR |= 0x01;//使能外部晶振
while(!(CLK->ECKR & 0x02));//等待时钟准备就绪
CLK->SWCR &= ~((1<<2)|(1<<3));//时钟切换中断禁止并清除中断标志
CLK->SWR = 0xB4;//时钟选择为HSE
while(CLK->SWCR & 0x01);//等待时钟切换慢的结束
CLK->SWCR |= 0x01;//使能时钟切换
while(CLK->CMSR != 0xB4);//等待系统时钟切换到0xb4
CLK->CKDIVR = 0x00;//设置时钟预分频,设置为fmaster = fclock
CLK->CCOR &= ~(1<<0);//禁止CCO输出 //此时,应当关闭内部始终
CLK->ICKR &= ~0x01;
}
else if(clockSel == HSI_CLOCK)
{
CLK->ICKR |= 0x01;//使能内部高速时钟
while(!(CLK->ICKR | 0x02));//等待准备就绪
CLK->SWCR &= ~((1<<2)|(1<<3));//时钟切换中断禁止并清除中断标志
CLK->SWR = 0xE1;//时钟选择为HSI
while(CLK->SWCR & 0x01);//等待时钟切换慢的结束
CLK->SWCR |= 0x01;//使能时钟切换
while(CLK->CMSR != 0xE1);//等待系统时钟切换到0xb4
CLK->CKDIVR = 0x00;//设置时钟预分频,设置为fmaster = fclock
CLK->CCOR &= ~(1<<0);//禁止CCO输出
//此时,应当关闭外部时钟
CLK->ECKR &= ~0x01;//使能外部晶振
}
}

Clock.h

#ifndef __CLOCK_H_
#define __CLOCK_H_
#include "stm8s.h" #define HSE_CLOCK 0
#define HSI_CLOCK 1 //初始化系统时钟,有两个选择,一个hse一个是hsi
void ClockInit(u8 clockSel); #endif

另外,有一个时钟安全系统,这是一个什么机构

也就是,当系统晶振由于外部干扰或者电路故障断开的时候,自动切换到内部高速时钟,这样能够保证实际的单片机电路系统不会失控,防止造成不良影响

STM8时钟系统详解的更多相关文章

  1. S3C2440时钟系统详解

    在讲述系统时钟之前,因为这些设备都是挂靠在系统时钟上的,所以必须先说系统时钟,S3C2440的时钟系统如下 外部时钟源分两种,晶振或者外部频率,由om3-2选择,时钟电路根据两种选择也有两种 我们来分 ...

  2. Bootstrap栅格系统详解,响应式布局

    Bootstrap栅格系统详解 栅格系统介绍 Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 栅格系统用于通 ...

  3. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  4. Vmware12安装centos系统详解

    vmware12安装centos7系统详解 用虚拟机12安装centos7系统详细安装过程,后附centos7下载地址. 工具/原料 虚拟机12 centos7系统镜像 方法/步骤 1 1.百度搜索c ...

  5. centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解

    centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...

  6. syslog之一:Linux syslog日志系统详解

    目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...

  7. 利用python求解物理学中的双弹簧质能系统详解

    利用python求解物理学中的双弹簧质能系统详解 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的 ...

  8. 搭建zabbix监控系统详解

    搭建zabbix监控系统详解 文:warren   博文大纲:一.前言 二.zabbix监控架构三.搭建Zabbix监控服务器四.搭建过程中遇到有些服务无法正常启动的解决办法 一.前言 : 要想实时的 ...

  9. django用户投票系统详解

    投票系统之详解 1.创建项目(mysite)与应用(polls) django-admin.py startproject mysite python manage.py startapp polls ...

随机推荐

  1. hdu 1728 逃离迷宫 (BFS)

    逃离迷宫 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  2. android 数据存储分配的一些事

    应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的.大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中.这样当该应用被卸载后,这些数据还 ...

  3. Android --- 读取系统资源函数getResources()小结

    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1201/655.html 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用, ...

  4. Redis 从数据库配置

    通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据.但是由于数据是存储在一台服务器上的,如果这台服务器的硬盘出现故障,也会导致数据丢失.为了避免单点故障,我们希望将数 ...

  5. hql 链接查询

    第一部分.连接查询 一.内连接 内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值.内连接分三种: 1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询 ...

  6. 通过ant调用shell脚本执行adb命令

    在Hudson或者Jenkins中利用ant的exec 来调用shell命令,通过shell脚本来执行adb shell命令,可以正常执行,不会出现在ant中直接调用adb shell出现的假死情况. ...

  7. DDS视图&Button控件

    <Button android:id="@+id/btn1" android:layout_width="wrap_content"    //包裹文字 ...

  8. HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者(基础巴什博奕)

    最最最基础巴什博奕 #include<stdio.h> #include<iostream> #include<cstring> #include<cmath ...

  9. hrbustoj 1125 循环小数 II(小数变分数+极限思想)

    #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #i ...

  10. mysql安装及使用语句

    http://www.mysql.com/downloads/ ubuntu安装sqlite http://www.cnblogs.com/zhuyp1015/p/3561470.html http: ...