Chinaunix首页 | 论坛 | 博客
  • 博客访问: 420947
  • 博文数量: 55
  • 博客积分: 167
  • 博客等级: 入伍新兵
  • 技术积分: 1167
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-28 10:20
个人简介

一个算是正常的中国码农!

文章分类

全部博文(55)

文章存档

2014年(1)

2013年(31)

2012年(23)

我的朋友

分类:

2012-09-24 08:27:38

原文地址:stm32之RTC 作者:number007cool

1、stm32f10x_it.c文件
/*******************************************************************************
* Function Name  : RTC_IRQHandler    RTC中断
* Description    :
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
extern volatile bool Sec; //1S标志
extern volatile int flag;
void RTC_IRQHandler(void)
{
 if(RTC_GetITStatus(RTC_IT_SEC) != RESET) //RTC发生了秒中断(也有可能是溢出或者闹钟中断)
 {
 
  RTC_ClearITPendingBit(RTC_IT_SEC);
  flag=1;
  Sec ;
  /*
  //以免RTC计数溢出,这里限制了RTC计数值的大小.0x0001517f实际就是一天的秒数
  if(RTC_GetCounter() >= 0x0001517f) 
  {
   RTC_SetCounter(0x0);
  }*/
 }
}
2、rtc.c文件
/*****************************************************
**RTC.C实时时钟部分,包含初始化RTC硬件,
**获取时间,设置时间函数.
**
*****************************************************/
#include "STM32Lib\\stm32f10x.h"
#include "hal.h"

static u8 RTC_Blank=0;
/***********************************
**函数名:RTC_Configuration
**功能:RTC设置
**注意事项:要根据是否是第一次设置,才进入下面的RTC设定
判断是否第一次设置,只需要判断RTC后备寄存器1的值是否为事先写入的0XA5A5,如果不是,则
RTC是第一次上电,需要初始化RTC,并把实际时间转化为RTC计数值,这里没有设置实际时间,只是简单地初始化了RTC
************************************/
void RTC_Configuration(void)
{
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
 PWR_BackupAccessCmd(ENABLE);
 if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
 {
  /* Reset Backup Domain */
  BKP_DeInit();
  
  /* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON);
  /* Wait till LSE is ready */
  //等待外部晶振震荡 需要等待比较长的时间
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
  //使用外部晶振32768
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); 
  
  //允许RTC
  RCC_RTCCLKCmd(ENABLE);
  //等待RTC寄存器同步
  RTC_WaitForSynchro();
  
  RTC_WaitForLastTask();
  //允许RTC的秒中断(还有闹钟中断和溢出中断可设置)
  RTC_ITConfig(RTC_IT_SEC, ENABLE);
  
  RTC_WaitForLastTask();
  //32768晶振预分频值是32767,不过一般来说晶振都不那么准
  RTC_SetPrescaler(32776); //如果需要校准晶振,可修改此分频值
  RTC_WaitForLastTask();
  //写入RTC后备寄存器1 0xa5a5
  BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); 
  RTC_Blank=1; //这个标志代表RTC是没有预设的(或者说是没有上纽扣电池)
 }
 //如果RTC已经设置
   else
 {
  //等待RTC与APB同步
    RTC_WaitForSynchro();
  RTC_WaitForLastTask();
 
    //使能秒中断
    RTC_ITConfig(RTC_IT_SEC, ENABLE); 
    RTC_WaitForLastTask();
   }
 
 //清除标志
 RCC_ClearFlag(); 
}
/**************************************************************
** 函数名:TestRtc
** 功能:测试RTC用
** 注意事项:用于显示RTC是否已经设置过.
***************************************************************/
void TestRtc(void)
{
 if(RTC_Blank)
 {
  USART1_Puts("系统之前没设置时间\r\n");
 }
 else
 {
  USART1_Puts("系统已设置时间\r\n");
 }
}
3、main.c文件
#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
volatile bool Sec=FALSE;
volatile int flag=0;
void send_2_pc(unsigned int str)
{
char sec[2];
sec[0]=str/10 '0';
sec[1]=str '0';
USART1_Puts(sec);
USART1_Puts("\r\n");
}
int main(void)
{
 ChipHalInit();   //片内硬件初始化
 ChipOutHalInit();  //片外硬件初始化
 
 TestRtc();    //测试RTC
 for(;;)
 {
  if(flag==1)
  {
  flag=0;
   send_2_pc(Sec);
  }
 }
}
 
效果图:
 
 
 
阅读(990) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~