搜索

GD32F130 RTC 怎样实现秒中断

[复制链接]
38705|9
mzxh|  楼主 | 2021-6-8 23:05 | 显示全部楼层 |阅读模式
本帖最后由 mzxh 于 2021-6-9 15:01 编辑

看GD32F1x0手册两天了,RTC也不知道怎样设置能实现秒中断,请各位指点一下

使用特权

评论回复
ouyanglei92| | 2021-6-9 09:57 | 显示全部楼层
是每秒产生一个中断吗,可以采用定时器中断实现.几个关键参数是: 定时器时钟频率、分频系数、计数器更新值

使用特权

评论回复
mzxh|  楼主 | 2021-6-9 15:02 | 显示全部楼层
ouyanglei92 发表于 2021-6-9 09:57
是每秒产生一个中断吗,可以采用定时器中断实现.几个关键参数是: 定时器时钟频率、分频系数、计数器更新值 ...

没说明白,是说用RTC 怎么产生秒中断

使用特权

评论回复
sonicll| | 2021-6-9 15:57 | 显示全部楼层
mzxh 发表于 2021-6-9 15:02
没说明白,是说用RTC 怎么产生秒中断

F130的RTC,可以用闹钟中断来实现秒中断的功能,配置闹钟的时候,把日期、时、分、秒的屏蔽位都打开,这样每秒都会有闹钟

使用特权

评论回复
lidi911| | 2021-6-9 21:11 | 显示全部楼层
RTC是可以直接配置寄存器产生秒中断的

使用特权

评论回复
mzxh|  楼主 | 2021-6-10 05:15 | 显示全部楼层
sonicll 发表于 2021-6-9 15:57
F130的RTC,可以用闹钟中断来实现秒中断的功能,配置闹钟的时候,把日期、时、分、秒的屏蔽位都打开,这 ...

我试了,如果都屏蔽,那就一直中断,不是每秒一个中断,不知道是那里设置的不对

使用特权

评论回复
sonicll| | 2021-6-10 09:04 | 显示全部楼层
本帖最后由 sonicll 于 2021-6-10 09:06 编辑
mzxh 发表于 2021-6-10 05:15
我试了,如果都屏蔽,那就一直中断,不是每秒一个中断,不知道是那里设置的不对 ...

中断服务函数里清除闹钟标志了吗,RTC的分频值配置是否正确,还有闹钟的亚秒屏蔽,要配成0

使用特权

评论回复
mzxh|  楼主 | 2021-6-10 10:56 | 显示全部楼层
本帖最后由 mzxh 于 2021-6-10 10:58 编辑
sonicll 发表于 2021-6-10 09:04
中断服务函数里清除闹钟标志了吗,RTC的分频值配置是否正确,还有闹钟的亚秒屏蔽,要配成0 ...
扫描可以正常获得时间,下面是中端设置和中断函数,看看有没有问题

void rtc_second_int_setup(void)//秒中断还没实现
{
    rtc_alarm_subsecond_config(0x00,0x7fff);//亚秒闹钟
    //rtc_interrupt_enable(RTC_INT_ALARM);
    RTC_WPK = RTC_UNLOCK_KEY1;//解锁
    RTC_WPK = RTC_UNLOCK_KEY2;  

    RTC_ALRM0TD = RTC_ALRM0TD_MSKD | RTC_ALRM0TD_MSKH |RTC_ALRM0TD_MSKM ;//| RTC_ALRM0TD_MSKS;
    RTC_CTL |= RTC_CTL_ALRM0EN;//使能闹钟功能
    RTC_CTL |= RTC_CTL_ALRM0IE;//使能闹钟中断
    /* enable the write protection */
    RTC_WPK = RTC_LOCK_KEY;//锁定   

    exti_init(EXTI_17,EXTI_INTERRUPT,EXTI_TRIG_RISING);
    exti_interrupt_enable(EXTI_17);
    nvic_irq_enable(RTC_IRQn,2U,0U);
}

void RTC_IRQHandler(void)
{
//    if(RTC_STAT & RTC_STAT_ALRM0F)
//        {
            rtc_current_time_get(& rtc_initpara);
//            lcd_show_str(35,30,Num2Str(rtc_initpara.rtc_second ,2,0,0),RED,BLUE);
//            lcd_show_str(55,30,Num2Str(rtc_initpara.rtc_minute ,2,0,0),RED,BLUE);
            RTC_STAT &=(~RTC_STAT_ALRM0F);
            rtc_flag_clear(RTC_FLAG_ALARM0);
            exti_flag_clear(EXTI_17);
//        }

}

下面是扫描获得时间,和中断函数不同时使用
        if(RTC_STAT & RTC_STAT_ALRM0F)
        {
//            rtc_current_time_get(& rtc_initpara);
            rtc_initpara.rtc_second=(uint8_t)GET_TIME_SC(RTC_TIME);
            rtc_initpara.rtc_minute=(uint8_t)GET_TIME_MN(RTC_TIME);
            rtc_initpara.rtc_hour=(uint8_t)GET_TIME_HR(RTC_TIME);
            lcd_show_str(35,30,Num2Str(rtc_initpara.rtc_second ,2,0,0),RED,BLUE);
            lcd_show_str(95,30,Num2Str(rtc_initpara.rtc_minute ,2,0,0),RED,BLUE);
            RTC_STAT &=(~RTC_STAT_ALRM0F);
        }

使用特权

评论回复
sonicll| | 2021-6-10 11:40 | 显示全部楼层
mzxh 发表于 2021-6-10 10:56
扫描可以正常获得时间,下面是中端设置和中断函数,看看有没有问题

void rtc_second_int_setup(void)//秒 ...

代码没有问题,打开RTC_ALRM0TD_MSKS就可以1秒一次中断。
你用扫描获取的时间,秒值和现实世界的秒间隔一致吗,你前面说打开所有闹钟屏蔽就一直进中断,我还是怀疑你RTC的分频有问题,秒的间隔太快了

使用特权

评论回复
mzxh|  楼主 | 2021-6-10 23:29 | 显示全部楼层
本帖最后由 mzxh 于 2021-6-10 23:31 编辑
sonicll 发表于 2021-6-10 11:40
代码没有问题,打开RTC_ALRM0TD_MSKS就可以1秒一次中断。
你用扫描获取的时间,秒值和现实世界的秒间隔一 ...

秒的间隔没有测试,只是简单的和电脑秒对比了,感觉差不多,
只要打开RTC_ALRM0TD_MSKS,肯定一直进中断,调试也能看到,清零中断标志后,中断标志立即被置1

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

本版热帖

本版活跃用户

优质原创写原创,赢大奖

编辑推荐

  • 1 wolfe_yu 得到打赏 ¥180.00
  • 2 最美葫芦娃 得到打赏 ¥155.00
  • 3 hk386 得到打赏 ¥75.00
  • 4 火星国务卿 得到打赏 ¥63.00
  • 5 两只袜子 得到打赏 ¥56.00
  • 6 laocuo1142 得到打赏 ¥50.00
  • 7 ezcui 得到打赏 ¥45.00
  • 8 linghz 得到打赏 ¥45.00
  • 9 gaon2 得到打赏 ¥45.00
  • 10 liang-1011 得到打赏 ¥40.00
在线客服 快速回复 返回顶部 返回列表