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

[复制链接]
 楼主| 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模块的文档或数据手册。
 楼主| Sam131208 发表于 2024-12-11 11:12 | 显示全部楼层
本帖最后由 Sam131208 于 2024-12-17 17:18 编辑
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.

   
  1. void RTC_WKUP_IRQHandler(void){
  2.     if(RESET != rtc_flag_get(RTC_FLAG_WT)) {
  3.         rtc_flag_clear(RTC_FLAG_WT);
  4.         exti_flag_clear(EXTI_20);
  5.         rtc_wakeup_timer_set(gpio_input_bit_get(GPIOA, GPIO_PIN_8)?8:24);
  6.         gpio_bit_toggle(GPIOA, GPIO_PIN_8);
  7.     }
  8. }

 楼主| Sam131208 发表于 2024-12-11 11:19 | 显示全部楼层
Sam131208 发表于 2024-12-11 11:12
可以提供GD32L233的进一步信息吗?
    在测试中,试图让GD32L233通过RTC唤醒的方式,输出高732us(24 lx ...

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

   初始化:
  1.     rcu_rtc_clock_config(RCU_RTCSRC_IRC32K); //RCU_RTCSRC_IRC32K, RCU_RTCSRC_LXTAL
  2.     rcu_periph_clock_enable(RCU_RTC);
  3.     rtc_register_sync_wait();
  4.    
  5.     nvic_irq_enable(RTC_WKUP_IRQn, 2);
  6.     exti_interrupt_flag_clear(EXTI_20);
  7.     exti_init(EXTI_20, EXTI_INTERRUPT, EXTI_TRIG_RISING);

  8.     rtc_wakeup_disable();
  9.     rtc_flag_clear(RTC_STAT_WTF);
  10.     rtc_wakeup_clock_set(WAKEUP_RTCCK_DIV2);
  11.     rtc_interrupt_enable(RTC_INT_WAKEUP);
 楼主| Sam131208 发表于 2024-12-18 09:25 | 显示全部楼层
    问题已经解决,方法就是不要使用官方驱动,先关闭唤醒功能,再打开唤醒:
   
  1.                 RTC_WPK = RTC_UNLOCK_KEY1;
  2.                 RTC_WPK = RTC_UNLOCK_KEY2;
  3.                 RTC_CTL &= ~RTC_CTL_WTEN;
  4.                 RTC_WUT = _YOUR_WAKEUP_TIME;
  5.                 RTC_CTL |= RTC_CTL_WTEN;

   
Amazingxixixi 发表于 2024-12-27 15:41 | 显示全部楼层
看看手册
cen9ce 发表于 2025-1-15 13:05 | 显示全部楼层
是的,GD32L233 的 RTC(实时时钟)周期中断是可以随时修改的。
b5z1giu 发表于 2025-1-15 14:10 | 显示全部楼层
RTC 周期中断是通过配置 RTC 的 闹钟寄存器(Alarm Register) 或 周期唤醒寄存器(Wakeup Timer Register) 来实现的。你可以通过修改这些寄存器的值来调整中断周期。
y1n9an 发表于 2025-1-15 15:13 | 显示全部楼层
在 GD32L233 中,RTC 周期中断可以通过使用闹钟中断来实现,闹钟中断是通过设置 RTC 的闹钟寄存器(RTC_ALRMx)来触发的。
tax2r6c 发表于 2025-1-15 16:18 | 显示全部楼层
你可以设置闹钟的时间(秒、分、时等),当 RTC 时间与闹钟时间匹配时,触发中断。特点:适合需要精确时间触发的场景。
kaif2n9j 发表于 2025-1-15 18:14 | 显示全部楼层
使用周期唤醒中断,周期唤醒中断是通过配置 RTC 的唤醒定时器(RTC_WUTR)来触发的。你可以设置一个周期值(以秒为单位),当 RTC 计时达到该周期值时,触发中断。
l1uyn9b 发表于 2025-1-15 19:08 | 显示全部楼层
在修改 RTC 寄存器之前,需要进入配置模式:如果是修改 闹钟中断,更新 RTC_ALRMx 寄存器的值。如果是修改 周期唤醒中断,更新 RTC_WUTR 寄存器的值。
lix1yr 发表于 2025-1-15 20:27 | 显示全部楼层
RTC 的时钟源需要正确配置(通常使用 LSE 或 LSI)
su1yirg 发表于 2025-1-16 08:30 | 显示全部楼层
如果需要快速响应中断,可以调整 RTC 中断的优先级。
t1ngus4 发表于 2025-1-16 10:01 | 显示全部楼层
GD32L233 的 RTC 周期中断可以随时修改,具体方法是通过更新 RTC_ALRMx 或 RTC_WUTR 寄存器的值。
d1ng2x 发表于 2025-1-16 12:31 | 显示全部楼层
在修改时,需要注意进入和退出配置模式,并确保中断已正确使能。如果需要更详细的配置,在 GD32L233 中,RTC_WUTR(Wakeup Timer Register)是用于配置 RTC 周期唤醒定时器的寄存器。为了确保写入 RTC_WUTR 时的安全性,GD32L233 引入了 WTWF(Wakeup Timer Write Flag)标志位。WTWF 用于指示当前是否可以安全地写入 RTC_WUTR。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

131

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

42

主题

131

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部