打印
[软件资料]

[已解决]CW32L010 RTC 自动唤醒 AWTIMER无法按时唤醒

[复制链接]
259|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fox1|  楼主 | 2024-12-31 13:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 fox1 于 2025-1-2 11:34 编辑

如题,详细信息在下面,请大佬们帮忙看看
----------------------------pass,已经解决,附上正确代码-------------------------------------  PSC1,PSC2为默认值
    RTC_InitTypeDef RTC_InitStruct = {0};

    RTC_InitStruct.DateStruct.Day = 1;
    RTC_InitStruct.DateStruct.Month = RTC_Month_January;
    RTC_InitStruct.DateStruct.Year = 24;
    RTC_InitStruct.DateStruct.Week = RTC_Weekday_Sunday;
    RTC_InitStruct.RTC_ClockSource = RTC_RTCCLK_FROM_LSI;
    RTC_InitStruct.TimeStruct.AMPM = RTC_H12_AM;
    RTC_InitStruct.TimeStruct.H24 = RTC_HOUR12;
    RTC_InitStruct.TimeStruct.Hour = 1;
    RTC_InitStruct.TimeStruct.Minute = 0;
    RTC_InitStruct.TimeStruct.Second = 0;

    SYSCTRL_LSI_Enable(); // 使用LSI作为RTC的时钟源,必须在配置RTC前准备好时钟
    RTC_Init(&RTC_InitStruct);
    RTC_AWTTypeDef RTC_AWTStruct = {0};
    RTC_AWTStruct.AWT_ClockSource = 1; // TICKCLK
    RTC_AWTStruct.AWT_ARRValue = 59;
    RTC_AWTConfig(&RTC_AWTStruct);

    RTC_ITConfig(RTC_IT_AWTIMER, ENABLE);
    RTC_ClearITPendingBit(RTC_IT_ALL);
    NVIC_EnableIRQ(RTC_IRQn);
    RTC_AWTCmd(ENABLE);
    RTC_Cmd(ENABLE);
    return SUCCESS;


使用特权

评论回复
沙发
fox1|  楼主 | 2024-12-31 14:03 | 只看该作者

[i=s] 本帖最后由 fox1 于 2025-1-2 11:32 编辑 [/i]<br /> <br />

首先我按照这个手册先使能RTC, CW_SYSCTRL->APBEN2_f.RTC = 1;并且disable RTC好修改配置

image.png

然后RTTCLK选择内部低速时钟CW_RTC->CR1_f.SOURCE = 3;内部低速时钟是32.8KHZ,PSC1和PSC2采用默认不变,TICKCLK计算出来2Hz image.png

按照自动唤醒的介绍,选择自动唤醒时钟源为TICKCLK,AWTPRS默认不分频,配置ARR 为59,并使能中断,按计算公式来说,应该(59+1)/2 = 30 ,就 RTC就进入中断一次,,然后使用SYSCTRL_GotoDeepSleep睡眠,可是为啥进入休眠模式后到点,没有触发中断呢?

image.png

使用特权

评论回复
板凳
fox1|  楼主 | 2024-12-31 14:08 | 只看该作者

代码如下

int32_t main(void)
{

    RCC_Configuration();
    // 配置GPIO
    UART_Configuration();
    printf("\r\nCW32L010 UART Printf Example\r\n");
         BTIM1_DELAY_MS(5000);
    while (1)
{
        GPIO_InitTypeDef GPIO_InitStructure = {0};
        GPIO_InitStructure.IT = GPIO_IT_NONE;
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
        GPIO_InitStructure.Pins = GPIO_PIN_5;
        From_RTC_wakeUP_GoSleep_ReadyWork();
        RTC_1MINWAKEUP_Configuration();
        SYSCTRL_GotoDeepSleep();
        testIsSleepPB5();
         BTIM1_DELAY_MS(5000);
        if (gQMAWakeupIrq)
        {

            // 关闭RTC
            RTC_Cmd(DISABLE);
            gQMAWakeupIrq = 0;
            // 开启UART,控制,GNSS 发信

            /* code */
            while (1)
            {

                // 暂时用来进下载模式
                /* code */
            }
        }
        else if (gRTCWakeupIrq)
        {

            GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
            PB05_TOG();
            BTIM1_DELAY_US(50);
            PB05_TOG();
            BTIM1_DELAY_US(50);
            PB05_SETLOW();
            // 配置UART
            UART_Configuration();
            // QMA6100P_INT1();
            printf("\r\nCW32L010 RTC AWT \r\n");
            // 发信,再次进入RTC
            continue;
            /* code */
        }
        else
        {
            continue;
            // 更多分支,pass
        }
    }

// 进入RTC前准备  /  从RTC唤醒后进深度睡眠
void From_RTC_wakeUP_GoSleep_ReadyWork(void)
{
    // MEMS外部唤醒 ,下载口,RST保留 /PB5
    uint16_t need_work_pin_byA = (GPIO_PIN_7 | GPIO_PIN_8);
    uint16_t need_work_pin_byB = (GPIO_PIN_2 | GPIO_PIN_7);
    // 关所有外设
    CW_SYSCTRL->APBEN1 = 0x5a5a0000;
    CW_SYSCTRL->APBEN2 = 0x5a5a0000;
    CW_SYSCTRL->AHBEN = 0x5a5a0000;
    // 仅开GPIOA B,保证GPIOA B中断可用  ,RTC
    SYSCTRL_AHBPeriphClk_Enable(SYSCTRL_AHB_PERIPH_GPIOA, ENABLE);
    SYSCTRL_AHBPeriphClk_Enable(SYSCTRL_AHB_PERIPH_GPIOB, ENABLE);
    SYSCTRL_APBPeriphClk_Enable2(SYSCTRL_APB2_PERIPH_RTC, ENABLE);
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pins = GPIO_PIN_All & ~need_work_pin_byA;
    GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
    GPIO_InitStruct.Pins = GPIO_PIN_All & ~need_work_pin_byB;
    GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
    // 唤醒后使用4mhz时钟
    SYSCTRL_WAKEUPCLK_Config(SYSCTRL_WAKEUPCLKEN);
}

ErrorStatus RTC_1MINWAKEUP_Configuration()
{
    CW_SYSCTRL->APBEN2_f.RTC = 1;                                                   //  启动RTC外设时钟,使能RTC模块
    if ((SYSCTRL_GetAllRstFlag() & SYSCTRL_RESETFLAG_POR) != SYSCTRL_RESETFLAG_POR) // 不是上电复位,直接退出
    {
        SYSCTRL_ClearRstFlag(SYSCTRL_RESETFLAG_ALL);
        return SUCCESS;
    }
    RTC_Cmd(DISABLE); //  停止RTC,保证正确访问RTC寄存器
    CW_RTC->CR1_f.SOURCE = 3; //内部低速时钟
    CW_RTC->CR2_f.AWTSRC = 1; // 配置TICKCLK时钟源 
    CW_RTC->IER_f.AWTIMER = 1;
    CW_RTC->AWTARR_f.ARR = 59; // 30s
    CW_RTC->CR2_f.AWTEN = 1;
    RTC_ClearITPendingBit(RTC_IT_ALL);

    NVIC_EnableIRQ(RTC_IRQn);
    RTC_Cmd(ENABLE);
    return SUCCESS;
}

//中断函数
void RTC_IRQHandler(void)
{
    /* USER CODE BEGIN */
    /* USER CODE BEGIN */
    if (CW_RTC->ISR & RTC_ISR_AWTIMER_Msk)
    {

        CW_RTC->ICR = 0x00;
        gRTCWakeupIrq = 1;
    }
    /* USER CODE END */
}


使用特权

评论回复
地板
fox1|  楼主 | 2025-1-2 10:41 | 只看该作者

尝试先切换成LSI时钟再配置AWT也没有唤醒

使用特权

评论回复
5
fox1|  楼主 | 2025-1-2 11:32 | 只看该作者

配置有误,用库函数正常唤醒了,附上代码

    RTC_InitTypeDef RTC_InitStruct = {0};

    RTC_InitStruct.DateStruct.Day = 1;
    RTC_InitStruct.DateStruct.Month = RTC_Month_January;
    RTC_InitStruct.DateStruct.Year = 24;
    RTC_InitStruct.DateStruct.Week = RTC_Weekday_Sunday;
    RTC_InitStruct.RTC_ClockSource = RTC_RTCCLK_FROM_LSI;
    RTC_InitStruct.TimeStruct.AMPM = RTC_H12_AM;
    RTC_InitStruct.TimeStruct.H24 = RTC_HOUR12;
    RTC_InitStruct.TimeStruct.Hour = 1;
    RTC_InitStruct.TimeStruct.Minute = 0;
    RTC_InitStruct.TimeStruct.Second = 0;

    SYSCTRL_LSI_Enable(); // 使用LSI作为RTC的时钟源,必须在配置RTC前准备好时钟
    RTC_Init(&RTC_InitStruct);
    RTC_AWTTypeDef RTC_AWTStruct = {0};
    RTC_AWTStruct.AWT_ClockSource = 1; // TICKCLK
    RTC_AWTStruct.AWT_ARRValue = 59;
    RTC_AWTConfig(&RTC_AWTStruct);

    RTC_ITConfig(RTC_IT_AWTIMER, ENABLE);
    RTC_ClearITPendingBit(RTC_IT_ALL);
    NVIC_EnableIRQ(RTC_IRQn);
    RTC_AWTCmd(ENABLE);
    RTC_Cmd(ENABLE);
    return SUCCESS;

使用特权

评论回复
6
fox1|  楼主 | 2025-1-2 18:51 | 只看该作者

这个配置,实测是60s左右,猜测TICKCLK应该是用的框图那个1HZimage.png

使用特权

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

本版积分规则

7

主题

29

帖子

0

粉丝