你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm8s halt自唤醒 长时间搁置 Timer出错

[复制链接]
naruto2323 提问时间:2016-11-22 09:45 /
定时器是10mS中断,长时间搁置后,timer变成了200uS的更新中断

相关代码如下:
void sysclk_init(void)
{
        //主时钟选择
    {
        CLK_SWR = 0xE1;     //内部16MHSI为主时钟源
        CLK_ICKR |= 0x05;   //从halt模式唤醒使能、使能HSI时钟
        while((CLK_ICKR & 0x02) == 0x00); //等待HSI稳定就绪
    }

    //16MRC时钟1:2输出 即Fmaster = Fhsi / 2 (00-1:1 01-1:2 10-1:4 11-1:8)
    {
        CLK_CKDIVR &= ~(1 << 4);
        CLK_CKDIVR |= (1 << 3);
    }

    //Fcpu = Fmaster = 8M 这个才是真正的供CPU使用的时钟
    CLK_CKDIVR &= ~((1 << 2) | (1 << 1) | (1 << 0));
    //Fcpu = Fmaster / 2 = 4M
        CLK_CKDIVR |= (1 << 0);

        
//                CLK_CKDIVR = 0x00;                //16MHz主频
        CLK_PCKENR1 = 0x00;                //关闭所有外设时钟
        CLK_PCKENR2 = 0x00;
}


void awu_init(void)
{
    CLK_PCKENR2 |= (1 << 2); //使能AWU时钟  

    //唤醒时间2.00S
    AWU_TBR = 0x0D;  
    AWU_APR = 0x3E; //分频Fls
    AWU_CSR1 |= 0x10; //AWU使能


    CLK_ICKR |= (1 << 5); //活跃停机模式(AWU使能情况)下,关闭电压调节器节省功耗  
    FLASH_CR1 |= (1 << 2); //活跃停机模式下Flash掉电,默认只有停机模式才掉电,代价是唤醒时间增加至微秒级别  

}


void tim1_init(void)
{
   CLK_PCKENR1 |= (1 << 7);

    //定时器时钟fck_cnt = Fck_psc / ( PSCR[15:0]+1); Fck_psc  = Fmaster = 8M
    //fck_cnt = 8M / (799 + 1) = 10KHz 周期100us
    TIM1_PSCRH = 0x03;
    TIM1_PSCRL = 0x1F;      //(fCK_CNT)等于fCK_PSC/( PSCR[15:0]+1)。

    // TIM1_CNTR寄存器计数到0x0064(100)为一次溢出:10ms
    TIM1_ARRH = 0x00;      
    TIM1_ARRL = 0x64;  

    TIM1_IER = 0x01;    //允许更新中断

    //重复计数寄存器复位值为0,溢出一次即产生中断
//            TIM1_RCR = 50;      //重复计数寄存器值,这样timer1 2次50ms即100ms产生一次中断

    TIM1_CR1 = 0x01;
}


void main(void)
{
    sysclk_init();
   adc_init();
   timer1_init();
   awu_init();
    while(1)
    {
           //关ADC
           ADC_CR1 &= ~(1 << 0);                                            
           //关timer
           TIM1_CR1 &= ~0x01;
           CLK_PCKENR1 &= ~(1 << 7);        
           asm("halt"); //进入睡眠模式
           asm("nop");
           asm("nop");  
           enter_int();   //关全局中断
            CLK_PCKENR2 |= (1 << 3);
            ADC_CR1 &= ~(1 << 0);
            Delay_ms(10);
            ADC_CR1 |= (1 << 0);

            CLK_PCKENR1 |= (1 << 7);
            TIM1_SR1 &= ~0x01;//清除中断标志
            TIM1_CR1 = 0x01;
            exit_int(); //开全局中断
    }
}

收藏 1 评论11 发布时间:2016-11-22 09:45

举报

11个回答
naruto2323 回答时间:2016-11-22 09:57:36
没人遇到过这个问题吗?????
fishcan11 回答时间:2016-11-22 20:47:03
签到签到
ts2000 回答时间:2016-12-6 08:37:03
帮顶中,没用过
leo121_3006061 回答时间:2016-12-6 09:00:36
本帖最后由 leo121_3006061 于 2016-12-6 16:25 编辑

没用过,帮顶,你看看你的板子支持几种低功耗模式?有些板子的systick只支持sleep模式唤醒

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

any012 回答时间:2016-12-6 09:03:43
没用过,帮顶,还是寄存器编程哎。
斜阳__ 回答时间:2016-12-6 09:09:32
mark,帮顶一下
wanyisq 回答时间:2016-12-6 09:21:29
我是L 也是寄存器  没遇到过
liu553824989 回答时间:2016-12-6 09:34:03
帮顶中,没用过
中山无雪 回答时间:2016-12-6 12:28:31
检查下时钟,看一看
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版