Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4464320
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-07-01 10:49:18

工程代码:  13_RTC时钟显示.rar  

参考资料: STM标准库3.5 RTC 代码

http://blog.csdn.net/zyboy2000/archive/2009/09/26/4598602.aspx

  1. /*
  2. *    Author :     余威先
  3. *    Date:         2011.6.19    
  4. * 开发板上:PD2 ~ LED2
  5. * PA8 ~ LED0
  6. * PA15 ~ KEY1
  7. * PA13 ~ KEY2
  8. * 修改Date: 2011.6.30 19:20
  9. * rcc时钟配置: SYSCLK = 16MHZ
  10. * AHB = 16MHZ
  11. *              APB1 = 8 MHZ // TIM2 TIM3 TIM4
  12. *                 APB2 = 16 MHZ //GPIO A B C D
  13. * 修改Date:2011.7.1 10:55
  14.               内部RTC 秒中断 LCD显示

  15. */
  16. #include "stm32f10x.h"
  17. #include "rcc.h"
  18. #include "systick.h"
  19. //#include "led.h"
  20. #include "delay.h"
  21. //#include "key.h"
  22. //#include "tim3.h"
  23. //#include "usart1.h"
  24. //#include "spi.h"
  25. #include "lcd.h"
  26. #include "rtc.h"

  27. int main()
  28. {    
  29.     RCC_Configuration(); //系统时钟配置
  30.     RTC_Configuration(); //RTC系统 配置
  31.     RTC_NVIC_Configuration(); //RTC中断配置
  32.     delay_init();     // 延时 初始化
  33.     LCD_Init();         //LCD 彩屏初始化
  34.     RTC_Init();// RTC 时钟初始化
  35.     write_cmd(0x2C); //LCD 写数据命令
  36.     DrawFull_single_colour(0xff, 0xff);    //显示 纯白色
  37.     LCD_PutString(0, 32, "abcdefg"); //在第32/16=2 ,在第三行 开始显示 //字库 8*16
  38.     LCD_show_number(8, 64, 54321); //在第四行显示数字
  39.     while(1); //无限循环, 中断中 显示 秒时钟
  40.     return 0;
  41. }

  1. #ifndef __RTC_H
  2. #define __RTC_H
  3. #include "stm32f10x.h"
  4. #include "lcd.h"

  5. void RTC_Configuration(void); //RTC 系统配置
  6. void RTC_NVIC_Configuration(void); //RTC 中断配置
  7. void RTC_Init(void); //RTC 初始化

  8. #endif

  1. #include "rtc.h"

  2. void RTC_NVIC_Configuration(void)
  3. {
  4.     NVIC_InitTypeDef NVIC_InitStructure;
  5.     
  6.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  7.     
  8.     NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
  9.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  10.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  11.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  12.     NVIC_Init(&NVIC_InitStructure);
  13. }

  14. void RTC_Configuration(void)
  15. {
  16.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //打开PWR BKP 时钟
  17.     
  18.     PWR_BackupAccessCmd(ENABLE);//允许访问BKP域
  19.     BKP_DeInit();     //复位备份寄存器模块
  20.     RCC_LSEConfig(RCC_LSE_ON); //打开LSE时钟
  21.     while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);//等待LSE就绪,
  22.      //一般来说,如果谐振不对,就会死在这里。实际代码请慎重
  23.     RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//RTC使用时钟,可以使用LSE,也可以使用HSI,也可以使用HSE/128
  24.     RCC_RTCCLKCmd(ENABLE);//RTC的时钟开启
  25.     RTC_WaitForSynchro();//RTC等待同步,开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
  26.     RTC_WaitForLastTask();//这个代码在RTC中常常出现,类似于等待就绪的含义
  27.     RTC_ITConfig(RTC_IT_SEC, ENABLE);//RTC开中断,RTC中断有三种,秒中断,闹钟中断,溢出中断,很明显他们的作用。
  28.     //秒中断用于即时操作,闹钟中断用于关闭或者唤醒,溢出中断的话,用于复位RTC
  29.     RTC_WaitForLastTask(); //类似于等待就绪
  30.     RTC_SetPrescaler(32767);////RTC预分频,32768HZ,分为一秒一个振荡,RTC period = RTCCLK/RTC_PR = (32.768
  31.      //KHz)/(32767+1)
  32.     RTC_WaitForLastTask(); //类似于等待就绪
  33. }
  34. /*这样,RTC就启动了。
  35. 通过 RTC_GetCounter() 这个函数。读到计数器的值。
  36. 既然 一秒增一个。
  37. 很容易就可以从 计数器的值,算出确切的时间值。*/

  38. void RTC_Init(void)
  39. {
  40.     #if 1    
  41.     /*若BKP_DR1的值不正确(BKP_DR1的值有误或者由于是第一次运行值还未写进去),需要配置时间*/        
  42.     if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
  43.       {
  44.         RTC_Configuration();//配置RTC
  45.         BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
  46.     }
  47.     else
  48.     {
  49.         //启动无需设置新时钟
  50.         //检测是否掉电重启
  51.            if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
  52.         {
  53.               //printf("\r\n\n Power On Reset occurred....");
  54.         }
  55.         //检测是否ReSet复位
  56.         else if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
  57.         {
  58.           //    printf("\r\n\n External Reset occurred....");
  59.         }
  60.         
  61.         RTC_WaitForSynchro();//等待RTC寄存器同步
  62.         RTC_ITConfig(RTC_IT_SEC, ENABLE);//允许RTC秒中断
  63.            RTC_WaitForLastTask();//等待上次TRC写操作结束
  64.    }
  65.  
  66.     RCC_ClearFlag();//清reset标志
  67. #endif

  68.  /*也可以注释上面的 #if 1 #endif 中的内容,直接写 BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);*/
  69.  // 这样 就第一次 写入 BKP_DR1 数据了
  70. //    BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);    
  71. }

  72. void RTC_IRQHandler(void) //中断函数
  73. {
  74.     static u16 sec = 0;// 静态变量
  75.     if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
  76.     {
  77.         RTC_ClearITPendingBit(RTC_IT_SEC);//清除 RTC秒中断标志
  78.         sec ++;// 定义的全局变量
  79.         //LCD显示 秒 数据
  80.         LCD_show_number(8, 80, sec); //在第四行 第二个字符 开始显示数据
  81.         RTC_WaitForLastTask();//等待就绪
  82.     }    
  83. }




阅读(2011) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~