久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3958|回復: 0
打印 上一主題 下一主題
收起左側

STM32 實時時鐘RTC原理和編程要旨

[復制鏈接]
跳轉到指定樓層
樓主
ID:91350 發表于 2015-10-29 19:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
   RTC是工業領域實時控制離不開的一個外設,相當于一個獨立的定時器,STM32的RTC外設由一組連續計數的計數器組成,具體來說,由兩個部分組成:第一部分指APB1接口用來和APB1總線相連,此單元還包含一組1位寄存器,可通過APB1總線對其進行讀寫操作,APB1接口由APB1總線時鐘驅動,用來與APB1總線相連;另一部分由一組可編程計數器組成,主要分為兩個模塊:第一個模塊為RTC的預分頻模塊,它可編程產生最長為1s的RTC時間基準TR_CLK,RTC的預分頻模塊包含了一個20位的可編程分頻器(RTC預分頻器),如果在RTC_CR寄存器中設置了相應的允許位,則在每個TR_CLK周期中RTC產生一個中斷,即所謂的秒中斷;第二個模塊是一個32位的可編程計數器,可被初始化為當前的系統時間。系統時間按TR_CLK周期累加并與存儲在RTC_ALR寄存器中的可編程時間相比較,如果TR_CLK控制寄存器中設置了相應允許位,比較匹配時將產生一個鬧鐘中斷,具體見下圖所示;


#include "stm32f10x_lib.h"
#include "platform_config.h"
#include

vu32 TimeDisplay = 0;
u32 hour = 0, minute = 0, second = 0;
void RCC_Configuration(void);
void GPIO_Configuration(void);
void RTC_Configuration(void);
void NVIC_Configuration(void);
void Time_Adjust(void);
void Time_Display(u32 TimeVar);
void Time_Regulate(u32 Tmp_HH,u32 Tmp_MM,u32 Tmp_SS);
int main(void)
{
  RCC_Configuration();
  NVIC_Configuration();
  GPIO_Configuration();
  RTC_Configuration();
  if (BKP_ReadBackupRegister(BKP_DR1) !=0xA5A5)
  {
   
   Time_Adjust();
   BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
  }
  else
  {  
   
   RTC_WaitForSynchro();
   
   RTC_ITConfig(RTC_IT_SEC, ENABLE);
   
   RTC_WaitForLastTask();
  }
   
   Time_Regulate(12,45,30);
  while (1)
  {
    if(TimeDisplay == 1)
    {
     
     Time_Display(RTC_GetCounter());
     TimeDisplay = 0;
    }
  }
}

void RCC_Configuration(void)
{
  ErrorStatus HSEStartUpStatus;

  RCC_DeInit();

  RCC_HSEConfig(RCC_HSE_ON);

  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if (HSEStartUpStatus == SUCCESS)
  {
   
   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
   
   FLASH_SetLatency(FLASH_Latency_2);
   
   RCC_HCLKConfig(RCC_SYSCLK_Div1);
   
   RCC_PCLK2Config(RCC_HCLK_Div1);
   
   RCC_PCLK1Config(RCC_HCLK_Div2);
   
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
   
   RCC_PLLCmd(ENABLE);
   
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}
   
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
   
    while(RCC_GetSYSCLKSource() != 0x08)
    {}
  }

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
                        RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC , ENABLE);

}

void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
#ifdef  VECT_TAB_RAM

  NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else

  NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  NVIC_InitStructure.NVIC_IRQChannel =RTC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
  NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
  GPIO_Init(GPIO_LED,&GPIO_InitStructure);
}

void RTC_Configuration(void)
{

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR |RCC_APB1Periph_BKP, ENABLE);

  PWR_BackupAccessCmd(ENABLE);

  BKP_DeInit();

  RCC_LSEConfig(RCC_LSE_ON);

  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) ==RESET)
  {}

  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  RCC_RTCCLKCmd(ENABLE);

  RTC_WaitForSynchro();

  RTC_WaitForLastTask();

  RTC_ITConfig(RTC_IT_SEC, ENABLE);

  RTC_WaitForLastTask();

  RTC_SetPrescaler(32767);

  RTC_WaitForLastTask();
}


void Time_Adjust(void)
{

  RTC_WaitForLastTask();

  RTC_SetCounter(0);

  RTC_WaitForLastTask();
}

void Time_Regulate(u32 Tmp_HH,u32 Tmp_MM,u32 Tmp_SS)
{

  u32 RTC_Counter;
  RTC_Counter = Tmp_HH*3600 + Tmp_MM*60 +Tmp_SS;

  RTC_WaitForLastTask();

  RTC_SetCounter(RTC_Counter);

  RTC_WaitForLastTask();
}

void Time_Display(u32 TimeVar)
{

  hour = TimeVar / 3600;

  minute = (TimeVar % 3600) / 60;

  second = (TimeVar % 3600) % 60;
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品久久久久久久久久久久久 | 久久久久久久久久久久久9999 | aaaaaa大片免费看最大的 | 毛片在线看片 | 欧美九九| 国产片一区二区三区 | 伦理午夜电影免费观看 | 91佛爷在线观看 | 欧美日韩精品在线免费观看 | 蜜桃特黄a∨片免费观看 | 国产成人综合网 | 午夜视频在线观看一区二区 | 欧美日本一区 | 国产视频一区在线 | 久久久久久久久久久久久91 | 日韩美av | 91视频观看 | 国产精品日韩在线观看 | 国产91丝袜在线播放 | 久热免费 | 男人av的天堂 | 国产精品久久二区 | 成人h动漫精品一区二区器材 | 日韩看片| 亚洲欧洲在线看 | 亚洲国产片 | av一区二区在线观看 | 午夜欧美一区二区三区在线播放 | 久久免费视频观看 | 欧美激情精品久久久久久 | 日日日操| 91欧美精品成人综合在线观看 | 日韩精品一区二区三区在线观看 | 91精品久久久久久久久久入口 | 亚洲精品久久久久久久久久吃药 | 国产精品伦一区二区三级视频 | 成人 在线| 色www精品视频在线观看 | 99re6在线视频精品免费 | 一区二区三区国产 | 成人在线视频网址 |