[STM8]

系统时钟切换

[复制链接]
556|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)) ;

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

使用特权

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

使用特权

评论回复
yinxiangh| | 2020-1-20 21:56 | 显示全部楼层

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

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

使用特权

评论回复
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
}

使用特权

评论回复
huwr|  楼主 | 2020-1-20 22:07 | 显示全部楼层
作为时钟源的话,这个位不能够被清零,所以有这个判断

使用特权

评论回复
huwr|  楼主 | 2020-1-20 22:11 | 显示全部楼层
这个代码也不行,复制过去后串口定时器什么的直接就不运行

使用特权

评论回复
kangzj| | 2020-1-20 22:14 | 显示全部楼层
你的问题不在于HSI且环保LSI是否成功,而在于LSI主频31K跑不动。

使用特权

评论回复
kangzj| | 2020-1-20 22:16 | 显示全部楼层
LSI是RTC的时钟源,你作为系统主时钟,问题会很多很多。

使用特权

评论回复
llia| | 2020-1-20 22:18 | 显示全部楼层
放弃吧。

使用特权

评论回复
huwr|  楼主 | 2020-1-20 22:25 | 显示全部楼层
可以执行的,就是4楼我说的问题

使用特权

评论回复
langgq| | 2020-1-20 22:27 | 显示全部楼层
很好奇,你HSI下定时器串口工作是否正常。

使用特权

评论回复
zhanglli| | 2020-1-20 22:31 | 显示全部楼层
时钟切换到LSI主频不一样了,你定时器、串口有没有重新配置过呢

使用特权

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

使用特权

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

使用特权

评论回复
huwr|  楼主 | 2020-1-20 22:40 | 显示全部楼层
直接调用的库函数,应该不需要配置吧

使用特权

评论回复
tian111| | 2020-1-20 22:42 | 显示全部楼层
LSI下设备没法工作。

使用特权

评论回复
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

粉丝