打印
[STM8]

系统时钟切换

[复制链接]
997|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huwr|  楼主 | 2020-1-20 21:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8l15x 切换系统时钟到LSI,结果切换后串口,定时器,AD转换等都不能执行,不知道是不是没有切换成功,仿真也不能执行

使用特权

评论回复
沙发
supernan| | 2020-1-20 21:40 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
huwr|  楼主 | 2020-1-20 21:44 | 只看该作者

  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI);
  
  CLK_SYSCLKSourceSwitchCmd(ENABLE);
  
  while (((CLK->SWCR)& 0x01)==0x01);
  
  CLK_HSICmd(DISABLE);

使用特权

评论回复
地板
liuzaiy| | 2020-1-20 21:47 | 只看该作者
CLK_CKDIVR = 0;    //1分频    这里要为0不然出错,不知为何.
    CLK_ICKCR |= 4;
    while(!(CLK_ICKCR & 0x08));         //等待外部LSI 准备好  
    CLK_SWCR = 2;  //Enable clock switch execution.
    CLK_SWR = 0x02;  //Select LSI as system clock source  
    while (0x02 != (CLK_SCSR)) ;

这代码是可以成功切换,至于那些能不能执行不知了.

使用特权

评论回复
5
huwr|  楼主 | 2020-1-20 21:52 | 只看该作者

不行,不过我找到了,但是功耗太大了,而且串口定时器什么的都不工作了这是代码:

  CLK->CKDIVR = 0x00;//系统时钟不分频
           
  CLK->ICKCR = 0x04;//启动LSI
  
  while(((CLK->ICKCR)&0x04) != 0x04);//等待LSI稳定
  
  CLK->SWR = 0x02;//切换LSI为时钟源
  
  //CLK_SYSCLKSourceSwitchCmd(ENABLE);//允许时钟切换
  
  CLK->SWCR = 0x02;//允许时钟切换
  
  while(((CLK->SCSR)& 0x02) == 0x02);//等待LSI切换为系统时钟源
  
  CLK->SWCR = 0x00;//关闭时钟切换
  
  CLK->ICKCR &= (uint8_t)(~0x01);//关闭HSI时钟

上述代码能执行,但是功耗太大,并且把这句“CLK->SWCR = 0x02;”改成(CLK->SWCR |= 0x02;)程序就不能执行了!,这是怎么回事

使用特权

评论回复
6
yinxiangh| | 2020-1-20 21:56 | 只看该作者

while(((CLK->ICKCR)&0x04) != 0x04);//等待LSI稳定

这里什么意思你知道吗?看手册

使用特权

评论回复
7
chenjunt| | 2020-1-20 22:02 | 只看该作者

void HSI_LSI(void)
{
  CLK_LSICmd(ENABLE);                          //目标CLK 先开启
  while (((CLK->ICKCR)& 0x08)!=0x08);           //等待目标CLK稳定
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);         
  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI);
  CLK_SYSCLKSourceSwitchCmd(ENABLE);            //CLK 切换
  CLK->SWCR |=0X01;                             //使能切换中断
  while (((CLK->SWCR)& 0x01)==0x01);            //等待切换后的CLK稳定
  CLK->SWCR &=0X00;
  CLK_LSEConfig(CLK_HSI_OFF);                  //关闭原先的 CLK source
}

使用特权

评论回复
8
huwr|  楼主 | 2020-1-20 22:07 | 只看该作者
作为时钟源的话,这个位不能够被清零,所以有这个判断

使用特权

评论回复
9
huwr|  楼主 | 2020-1-20 22:11 | 只看该作者
这个代码也不行,复制过去后串口定时器什么的直接就不运行

使用特权

评论回复
10
kangzj| | 2020-1-20 22:14 | 只看该作者
你的问题不在于HSI且环保LSI是否成功,而在于LSI主频31K跑不动。

使用特权

评论回复
11
kangzj| | 2020-1-20 22:16 | 只看该作者
LSI是RTC的时钟源,你作为系统主时钟,问题会很多很多。

使用特权

评论回复
12
llia| | 2020-1-20 22:18 | 只看该作者
放弃吧。

使用特权

评论回复
13
huwr|  楼主 | 2020-1-20 22:25 | 只看该作者
可以执行的,就是4楼我说的问题

使用特权

评论回复
14
langgq| | 2020-1-20 22:27 | 只看该作者
很好奇,你HSI下定时器串口工作是否正常。

使用特权

评论回复
15
zhanglli| | 2020-1-20 22:31 | 只看该作者
时钟切换到LSI主频不一样了,你定时器、串口有没有重新配置过呢

使用特权

评论回复
16
huwr|  楼主 | 2020-1-20 22:34 | 只看该作者
也就是定时周期改变了,其他的配置没什么影响吧,先把LSI调好了,其他就简单了

使用特权

评论回复
17
huanghuac| | 2020-1-20 22:38 | 只看该作者
时钟变了,你串口波特率得重新配置。   AD模块不知道能不能用低频时钟源,得看看手册。

使用特权

评论回复
18
huwr|  楼主 | 2020-1-20 22:40 | 只看该作者
直接调用的库函数,应该不需要配置吧

使用特权

评论回复
19
tian111| | 2020-1-20 22:42 | 只看该作者
LSI下设备没法工作。

使用特权

评论回复
20
huwr|  楼主 | 2020-1-20 22:46 | 只看该作者
那为什么这段代码可以执行:

CLK->CKDIVR = 0x00;//系统时钟不分频
         
CLK->ICKCR = 0x04;//启动LSI

while(((CLK->ICKCR)&0x04) != 0x04);//等待LSI稳定

CLK->SWR = 0x02;//切换LSI为时钟源

//CLK_SYSCLKSourceSwitchCmd(ENABLE);//允许时钟切换

CLK->SWCR = 0x02;//允许时钟切换

while(((CLK->SCSR)& 0x02) == 0x02);//等待LSI切换为系统时钟源

CLK->SWCR = 0x00;//关闭时钟切换

CLK->ICKCR &= (uint8_t)(~0x01);//关闭HSI时钟

使用特权

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

本版积分规则

780

主题

8627

帖子

5

粉丝