找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6881|回复: 0
打印 上一主题 下一主题
收起左侧

STM8L时钟切换详解

[复制链接]
跳转到指定楼层
楼主
ID:140343 发表于 2016-10-10 00:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SMT8L的四大时钟源LSELSIHSEHSI,都可以作为系统时钟。


系统上电后,HSI/8作为默认系统时钟,启动完成后,用户可以切换系统时钟源。
切换分为自动切换和手动切换,没有太大的区别。
下面是自动切换的流程图,按照此流程图,编写程序,即可实现时钟切换。
只需要三步即可实现系统时钟切换:
①置位CLK_SWCR寄存器中的SWEN位,允许时钟切换
②向CLK_SWR中写数据,选择目标时钟源
③等待SWBSY清零,即等待时钟切换完成


时钟切换完成后,在主循环中翻转IO电平,通过测量IO口的输出频率,可以直观的看到切换时钟,系统时钟频率发生了变化。
本程序选择LSE32.768KHz)作为系统时钟,时钟切换完成后,PC7翻转电平,使用逻辑分析可以测量到此时PC7的输出频率。如下图:


可以看到PC7输出频率为2.73KHz,并不是32.768KHz。这是因为,STM8L一个指令周期为二个时钟周期,同时翻转电平的程序,高电平时间需要3个指令周期,低电平时间同样为3个指令周期。所以最终测量到的IO输出频率为32.768KHz/2/6=2.730667KHz。如果选择的时钟源为16M(HSI),则最终测得的IO输出频率为16M/2/6=1.33M。要注意,系统时钟的分频器默认8分频,需要清零分频器,才满足此计算方式。
#include"iostm8l152c6.h"
/****************************************************************************************
*开发环境:IAR for stm8v6.5
*硬件平台:STM8L-DISCOVERY
*功能说明:本程序选择LSE32.768KHz)作为系统时钟,时钟切换完成后,PC7翻转电平,使用逻辑分析可以测量到此时PC7的输出频率,最终测量到的IO输出频率为32.768KHz/2/6=2.730667KHz。
*    者:茗风
****************************************************************************************/
/******************************************************************************************************
*      称:voidGPIO_Init(void)
*      能:初始化PC7为高速推挽输出
*  入口参数:无
*  出口参数:无
*      明:测量系统时钟频率的IO,测量到的频率是:目标时钟源/2/6
*      例:无
******************************************************************************************************/
void GPIO_Init(void)
{
  PC_CR1_C17  =1;//推挽输出
  PC_CR2_C27  =1;//高速输出
  PC_DDR_DDR7 =1;//PC4输出
//  PC_ODR_ODR7 =0;//输出低电平
}
/******************************************************************************************************
*      称:voidCLOCK_Init(void)
*      能:系统时钟切换为LSE32.768KHz
*  入口参数:无
*  出口参数:无
*      明:
*      例:无
******************************************************************************************************/
void CLOCK_Init(void)
{
  CLK_CKDIVR =0x00;//CLK_CKDIVR寄存器默认0x03分频值为8
//自动切换
  CLK_SWCR_SWEN =1;//允许切换时钟
  CLK_SWR =0x08;//写入一个八位的值,用于选择目标时钟源
  while(CLK_SWCR_SWBSY);//等待时钟切换完成
//手动切换
//  CLK_SWR =0x08;//写入一个八位的值,用于选择目标时钟源
//  while(!CLK_ECKR_LSERDY);//等待目标时钟源稳定
//  CLK_SWCR_SWEN =1;//允许切换时钟
  /*
*0x01HSI selected as system clock source
*0x02LSI selected as system clock source
*0x04HSE selected as system clock source
*0x08LSE selected as system clock source
  */
}
/******************************************************************************************************
*      称:int main(void)
*      能:通过PC4输出选择的时钟
*  入口参数:无
*  出口参数:无
*      明:因为STM8l discovery没有接外部高速晶振,所以没办法输出HSE,不要
*      例:无
******************************************************************************************************/
void main( void )
{
GPIO_Init();
CLOCK_Init();
while(1)
  {
    PC_ODR_ODR7 ^=1;
  }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表