打印
[STM8]

切换HSE时钟切换不来

[复制链接]
518|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
supernan|  楼主 | 2020-6-3 21:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void InitCpuClock(void)
{
  CLK_CKDIVR |= 0x00;               // CPU 时钟分频 1,CPU时钟 = 外部时钟(即是外部晶振频率)
  CLK_ECKR_HSEON |= 1;                        // 允许外部高速振荡器工作
  while(!(CLK_ECKR & 0x02));              // 等待外部高速振荡器准备好                       
  CLK_SWCR = 0x02;                         // 使能切换
  CLK_SWR = 0x04;             // 选择芯片外部的高速振荡器为主时钟
  while((CLK_SWCR&0x08)==0);                  // 等待切换成功
  CLK_SWCR &= ~(CLK_SWCR_SWEN|CLK_SWCR_SWIF);       // 清除切换标志
}
这是我们时钟初始化,程序卡在  while((CLK_SWCR&0x08)==0);    这句了

使用特权

评论回复
沙发
renyaq| | 2020-6-3 21:16 | 只看该作者
网上找的,你看看是不是这个原因。

使用特权

评论回复
板凳
renyaq| | 2020-6-3 21:19 | 只看该作者

这里有几个时钟,就是图中标识的时钟,需要弄清楚一下:

fHSE: 外部高速晶振时钟,它是由外部晶振产生,大小由外部晶振大小决定,STM8S的外部晶振范围:1-24M,看图中的”HSE OSC 1-24M“。

fHSI:内部RC高速时钟,它是由内部的RC震荡电路产生的,其值16M。但是可以经过后面的分频器分频,四个分频系数可供选择(1,2,4,8)。注:精准度比外部晶振的要稍差一些。

fMASTER:主时钟,它是由HSE 或者 HSI提供时钟,主要功能给外围设备(peripherals,如I2C,SPI,ADC等)提供时钟,还有给CPU提供时钟源。

fCPU:cpu时钟,它是由fMASTER经过分频得到,其作用就是给CPU提供时钟,一个机械周期就是一个fCPU的时钟周期。

下面是时钟的源码部分,可供大家参考。
这里写了四段程序,分别是:

使用高速内部时钟(寄存器版)

使用高速内部时钟(库函数版)

使用外部时钟(寄存器版)

使用外部时钟(库函数版)

源码如下,看注释应该就可以了。

/*******************************************************************************
* 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}

使用特权

评论回复
地板
ousj| | 2020-6-3 21:22 | 只看该作者

这里的CLK_SWR和CLK_SWC设置R好像有点问题,改一下看看
CLK_SWR   =    0XB4;         
while(!(CLK_SWCR&0X8));  
CLK_SWCR |=    0X2;

使用特权

评论回复
5
guoyt| | 2020-6-3 21:27 | 只看该作者
手动切换的话:
先选择欲做为系统时钟的时钟源【操作CLK_SWR】;
然后,开启HSE,直到其稳定下来后,
使能时钟切换【操作CLK_SWCR的swen位】;
直至SWBSY位清0即完成;

使用特权

评论回复
6
wangpe| | 2020-6-3 21:33 | 只看该作者

不知道这个好实现不啊

使用特权

评论回复
7
zhanglli| | 2020-6-3 21:37 | 只看该作者
hot stock:
STM8S003F3P6    50K
STM8S003F3U6    30K
STM8S005K6T6    12K
STM8S103F3P6    9K
STM8S903K3T6C  6K
TEL:15625290621

使用特权

评论回复
8
yufe| | 2020-6-3 21:40 | 只看该作者
弄好了没

使用特权

评论回复
9
chenho| | 2020-6-3 21:43 | 只看该作者

先配置好,然后切换。配置不好的时候别切

使用特权

评论回复
10
supernan|  楼主 | 2020-6-3 21:49 | 只看该作者

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

730

主题

10412

帖子

6

粉丝