打印
[STM8]

STM8l15x系统时钟切换

[复制链接]
3150|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dipingzhu|  楼主 | 2015-7-28 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dipingzhu 于 2015-7-28 11:22 编辑

STM8l15x 切换系统时钟到LSI,结果切换后串口,定时器,AD转换等都不能执行,不知道是不是没有切换成功,仿真也不能执行,代码如下:
  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI);
  
  CLK_SYSCLKSourceSwitchCmd(ENABLE);
  
  while (((CLK->SWCR)& 0x01)==0x01);
  
  CLK_HSICmd(DISABLE);
沙发
dipingzhu|  楼主 | 2015-7-28 13:32 | 只看该作者
各位大神求帮忙啊

使用特权

评论回复
板凳
mark0668| | 2015-7-28 14:53 | 只看该作者
    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)) ;

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

使用特权

评论回复
地板
dipingzhu|  楼主 | 2015-7-28 16:01 | 只看该作者
本帖最后由 dipingzhu 于 2015-7-28 16:05 编辑
mark0668 发表于 2015-7-28 14:53
CLK_CKDIVR = 0;    //1分频    这里要为0不然出错,不知为何.
    CLK_ICKCR |= 4;
    while(!(CLK_IC ...

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

  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;)程序就不能执行了!,这是怎么回事

使用特权

评论回复
5
mark0668| | 2015-7-28 16:41 | 只看该作者
while(((CLK->ICKCR)&0x04) != 0x04);//等待LSI稳定

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

使用特权

评论回复
6
donsbin| | 2015-7-28 17:51 | 只看该作者

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
}

使用特权

评论回复
7
dipingzhu|  楼主 | 2015-7-28 18:11 | 只看该作者
mark0668 发表于 2015-7-28 16:41
while(((CLK->ICKCR)&0x04) != 0x04);//等待LSI稳定

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

作为时钟源的话,这个位不能够被清零,所以有这个判断

使用特权

评论回复
8
dipingzhu|  楼主 | 2015-7-28 18:12 | 只看该作者

这个代码也不行,复制过去后串口定时器什么的直接就不运行

使用特权

评论回复
9
我是土匪| | 2015-7-28 18:14 | 只看该作者
你的问题不在于HSI且环保LSI是否成功,而在于LSI主频31K跑不动。
LSI是RTC的时钟源,你作为系统主时钟,问题会很多很多。

放弃吧。

使用特权

评论回复
10
dipingzhu|  楼主 | 2015-7-28 18:38 | 只看该作者
我是土匪 发表于 2015-7-28 18:14
你的问题不在于HSI且环保LSI是否成功,而在于LSI主频31K跑不动。
LSI是RTC的时钟源,你作为系统主时钟,问 ...

可以执行的,就是4楼我说的问题

使用特权

评论回复
11
donsbin| | 2015-7-28 18:45 | 只看该作者
dipingzhu 发表于 2015-7-28 18:12
这个代码也不行,复制过去后串口定时器什么的直接就不运行

很好奇,你HSI下定时器串口工作是否正常。
时钟切换到LSI主频不一样了,你定时器、串口有没有重新配置过呢

使用特权

评论回复
12
dipingzhu|  楼主 | 2015-7-28 19:01 | 只看该作者
donsbin 发表于 2015-7-28 18:45
很好奇,你HSI下定时器串口工作是否正常。
时钟切换到LSI主频不一样了,你定时器、串口有没有重新配置过 ...

也就是定时周期改变了,其他的配置没什么影响吧,先把LSI调好了,其他就简单了

使用特权

评论回复
13
huangqi412| | 2015-7-28 19:13 | 只看该作者
时钟变了,你串口波特率得重新配置。   AD模块不知道能不能用低频时钟源,得看看手册。

使用特权

评论回复
14
dipingzhu|  楼主 | 2015-7-28 19:22 | 只看该作者
huangqi412 发表于 2015-7-28 19:13
时钟变了,你串口波特率得重新配置。   AD模块不知道能不能用低频时钟源,得看看手册。
...

直接调用的库函数,应该不需要配置吧

使用特权

评论回复
15
我是土匪| | 2015-7-28 19:44 | 只看该作者
LSI下设备没法工作。

使用特权

评论回复
16
dipingzhu|  楼主 | 2015-7-28 20:06 | 只看该作者
我是土匪 发表于 2015-7-28 19:44
LSI下设备没法工作。

那为什么这段代码可以执行:

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时钟

使用特权

评论回复
17
donsbin| | 2015-7-28 20:26 | 只看该作者
dipingzhu 发表于 2015-7-28 19:01
也就是定时周期改变了,其他的配置没什么影响吧,先把LSI调好了,其他就简单了 ...

LZ何不尝试外部接个32.768K低速晶振,时钟切换到LSE

使用特权

评论回复
18
dipingzhu|  楼主 | 2015-7-28 20:34 | 只看该作者
donsbin 发表于 2015-7-28 20:26
LZ何不尝试外部接个32.768K低速晶振,时钟切换到LSE

正因为没接外部时钟,所以需要内部LSI时钟,以实现低功耗配置

使用特权

评论回复
19
598330983| | 2015-7-28 22:42 | 只看该作者
在于LSI主频31K跑不动

使用特权

评论回复
20
dipingzhu|  楼主 | 2015-7-29 08:46 | 只看该作者
598330983 发表于 2015-7-28 22:42
在于LSI主频31K跑不动

LSI主频38K跑动了,看16楼

使用特权

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

本版积分规则

6

主题

45

帖子

1

粉丝