APT32 RTC+低功耗调试笔记

1、项目需求

   采用APT32F1023单片机,内部27K时钟驱动RTC,内部6M定时器作为主频。周期检测外部供电是否恢复,如果恢复则使用正常工作模式,否则仅开启RTC,关闭其他外设,进入低功耗待机模式。

2、存在问题

    A:开启看门狗后,会周期触发看门狗复位 

    B: 进入低功耗模式后,由于ADC采集异常,外部供电恢复无法被检测到,也就无法恢复到正常工作模式。

3、心得体会

  A: 注意ADC重新配置的时机

    不能不重新配置,否则无法采集新的ADC值

    不能初始化的过于频繁,否则留给ADC采集的时间不足,可能会造成多通道采集中的一个或多个通道还未完成转换,则采集数据不正确。

  B: 注意看门狗的及时喂狗

    我们知道,看门狗的触发周期内,要完成喂狗操作,否则单片机会看门狗复位重启。本例中看门狗的周期是8秒,我们选择RTC唤醒的周期是5秒,然后在RTC唤醒中断中喂狗,ADC采集中保险起见,也喂狗。

    //------------  WDT FUNTION  --------------------------------/
    SYSCON_IWDCNT_Config(IWDT_TIME_8S, IWDT_INTW_DIV_7); // WDT TIME 1s,WDT alarm interrupt time=1s-1s*1/8=0.875S
    SYSCON_WDT_CMD(DISABLE); // enable WDT
    SYSCON_IWDCNT_Reload(); // reload WDT
    IWDT_Int_Enable();

void ADCIntHandler(void)
{
    uint16_t adc_v = 0;
    if ((ADC0->SR & ADC12_EOC) == ADC12_EOC) // ADC EOC interrupt
    {
        ADC0->CSR = ADC12_EOC;

        adc_v = ADC12_DATA_OUPUT(0);
        adc_val_ntc = adc_v * 5100 / 4096;

        adc_v = ADC12_DATA_OUPUT(1);
        if (adc_v > 0) {
            adc_val_power = adc_v * 5100 / 4096 * 11;
        }

        adc_v = ADC12_DATA_OUPUT(2);
        if (adc_v > 0) {
            adc_val_sensor = adc_v * 5100 / 4096;
        }

        adc_convert_ok = 1;
        SYSCON_IWDCNT_Reload();
        // ADC12_Control(ADC12_START);
 }}

void RTCIntHandler(void)
{
    // ISR content ...
    if ((RTC->MISR & ALRA_INT) == ALRA_INT) // ALRAR
    {
        RTC->ICR = ALRA_INT;
        RTC->KEY = 0XCA53;
        RTC->CR = RTC->CR | 0x01;
        RTC->TIMR = (0x10 << 16) | (0x00 << 8) | (0x00); // Hour bit6->0:am 1:pm
        while (RTC->CR & 0x02)
            ; // busy 判断TIMR DATR ALRAR ALRBR数据写完
        RTC->CR &= ~0x1;
    } else if ((RTC->MISR & ALRB_INT) == ALRB_INT) // ALRBR
    {
        RTC->ICR = ALRB_INT;
    } else if ((RTC->IMCR & CPRD_INT) == CPRD_INT) // CPRD
    {
        RTC->ICR = CPRD_INT;
        SYSCON_IWDCNT_Reload();
    } else if ((RTC->IMCR & RTC_TRGEV0_INT) == RTC_TRGEV0_INT) {
        RTC->ICR = RTC_TRGEV0_INT;
    } else if ((RTC->IMCR & RTC_TRGEV1_INT) == RTC_TRGEV1_INT) {
        RTC->ICR = RTC_TRGEV1_INT;
    }
}

  

  

posted @   realiot  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示