打印

GD32L233 RTC 周期中断是否可以随时修改?

[复制链接]
470|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Sam131208|  楼主 | 2024-12-6 12:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    RTC_WUT寄存器需要在WTWF=1时才可以写入。 如果用作定时器,可能需要随时更换定时周期。
    这个WTWF在哪种条件下变为0, 哪种条件下变为1.  是否可以软件清除?怎么清除?

使用特权

评论回复
沙发
stormwind123| | 2024-12-10 11:56 | 只看该作者
WTWF变为1的条件
WTWF标志位通常在以下条件下变为1:

当RTC模块完成当前的唤醒定时器配置或更新操作后,WTWF标志位会被硬件自动置为1,表示此时可以安全地写入RTC_WUT寄存器以更改唤醒定时器的设置。

使用特权

评论回复
板凳
stormwind123| | 2024-12-10 11:56 | 只看该作者
WTWF变为0的条件
WTWF标志位变为0的情况通常发生在以下两种情况下:

写入RTC_WUT寄存器时:当软件尝试写入RTC_WUT寄存器以更改唤醒定时器的设置时,如果WTWF为1,则写入操作会成功,并且写入后WTWF可能会被硬件自动清零,或者需要软件通过某种方式(如读取状态寄存器或执行特定指令)来确认写入完成并清零WTWF。但具体行为可能取决于RTC模块的具体实现和硬件设计。
RTC模块复位时:如果RTC模块发生复位(如系统复位、电源复位或备份域复位),则WTWF标志位可能会被清零。这是因为复位操作会清除或重置RTC模块的内部状态和寄存器值。

使用特权

评论回复
地板
stormwind123| | 2024-12-10 11:56 | 只看该作者
软件清除WTWF的方式
关于是否可以软件清除WTWF以及怎么清除,这取决于RTC模块的具体实现和硬件设计。在一些RTC模块中,WTWF是一个由硬件控制的标志位,软件无法直接清除它。在这种情况下,软件需要等待WTWF自动变为1后才能进行写入操作。

然而,在一些RTC模块的文档中可能会提到某种方式来确认写入完成并间接清除WTWF。例如,软件可以通过读取状态寄存器中的某个位来确认RTC_WUT寄存器的写入操作已完成,并且WTWF已被硬件清零(或者通过执行特定指令来确认写入完成并触发WTWF清零)。但具体的操作方法和步骤需要参考RTC模块的文档或数据手册。

使用特权

评论回复
5
Sam131208|  楼主 | 2024-12-11 11:12 | 只看该作者
本帖最后由 Sam131208 于 2024-12-11 11:17 编辑
stormwind123 发表于 2024-12-10 11:56
软件清除WTWF的方式
关于是否可以软件清除WTWF以及怎么清除,这取决于RTC模块的具体实现和硬件设计。在一些 ...

可以提供GD32L233的进一步信息吗?
    在测试中,试图让GD32L233通过RTC唤醒的方式,输出高732us(24 lxtl clock), 低244us(8 lxtl clock)的信号。
    但是输出的波形是周期96ms,50%duty的波形。

    初始化,RTC时钟用的内部IRC32K, 后期会更换为LXTL 32K.

void RTC_WKUP_IRQHandler(void){
    if(RESET != rtc_flag_get(RTC_FLAG_WT)) {
        rtc_flag_clear(RTC_FLAG_WT);
        exti_flag_clear(EXTI_20);
        GPIO_TG(GPIOA) = GPIO_PIN_8;
    }
}


使用特权

评论回复
6
Sam131208|  楼主 | 2024-12-11 11:19 | 只看该作者
Sam131208 发表于 2024-12-11 11:12
可以提供GD32L233的进一步信息吗?
    在测试中,试图让GD32L233通过RTC唤醒的方式,输出高732us(24 lx ...

  代码无法一起发出,否则会丢失,希望21IC能改进。

   初始化:
    rcu_rtc_clock_config(RCU_RTCSRC_IRC32K); //RCU_RTCSRC_IRC32K, RCU_RTCSRC_LXTAL
    rcu_periph_clock_enable(RCU_RTC);
    rtc_register_sync_wait();
   
    nvic_irq_enable(RTC_WKUP_IRQn, 2);
    exti_interrupt_flag_clear(EXTI_20);
    exti_init(EXTI_20, EXTI_INTERRUPT, EXTI_TRIG_RISING);

    rtc_wakeup_disable();
    rtc_flag_clear(RTC_STAT_WTF);
    rtc_wakeup_clock_set(WAKEUP_RTCCK_DIV2);
    rtc_interrupt_enable(RTC_INT_WAKEUP);

使用特权

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

本版积分规则

36

主题

112

帖子

0

粉丝