stm8s时钟源切换

发布者:芳华逝水最新更新时间:2016-09-22 来源: eefocus关键字:stm8s  时钟源切换 手机看文章 扫描二维码
随时随地手机看文章
STM8单片机的时钟源非常丰富,芯片内部既有16MHZ的高速RC振荡器,也有128KHZ的低速RC振荡器,外部还可以接一个高速的晶体振荡器。在系统运行过程中,可以根据需要,自由地切换。单片机复位后,首先采用的是内部的高速RC振荡器,且分频系数为8,因此CPU的上电运行的时钟频率为2MHZ。

切换时钟源,主要涉及到的寄存器有:主时钟切换寄存器CLK_SWR和切换控制寄存器CLK_SWCR。

主时钟切换寄存器的复位值为0xe1,表示切换到内部的高速RC振荡器上。当往该寄存器写入0xb4时,表示切换到外部的高速晶体振荡器上。

在实际切换过程中,应该先将切换控制寄存器中的SWEN(第1位)设置成1,然后设置CLK_SWCR的值,最后要判断切换控制寄存器中的SWIF标志是否切换成功。

下面的实验程序首先将主时钟源切换到外部的晶体振荡器上,振荡频率为8MHZ,然后,然后快速闪烁LED指示灯。接着,将主时钟源又切换到内部的振荡器上,振荡频率为2MHZ,然后再慢速闪烁LED指示灯。通过观察LED指示灯的闪烁频率,可以看到,同样的循环代码,由于主时钟源的改变的改变,闪烁频率和时间长短都发生了变化。

同样还是利用ST的开发工具,生成一个C语言程序的框架,然后修改其中的main.c,修改后的代码如下。

 

//  程序描述:通过切换CPU的主时钟源,来改变CPU的运行速度

 

#include "STM8S207C_S.h"

 

// 函数功能:延时函数

// 输入参数:ms -- 要延时的毫秒数,这里假设CPU的主频为2MHZ

// 输出参数:无

// 返 回 值:无

// 备    注:无

void DelayMS(unsigned int ms)

{

  unsigned char i;

  while(ms != 0)

  {

    for(i=0;i<250;i++)

    {

    }

    for(i=0;i<75;i++)

    {

    }

    ms--; 

  }    

}

 

main()

{

  int i;

 

  // 将PD3设置成推挽输出,以便推动LED

  PD_DDR = 0x08;

  PD_CR1 = 0x08;             

  PD_CR2 = 0x00;

 

  // 启动外部高速晶体振荡器

  CLK_ECKR = 0x01;                   // 允许外部高速振荡器工作

  while((CLK_ECKR & 0x02) == 0x00);  // 等待外部高速振荡器准备好

              

  // 注意,复位后CPU的时钟源来自内部的RC振荡器

 

  for(;;)                     // 进入无限循环                             

  {

 

    // 下面将CPU的时钟源切换到外部的高速晶体振荡器上,在开发板上的频率为8MHZ

    // 通过发光二极管,可以看出,程序运行的速度确实明显提高了

    CLK_SWCR = CLK_SWCR | 0x02;    // SWEN <- 1

    CLK_SWR = 0xB4;                // 选择芯片外部的高速振荡器为主时钟

    while((CLK_SWCR & 0x08) == 0); // 等待切换成功

         

    CLK_SWCR = CLK_SWCR & 0xFD;    // 清除切换标志

 

    for(i=0;i<10;i++)              // LED高速闪烁10次

    {

      PD_ODR = 0x08;

      DelayMS(100);

      PD_ODR = 0x00;

      DelayMS(100);

    }

  

    // 下面将CPU的时钟源切换到内部的RC振荡器上,由于CLK_CKDIVR的复位值为0x18

    // 所以16MHZ的RC振荡器要经过8分频后才作为主时钟,因此频率为2MHZ

    // 通过发光二极管,可以看出,程序运行的速度确实明显下降了

    CLK_SWCR = CLK_SWCR | 0x02;    // SWEN <- 1

    CLK_SWR = 0xE1;                // 选择HSI为主时钟源

    while((CLK_SWCR & 0x08) == 0); // 等待切换成功

 

    CLK_SWCR = CLK_SWCR & 0xFD;    // 清除切换标志

 

    for(i=0;i<10;i++)              // LED低速闪烁10次

    {

      PD_ODR = 0x08;

      DelayMS(100);

      PD_ODR = 0x00;

      DelayMS(100);

    }

  }

}

关键字:stm8s  时钟源切换 引用地址:stm8s时钟源切换

上一篇:STM8 UART
下一篇:STC12C5A16S2双串口的使用

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

三分钟看懂stm8s单片机实现多通道转换
今天在使用stm8s单片机的AD功能,单片机上有AN0到AN9十个通道。想只用其中的三路AN5到AN7。 //ADC初始化 void ADC_Init(void) { ADC_CR1 = 0x50; ADC_CR2 = 0x38; ADC_TDRL = 0xE0;//禁止施密特触发 } unsigned int Read_ADC_Temp(unsigned channel) { unsigned int i,ADtemp; ADC_Init(); //ADC_CSR = 0x00; ADC_CSR = channel; ADC_CR1 = 0x01;// CR1寄存器的最低位置1,使能ADC转换 for(i = 0;i 《
[单片机]
三分钟看懂<font color='red'>stm8s</font>单片机实现多通道转换
STM8s(4) 外部中断EXTI初始化
其中中断 0,1,2,3,4 分别 对应端口 A,B,C,D,E // 中断初始化 void EXIT_Init(void) { PD_DDR &= 0 4; // 1 -- 输出;0 -- 输入 PD_CR1 |= 1 4; // 1 -- 上拉;0 -- 浮空 PD_CR2 |= 1 4; // 1 -- 外部中断开;0 -- 外部中断关 EXTI_CR1 |= 0x00; // 触发方式 EXTI_CR2 |= 0x00; // 触发方式 } asm( rim ); // 开总中断 // 中断服务函数 #pragma vector = EXTI3_vector __interrupt void
[单片机]
STM8S 三种时钟源的配置HSE\HSI\LSI的配置
1. 关于HSE的时钟配置为主时钟 static void CLK_Config(void) { CLK_DeInit(); // 初始化 CLK_HSECmd(ENABLE); //使能HSE CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); //切换HSE 并关闭其他时钟 为自动模式 /*Enable CSS interrupt */ CLK_ITConfig(CLK_IT_CSSD, ENABLE); /* Enab
[单片机]
<font color='red'>STM8S</font> 三种<font color='red'>时钟源</font>的配置HSE\HSI\LSI的配置
STM8S(105K4)使用笔记——活跃停机模式的配置与AWU唤醒
STM8S提供的可编程的电源管理 等待(Wait)模式: 通过WFI指令进入。该模式下CPU将停止运行,但外设与中断控制器仍保持运行。 该模式下可以通过外设时钟门控、降低CPU时钟频率、选择低功耗时钟源(LSI,HSI)进一步降低功耗。 在等待模式下,所有寄存器与RAM的内容不变,进入等待模式前所定义的时钟配置也不会在进入等待模式后改变。 当一个内部或外部中断产生时,CPU从等待模式唤醒并恢复工作。 停机(Halt)模式: 通过HALT指令进入。该模式下主时钟停止,即由fMASTER提供时钟的CPU及所有外设均被关闭。 该模式下可以通过关闭主电压调节器、进一步降低功耗。需注意,主电压调节器关闭后,仅LSI时
[单片机]
<font color='red'>STM8S</font>(105K4)使用笔记——活跃停机模式的配置与AWU唤醒
STM8S_004_UART基本收发数据
Ⅰ、写在前面 做软件开发的人都知道打印信息的重要,说到打印信息,我们就不得不说UART串口打印。做单片机开发的人,打印信息主要的来源就是UART串口打印。因此,关于UART相关的知识就比较重要。 printf、scanf这种标准的函数不只是可以在电脑上可以使用,在我们单片机上也同样可以使用,本文只讲述关于UART的基础知识,关于printf、scanf这一块后面将再次给大家整理一篇文章。 本文将结合“STM8S参考手册”和软件源代码给大家讲述关于UART的基础知识和用法。 为方便大家阅读,本文内容已经整理成PDF文件: http://pan.baidu.com/s/1i5uWhJR 作者:strongerHuan
[单片机]
STM8S_004_UART基本收发数据
STM8S定时器操作
综述 STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的 架构 。此共同的架构使得采用各个定时器设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。 本文只针对STM8S103该芯片进行介绍,该芯片的定时器个数为3个,每个类型的定时器都一个,分别为高级控制型(TIM1)、通用型(TIM2)、基本型定时器(TIM4)。 关于STM8S103手册的TIM简介 每个定时器的功能都有详细介绍,大家可以认真看下。 TIMx详细讲解 3.1 TIM1解析 TIM1_Prescaler    :即预分
[单片机]
STM8S单片机入门4(串口通讯及蓝牙模块的使用)
串口通讯具有悠久历史的,最基本、最简单的通讯方式,即使在当前这个注重移动和无线互联的时代,也少不了串口通讯的身影。比如对小数据量数据的无线传输,虽然物理链路用蓝牙或WIFI传输,但最后到单片机数据交互上,可能还是用了串口通讯。 STM8S系列单片机有1~3个通用异步收发器(UART)支来持串口通讯,在这个部分里,将以STM8S单片机通过蓝牙与智能手机通讯,实现一个echo功能(单片机将收到来自于手机的数据原样返回给手机),来讲解如何使用单片机的串口功能。 1、电路设计 电路采用一款蓝牙转串口的模块实现蓝牙通讯,这款蓝牙模块有四个引脚,VCC、GND、TXD、RXD,只要将模块的VCC、GND引脚与电源
[单片机]
<font color='red'>STM8S</font>单片机入门4(串口通讯及蓝牙模块的使用)
STM8S 定时器第一次使用时间不准确的问题
以前用定时器只是提供系统的5ms时基,并没有发现问题,最近做红外遥控器的解码,发现启动定时器TIM2后,第一次总是时间没到就触发中断了,之后也都正常了,也就是说问题出在刚配置好第一次使用的时候 由手册得知,定时器的预分频器PSCR并不是立即生效的,只有触发一次中断事件后,才会写入设定的分频值,系统也提供了EGR寄存器的UG位来主动软件触发中断事件,可以用来解决这个问题
[单片机]
<font color='red'>STM8S</font> 定时器第一次使用时间不准确的问题
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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