野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13675|回复: 3

触屏配置RTC完成后,无法写入寄存器,请指点迷津。

[复制链接]
发表于 2015-1-16 22:56:58 | 显示全部楼层 |阅读模式
想更改时间,首先读取RTC目前值,然后关闭RTC中断,通过触屏进行设置,设置好后,打开RTC中断,设置值写入RTC寄存器,以上流程没有问题吧?
程序如下:
if(even==E_SETTIME)
        {
                tm = &systmtime;
                nian=tm->tm_year;
                yue=tm->tm_mon;
                ri=tm->tm_mday;
                shi=tm->tm_hour;
                fen=tm->tm_min;
                miao=tm->tm_sec;
                even = E_NULL;
                while(even !=E_SETTIME)
                {
                        RTC_ITConfig(RTC_IT_SEC, DISABLE);
                        if(even==E_RIGHT)
                        {
                                wei=wei+1;
                                if(wei>5)
                                        wei=0;
                                even = E_NULL;
                        }
                        else if(even==E_LEFT)
                        {
                                wei=wei-1;
                                if(wei<0)
                                        wei=5;
                                even = E_NULL;
                        }
                       
                        switch(wei)
                        {
                                case 0:
                                        if(even==E_UP)
                                        {       
                                                nian++;
                                                even = E_NULL;
                                        }
                                        else if(even==E_DOWN)
                                        {
                                                nian--;
                                                even = E_NULL;
                                        }
                                        LCD_ShowNum_8x16(158,304,nian,4,WHITE,RED);
                                       
                                        LCD_ShowNum_8x16(198,304,yue,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(222,304,ri,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(166,288,shi,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(190,288,fen,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(214,288,miao,2,WHITE,BLACK);
                                break;
                                case 1:
                                        if(even==E_UP)
                                        {       
                                                yue++;
                                                even = E_NULL;
                                        }
                                        else if(even==E_DOWN)
                                        {
                                                yue--;
                                                even = E_NULL;
                                        }
                                        LCD_ShowNum_8x16(158,304,nian,4,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(198,304,yue,2,WHITE,RED);
                                       
                                        LCD_ShowNum_8x16(222,304,ri,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(166,288,shi,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(190,288,fen,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(214,288,miao,2,WHITE,BLACK);
                                break;
                                case 2:
                                        if(even==E_UP)
                                        {       
                                                ri++;
                                                even = E_NULL;
                                        }
                                        else if(even==E_DOWN)
                                        {
                                                ri--;
                                                even = E_NULL;
                                        }
                                        LCD_ShowNum_8x16(158,304,nian,4,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(198,304,yue,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(222,304,ri,2,WHITE,RED);
                                       
                                        LCD_ShowNum_8x16(166,288,shi,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(190,288,fen,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(214,288,miao,2,WHITE,BLACK);
                                break;
                                case 3:
                                if(even==E_UP)
                                        {       
                                                shi++;
                                                even = E_NULL;
                                        }
                                        else if(even==E_DOWN)
                                        {
                                                shi--;
                                                even = E_NULL;
                                        }
                                        LCD_ShowNum_8x16(158,304,nian,4,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(198,304,yue,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(222,304,ri,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(166,288,shi,2,WHITE,RED);
                                       
                                        LCD_ShowNum_8x16(190,288,fen,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(214,288,miao,2,WHITE,BLACK);
                                break;
                                case 4:
                                        if(even==E_UP)
                                        {       
                                                fen++;
                                                even = E_NULL;
                                        }
                                        else if(even==E_DOWN)
                                        {
                                                fen--;
                                                even = E_NULL;
                                        }
                                        LCD_ShowNum_8x16(158,304,nian,4,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(198,304,yue,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(222,304,ri,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(166,288,shi,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(190,288,fen,2,WHITE,RED);
                                       
                                        LCD_ShowNum_8x16(214,288,miao,2,WHITE,BLACK);
                                break;
                                case 5:
                                        if(even==E_UP)
                                        {       
                                                miao++;
                                                even = E_NULL;
                                        }
                                        else if(even==E_DOWN)
                                        {
                                                miao--;
                                                even = E_NULL;
                                        }
                                        LCD_ShowNum_8x16(158,304,nian,4,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(198,304,yue,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(222,304,ri,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(166,288,shi,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(190,288,fen,2,WHITE,BLACK);
                                       
                                        LCD_ShowNum_8x16(214,288,miao,2,WHITE,RED);
                                break;
                                default :break;
                        }
                LCD_DisNum(158,250,nian,WHITE,RED);       
                printf("\n\r DAY:  %d\n\r", yue);       
                RTC_ITConfig(RTC_IT_SEC, ENABLE);
                tm->tm_year= nian;
                tm->tm_mon= yue;
                tm->tm_mday= ri;
                tm->tm_hour= shi;
                tm->tm_min= fen;
                tm->tm_sec= miao;
                RTC_WaitForLastTask();       //等待RTC完成当前任务,增减无影响
                GregorianDay(tm);              //计算公历,增减无影响
                RTC_SetCounter(mktimev(tm));        //计算时间戳,写入寄存器,加上此段代码后,时间日期并不能写入,且带来无法退出设置的问题。
                RTC_WaitForLastTask();                  //增减无影响       
                }
                even = E_NULL;       
        }

请注意看后面4行有注释的地方。
说明:触屏触发"设置"后,通过上下左右进行选择和增减时间,再次触摸“设置”后退出设置,写入时间。目前增加写入寄存器时间代码前,显示,数据增减,进入退出设置都正确,但增加写入寄存器时间后,无法写入时间,且无法选择、增减、退出等动作。请大家指点迷津。
谢谢!
回复

使用道具 举报

 楼主| 发表于 2015-1-16 23:31:48 | 显示全部楼层
将上面红色有注释的4行代码,向外移一层到括号外,程序仍然不行。然后重新上电,竟然好了,但是设置几次时间后,再次出现上述问题。谁知道这里面的原因,是我的程序bug,还是库函数bug?
回复 支持 反对

使用道具 举报

发表于 2015-1-17 09:32:33 | 显示全部楼层
rtc好像是属于备份域,要使能备份域的时钟,参考一下野火的rtc例程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-18 14:56:40 | 显示全部楼层
flyleaf 发表于 2015-1-17 09:32
rtc好像是属于备份域,要使能备份域的时钟,参考一下野火的rtc例程

是的,在野火的RTC程序,判断是否初次上电,如果未初次上电的括号内,增加对时钟的初始化和备份域使能,程序就回复正常了。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 04:34 , Processed in 0.077018 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表