【单片机】[STM8] | 您所在的位置:网站首页 › stm8s003与stm8s103区别 › 【单片机】[STM8] |
STM8S103K3: 外部时钟 + 内部时钟 的切换。 首先看一下 STM8S103K3 的时钟结构图,可以帮助你很好的理解。 下面是时钟的源码部分,可供大家参考。 这里写了四段程序,分别是: 使用高速内部时钟(寄存器版)使用高速内部时钟(库函数版)使用外部时钟(寄存器版)使用外部时钟(库函数版)源码如下,看注释应该就可以了。 /******************************************************************************* * Function Name : InitCpuClock. * Description : Initial CPU clock, . * Input : None. * Output : None. * Return : None. *******************************************************************************/ static void InitCpuClock(void) { #if 1 // 寄存器版本 - 使用高速内部时钟 //Use HSI @8MHZ, div = 2; 8=16/2 CLK->ECKR &= ~CLK_ECKR_HSEEN; // 失能外时钟 CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV); // 清零内部时钟预分频 CLK->CKDIVR |= CLK_PRESCALER_HSIDIV2; // 设置内部时钟预分频 2; 具体可以参考数据手册 (reference manual) CLK->ICKR |= CLK_ICKR_HSIEN; // 使能内部高速时钟 while(!(CLK->ICKR&CLK_ICKR_HSIRDY)); // 等待内部高速时钟稳定, 稳定后则内部时钟已经开跑了。 时钟 = 16/2 M #endif #if 0 // 库函数版本 - 使用内部高速时钟 //Use HSI @8MHZ, div = 2; 8=16/2 CLK_HSECmd(DISABLE); // 失能外时钟 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2); // 设置内部时钟预分频 2; 具体可以参考数据手册 (reference manual) CLK_HSICmd(ENABLE); // 使能内部高速时钟 while(!(CLK->ICKR&CLK_ICKR_HSIRDY)); // 等待内部高速时钟稳定, 稳定后则内部时钟已经开跑了。 时钟 = 16/2 M #endif #if 0 // 寄存器版本 - 使用外部时钟 CLK->CKDIVR |= CLK_PRESCALER_CPUDIV1; // CPU 时钟分频 1,CPU时钟 = 外部时钟(即是外部晶振频率) CLK->ECKR |= CLK_ECKR_HSEEN; // 允许外部高速振荡器工作 while(!(CLK->ECKR & CLK_ECKR_HSERDY)); // 等待外部高速振荡器准备好 CLK->SWCR |= CLK_SWCR_SWEN; // 使能切换 CLK->SWR = CLK_SOURCE_HSE; // 选择芯片外部的高速振荡器为主时钟 while(!(CLK->SWCR&CLK_SWCR_SWIF)); // 等待切换成功 CLK->SWCR &= ~(CLK_SWCR_SWEN|CLK_SWCR_SWIF); // 清除切换标志 #endif #if 0 // 库函数版本 - 使用外部时钟 CLK->CKDIVR |= CLK_PRESCALER_CPUDIV1; // CPU 时钟分频 1,CPU时钟 = 外部时钟(即是外部晶振频率) CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, // 时钟自动切换模式,注: 参数是自动切换,不然只使用这一个函数是不能切换成功的 CLK_SOURCE_HSE, // 要切换的时钟(这里是外部时钟) DISABLE, // 是否使能切换完成中断(这里失能) CLK_CURRENTCLOCKSTATE_ENABLE);// 是否还使能当前时钟(这里选择 关掉当前时钟HSI) CLK->SWCR &= ~(CLK_SWCR_SWEN|CLK_SWCR_SWIF); // 清除切换标志 #endif }pillar peng 2016.4.29 11:51 |
CopyRight 2018-2019 实验室设备网 版权所有 |