OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5466|回复: 4

原子哥,请教STM32的RTC时钟显示问题

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-8-31
在线时间
0 小时
发表于 2013-9-1 10:53:13 | 显示全部楼层 |阅读模式
正点原子关于RTC实现时钟的代码研究了几遍,自己尝试写过,和正点原子不一样,不过RTC配置和RTC中断优先级配置是一样的,在LCD上显示时出现这个问题:秒值增加时只能覆盖原来的数据,无法先擦除原来的数据后再显示。
我开始怀疑是RTC写代码时漏了什么,参照正点原子后觉得没有,于是我定义一个变量,秒值加1时,该变量从0递增,并将秒值和该变量同时显示出来,发现都只能覆盖原来数据,不能擦除原来数据。
我的结论是:LCD没有实现动态显示数据。。
但是我前后研究了正点原子的代码,发现它也没有写所谓LCD动态显示代码就可以实现数据先擦除后更新了,所以我大惑不解。。。。
请前辈指点迷津。。谢谢
我的代码:
#include "rtc.h"
#include "stdio.h"
#include "lcd.h"
#include "stm32f10x_rtc.h"


/*中断标志位 */
__IO uint32_t TimeDisplay ;        

/*
RTC秒中断优先级配置
 */
void RTC_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
        
        /* Configure one bit for preemption priority */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        
        /* Enable the RTC Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

/*
RTC配置
 */
void RTC_Configuration(void)
{
        /* Enable PWR and BKP clocks */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
        
        /* Allow access to BKP Domain */
        PWR_BackupAccessCmd(ENABLE);
        
        /* Reset Backup Domain */
        BKP_DeInit();
        
        /* Enable LSE */
        RCC_LSEConfig(RCC_LSE_ON);
        /* Wait till LSE is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
        {}
        
        /* Select LSE as RTC Clock Source */
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); 
        
                
        /* Enable RTC Clock */
        RCC_RTCCLKCmd(ENABLE);
        
        /* Wait for RTC registers synchronization */
        RTC_WaitForSynchro();
        
        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();
        
         /* Enable the RTC Second */
        RTC_ITConfig(RTC_IT_SEC, ENABLE);  
         
        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();
        
        /* Set RTC prescaler: set RTC period to 1sec */
        RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
        
        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();
}


/*
这里初始化我的时间值,返回秒值
 */
uint32_t Time_Regulate(void)
{                        
        uint32_t Tmp_HH = 23, Tmp_MM = 59, Tmp_SS = 56;
                
        /* Return the value to store in RTC counter register */
        return((Tmp_HH*3600 + Tmp_MM*60 + Tmp_SS));
}


/*
时间调节
 */
void Time_Adjust(void)
 {
        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();
        
         /* Change the current time */         
         RTC_SetCounter(Time_Regulate());

        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();        
}


/*
时间值调节和在LCD上显示
 */        
void Time_Display(uint32_t TimeVar)
{
        uint32_t THH = 00 , TMM = 00 , TSS = 00 ;
        
        /* Compute  hours */
        THH = TimeVar / 3600;
        /* Compute minutes */
        TMM = (TimeVar % 3600) / 60;
        /* Compute seconds */
        TSS = (TimeVar % 3600) % 60;
        
        LCD_Num_6x12_O(111,70,THH, 0);  
        LCD_Str_6x12_O(125,70, ":",0);        
        LCD_Num_6x12_O(131,70,TMM, 0); 
        LCD_Str_6x12_O(145,70, ":",0);        
        LCD_Num_6x12_O(151,70,TSS, 0);  
}


/*
时间显示
 */   
void Time_Show(void)
{        
        /* Infinite loop */
        while (1)
        {        
                 /* If 1s has paased */
                if (TimeDisplay)           //RTC秒中断
                {
                        /* Display current time */
                        Time_Display(RTC_GetCounter());
                        TimeDisplay = 0;        
                        /* Reset RTC Counter when Time is 23:59:59 */
                        if (RTC_GetCounter() == 0x00015180)
                        {
                                RTC_SetCounter(0x0);
                                /* Wait until last write operation on RTC registers has finished */
                                RTC_WaitForLastTask();
                        }         
                }        
        }
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-9-1 13:44:57 | 显示全部楼层
你LCD写字符的代码怎么写的啊?只是显示问题应该出在你LCD写字符的代码上
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-8-31
在线时间
0 小时
 楼主| 发表于 2013-9-1 15:39:54 | 显示全部楼层
嗯,可是LCD怎么显示动态数据啊?
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-9-1 16:34:29 | 显示全部楼层
回复【3楼】船长:
---------------------------------
所谓动态数据就是在新的数据来的时候 在你需要的位置进行重绘,覆盖掉原先的字符
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-8-31
在线时间
0 小时
 楼主| 发表于 2013-9-1 22:05:34 | 显示全部楼层
沉了吧,自个儿解决了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-13 20:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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