历史上的今天
返回首页

历史上的今天

今天是:2025年02月25日(星期二)

正在发生

2020年02月25日 | STM8 时钟切换

2020-02-25 来源:eefocus

HSE、HSI、LSI 都可以作为系统主时钟源,STM8 单片机复位以后默认 HSI 的 8 分频作为系统主时钟,其原因是 HSI 稳定时间短,而其 8 分频又可以保证系统在较差的 VDD 条件下安全启动。在系统运行的过程中可以切换系统的主时钟源。系统时钟源的切换有 2 种方式:自动切换、手动切换。


自动切换可以使用最少的指令来完成主时钟源的切换,用户程序可以处理其他事物而不用关心确切的切换时间;手动切换在硬件准备好之后不立即切换,允许用户精确的控制切换发生的时间。


自动切换的步骤为:

1.设置切换控制寄存器 CLK_SWCR 中的 SWEN 位,使能时钟切换。


2.设置主时钟切换寄存器 CLK_SWR,选择目标时钟源。切换控制寄存器中的切换忙标志位 SWBSY被硬件置位,目标时钟源启动,原时钟源依旧驱动内核和外设。一旦目标时钟源稳定,主时钟切换寄存器 CLK_SWR 中的值将被复制到主时钟状态寄存器 CLK_CMSR 中。此时,SWBSY 位被硬件清零,目标时钟源替代原时钟源,CLK_SWCR 寄存器中的时钟切换中断标志位 SWIF 被硬件置位,如此时钟切换中断被使能,则会产生中断。


手动切换的步骤为:

1.设置主时钟切换寄存器 CLK_SWR,选择目标时钟源。SWBSY 位会被硬件置位,目标时钟源启动,原时钟源依然驱动内核和外设。


2.用户程序通过读取 CLK_SWCR 寄存器的 SWIF 位来等待目标时钟源准备就绪,SWIF 为 1 时代表目标时钟源准备就绪。如果时钟切换被使能,SWIF 被硬件置位时将触发中断。


3.如果目标时钟源准备就绪,则用户程序在预期的时间点将 CLK_SWCR 寄存器的 SWEN 位置位来进行时钟切换。


通过判断 SWIF 位可以判断时钟切换是否完成,通过读取 CLK_CMSR 寄存器可以得知当前的系统主时钟源。切换完成之后要写 SWIF 位为 0 你来清零此标志。


不管是自动切换还是手动切换,如果原时钟源在切换后仍然被其他模块使用,则原时钟源不会被自动关闭,需要通过配置内部时钟寄存器 CLK_ICKR 或外部时钟寄存器 CLK_ECKR 来关闭。


如果时钟切换没有成功,可以通过软件清零 SWBSY 位来复位当前切换,使 CLK_SWR 恢复原时钟源。


使用寄存器来切换时钟


自动切换和手动切换的流程图对比如图所示。


下面我们通过实例来掌握 STM8S 时钟切换的操作。本章节的实例设想开发板的 LED 分别在系统主时钟为 HSI/8、HSI、HSE/16、LSI 的时候各闪烁 5 次,系统主时钟的切换分别采用自动切换和手动切换,通过实验现象即可判断系统时钟切换是否成功。

在这里插入图片描述

void main( void )

{

unsigned char i;

InitLED();

//HSI 做主时钟源

//复位后默认主时钟为 16M/8=2M

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

{

PC_ODR=(0<<3);//PC_ODR 第 3 位清零,输出低电平

PE_ODR&=0xFE; //PE_ODR 第 0 位清零,输出低电平

PD_ODR&=0xF7;//PD_ODR 第 3 位清零,输出低电平

Delay(50000); //延时

PC_ODR=(1<<3);//PC_ODR 第 3 位置位,输出高电平

PE_ODR|=0x01; //PE_ODR 第 0 位置位,输出高电平

PD_ODR|=0x08;//PD_ODR 第 3 位清零,输出低电平

Delay(50000); //延时

}

CLK_CKDIVR=0x00;//HSI 不分频,主时钟 16M

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

{

PC_ODR=(0<<3);//PC_ODR 第 3 位清零,输出低电平

PE_ODR&=0xFE; //PE_ODR 第 0 位清零,输出低电平

PD_ODR&=0xF7;//PD_ODR 第 3 位清零,输出低电平

Delay(50000); //延时

PC_ODR=(1<<3);//PC_ODR 第 3 位置位,输出高电平

PE_ODR|=0x01; //PE_ODR 第 0 位置位,输出高电平

PD_ODR|=0x08;//PD_ODR 第 3 位清零,输出低电平

Delay(50000); //延时

}

//HSE 做主时钟源,自动时钟切换

CLK_SWCR|=0x02;//时钟切换启动,SWEN=1

CLK_SWR=0xB4; //选择目标时钟源,0xB4=HSE

while((CLK_SWCR&0x08)==0);//等待切换时间发生,此时 SWIF=1

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

if(CLK_CMSR==0xB4)//判断主时钟源是否为 HSE

{

CLK_CKDIVR=0x04; //CPU 时钟频率为主时钟源 16 分频

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

{

PC_ODR=(0<<3);//PC_ODR 第 3 位清零,输出低电平

PE_ODR&=0xFE; //PE_ODR 第 0 位清零,输出低电平

PD_ODR&=0xF7;//PD_ODR 第 3 位清零,输出低电平

Delay(50000); //延时

PC_ODR=(1<<3);//PC_ODR 第 3 位置位,输出高电平

PE_ODR|=0x01; //PE_ODR 第 0 位置位,输出高电平

PD_ODR|=0x08;//PD_ODR 第 3 位清零,输出低电平

Delay(50000); //延时

}

}

//LSI 做主时钟源,手动时钟切换,请先在选项字节中使能 LSI

CLK_SWR=0xD2;//选择目标时钟源,0xD2=LSI

while((CLK_SWCR&0x08)==0);//等待目标时钟源准备就绪,此时 SWIF=1

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

CLK_SWCR|=0x02;//进行切换

if(CLK_CMSR==0xD2)

{

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

{

PC_ODR=(0<<3);//PC_ODR 第 3 位清零,输出低电平

PE_ODR&=0xFE; //PE_ODR 第 0 位清零,输出低电平

PD_ODR&=0xF7;//PD_ODR 第 3 位清零,输出低电平

Delay(300); //延时

PC_ODR=(1<<3);//PC_ODR 第 3 位置位,输出高电平

PE_ODR|=0x01; //PE_ODR 第 0 位置位,输出高电平

PD_ODR|=0x08;//PD_ODR 第 3 位清零,输出低电平

Delay(300); //延时

}

}

while(1)

{

}

}

void InitLED(void)

{

PC_DDR|=0x08;//设置 PC3 为输出模式

PC_CR1|=0x08;//设置 PC3 为推挽输出

PC_CR2|=0x00;//设置 PC3 为 10MHz 快速输出

PE_DDR|=0x01;//设置 PE0 为输出模式

PE_CR1|=0x01;//设置 PE0 为推挽输出

PE_CR2|=0x00;//设置 PE0 为 10MHz 快速输出

PD_DDR|=0x08;//设置 PD3 为输出模式

PD_CR1|=0x08;//设置 PD3 为推挽输出

PD_CR2|=0x00;//设置 PD3 为 10MHz 快速输出

}


  InitLED();函数为 LED 初始化函数,与前面章节的代码相同。


  首先 HSI 做系统主时钟。系统复位后默认 HSI/8=2M 为系统主时钟;接着,通过修改 CLK_CKDIVR寄存器,使 HSI 不分频作为系统主时钟。


  系统主时钟由 HSI 切换至 HSE 是通过自动切换方式实现的。首先置位 SWEN 位以启动时钟切换;然后设置 CLK_SWR 寄存器以选择目标时钟源为 HSE;通过读取 SWIF 位的值来判断系统时钟切换是否完成,如果 SWIF 为 1 则表示转换完成;转换完成之后要通过软件来写入 0 来清标志位 SWIF。


  系统主时钟由 HSE 切换至 LSI 是通过手动切换的方式实现的。在编写程序之前需要先修改选项字节OPTION BYTE 以使能 LSI;程序中先设置 CLK_SWR 寄存器以选择目标时钟源为 LSI;通过读取 SWIF的值等待至 LSI 就绪之后清除 SWIF 位,接着置位 SWEN 位启动转换。


  可以通过读取 CLK_CMSR 寄存器查看当前系统时钟源是否为预设的目标时钟源。


  实验现象为 LED 以 4 种不同的频率闪烁,与预期的实验效果相符。

上一篇:STM8L151 DAC

下一篇:STM8L之RTC

推荐阅读

史海拾趣

EM Devices Corporation公司的发展小趣事

EM Devices Corporation始终将产品质量放在首位。公司建立了一套严格的质量管理体系,对生产过程中的每一个环节都进行严格的监控和检测。同时,公司还不断引入先进的生产设备和工艺,提高产品的生产效率和质量。此外,公司还鼓励员工提出改进意见和建议,以便及时发现并解决问题。这种持续改进的精神使得EM Devices Corporation的产品在市场上始终保持着良好的口碑。

Crydom公司的发展小趣事

作为一家有社会责任感的企业,EM Devices Corporation不仅关注自身的经济效益,还积极履行社会责任。公司严格遵守环保法规,采取了一系列环保措施,减少生产过程中的污染排放。此外,公司还积极参与公益事业,为社会做出了积极的贡献。这种可持续发展的理念为公司赢得了广泛的社会赞誉和尊重。

AOS公司的发展小趣事

随着技术的不断发展和市场的扩大,AOS公司开始积极寻求全球扩张的机会。1998年,AOS在南京独资成立了中国总部,开始了其在中国的深耕之旅。通过多年的努力,AOS在中国建立了完善的产研基地和销售网络,其产品横跨家用和商用两大领域,赢得了广大消费者的信任和喜爱。如今,AOS已成为中国市场上备受推崇的热水设备品牌之一。

Elite Semiconductor Products Inc公司的发展小趣事

在电子产品领域,品质是赢得消费者信任的关键。Elite深知这一点,因此在生产过程中严格把控每一个环节,确保产品的品质达到最高标准。公司建立了完善的质量管理体系,从原材料采购到生产流程,再到产品检验,都严格遵循国际标准和行业规范。这种对品质的坚持,让Elite的产品在市场上赢得了良好的口碑,也为公司赢得了众多合作伙伴的信任。

振宝佳(DMBJ)公司的发展小趣事

随着电子产业的不断发展,SMT贴片技术逐渐成为电子信息产业的支柱技术之一。振宝佳公司紧跟时代步伐,在网络、通信、军事、工业控制以及汽车电子、家电等所有电子领域里全部采用了SMT贴片技术。这一技术的应用不仅提高了产品的集成度和可靠性,也为客户提供了更加优质的产品和服务。

Edcon Components Netherlands Cv公司的发展小趣事

Edcon Components Netherlands Cv自成立之初,就深知技术创新是企业生存和发展的关键。在电子行业飞速发展的背景下,公司投入大量资源进行研发,成功推出了一系列高性能、低成本的电子元器件。这些产品不仅满足了市场对高质量电子产品的需求,还为公司赢得了良好的口碑。随着技术的不断迭代更新,Edcon逐渐在电子元器件市场占据了重要地位。

问答坊 | AI 解惑

Atmel推出高度整合的汽车驱动器IC ATA6026

5月2日讯,Atmel宣布推出高度整合的 ATA6026 汽车驱动器集成电路 (IC),这是新的即将推出的汽车驱动器家族的首个成员。ATA6026 的设计基于 Atmel 高压 BCDMOS 制程,是应用于严苛环境的理想之选。归因于优化的通信接口,该集成电路非常适合大容 ...…

查看全部问答>

招聘硬件开发工程师

本公司提供良好发展机会和平台 我公司是一家主营一卡通智能管理系统、智能卡机具、热工仪表三大类产品,集研发、生产、销售、工程安装维护等全套工程实施,具有雄厚技术、销售实力的民营企业。 公司于2003年11月取得ISO9001认证;2005年8月,被杭 ...…

查看全部问答>

电源技术

电源作为所有用电设备及电气控制器的能量提供单元,它的种类和规格较多,不同的用电设备及电气控制器所使用的电源种类和规格一般不同………

查看全部问答>

ARM,DSP,FPGA,CPLD,SOPC,SOC之间的联系和区别

arm是一种嵌入式芯片,比单片机功能强,可以针对需要增加外设。类似于通用cpu,但是不包括桌面计算机。 DSP主要用来计算,计算功能很强悍,一般嵌入式芯片用来控制,而DSP用来计算,譬如一般手机有一个arm芯片,主要用来跑界面,应用程序,DSP可能 ...…

查看全部问答>

求个单片机控制4个继电器电路

大家好: 我想做个用1个开关控制4路输出(4个继电器)的电路。先谢谢了。 工作原理: 1。 当第1次按下开关,第1个继电器工作并保持。 2。 当第2次按下开关,第2个继电器工作并保持。第1个继电器继开。 以此类推,直到第4个继电器工件保持。第3 ...…

查看全部问答>

圣诞快乐,散分开始。。。。。

呵呵,圣诞到了,散点分,大家一起乐和乐和。。。。。…

查看全部问答>

error:undefined symbol ARMTargetStart!

在ads中编译程序提示错误:error:undefined symbol ARMTargetStart! 应该如何解决这个问题?…

查看全部问答>

这个程序为什么不能正常运行啊??

#include char rrc(char a,n)                                        //循环右移子程序 {         char b,c; & ...…

查看全部问答>

求教:捕捉不稳定的问题怎么解决!!

用DSP2812的捕捉口来捕捉过零点检测,但是捕捉到的脉冲信号不稳定,过零点后的脉冲方波已经加了低通滤波器和施密特触发器了,但是DSP捕捉到的信号仍不稳定怎么办啊!!!…

查看全部问答>

好东东STM32 固件函数库详细文件

分享下固件库提供的好用函数说明  …

查看全部问答>