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

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

闲话少叙,下面说说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. Facade ——为子系统的一组接口提供一致界面

    Façade模式提供了子系统一组接口的一致封装特性,如下图所示: 如图所示,OperationWrapper的实现依赖SubSystem1,2等的Operation操作.但用户调用OperationW ...

  2. svn 设置文件可执行权限

    本地文件在commit到仓库之前若没有chmod +x 权限的话,那在svn仓库里的文件将会保持当前无可执行属性状态. 即使在本地chmod +x filename 之后,再提交到仓库也是没有用的.c ...

  3. CentOS 下mysql 的安装

    1.安装mysql服务器 yum -y install mysql-server 2.装入service启动服务 /etc/rc.d/init.d/mysqld start 3.设置mysql服务开机 ...

  4. JSP 语法/标签

    ┣1.declaration Declaration定义了JSP脚本语言使用的变量和函数,这类似于Java中定义全局变量,或可以把它想像成pascal编程语言中的单元文件的interface部分.声明 ...

  5. angularJS Directive学习

    Directive 指令 直接上实例 index.html <!doctype html> <html ng-app="drag"> <head> ...

  6. Ubuntu下安装使用MongoDB

    安装 官网下载: https://www.mongodb.org/ 解压解包 重命名为mongodb 移动到/usr/local/目录下 创建连个软连接  ln -s /usr/local/mongo ...

  7. IDL 实现 EOF(经验正交函数分析)

    关于EOF详细介绍请wiki http://en.wikipedia.org/wiki/Empirical_orthogonal_functions或者Google之. 与PCA一样,EOF也是遥感多 ...

  8. LoadRunner监控Unix、Windows方法及常用性能指标

    目  录 一.LoadRunner监控Linux资源.... 3 (一).准备工作... 3 1.可以通过两种方法验证服务器上是否配置了rstatd守护程序:... 3 (2)使用find命令... ...

  9. 手写js代码(一)javascript数组循环遍历之forEach

    注:原文地址http://blog.csdn.net/oscar999/article/details/8671546 我这里是仿照学习! 1.js的数组循环遍历 ①数组的遍历首先想到的是for()循 ...

  10. Swaps in Permutation

    Swaps in Permutation You are given a permutation of the numbers 1, 2, ..., n and m pairs of position ...