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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32 RTC模塊實現日歷功能

[復制鏈接]
跳轉到指定樓層
樓主
ID:104126 發表于 2016-1-23 02:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近在用STM32 RTC時鐘部分,要實現的功能是通過RTC模塊實現日歷功能,首先配置RTC模塊

int RTC_Configuration(void)
{
    u32count=0x200000;

   
   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)&& (--count) );
    if ( count == 0)//防止沒有外部
    {
       return -1;
    }

   
   RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

   
   RCC_RTCCLKCmd(ENABLE);

   
   RTC_WaitForSynchro();

   
   RTC_WaitForLastTask();

   
   RTC_SetPrescaler(32767);

   
   RTC_WaitForLastTask();

    return 0;
}

RTC_Configuration函數主要是初始化RTC硬件部分,打開對應模塊的時鐘源,設置時鐘頻率為1HZ及1S中斷一次,系統已這個時鐘源為基礎進行處理!
讀取RTC時鐘寄存器:時鐘寄存器是32位格式分為高16和低16

uint32_t RTC_GetCounter(void)
{
  uint16_t tmp =0;
  tmp =RTC->CNTL;
  return(((uint32_t)RTC->CNTH<< 16 ) | tmp) ;
}

設置秒寄存器
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR |RCC_APB1Periph_BKP, ENABLE);

      
       PWR_BackupAccessCmd(ENABLE);

      
       RTC_WaitForLastTask();

      
       RTC_SetCounter(*time);

      
       RTC_WaitForLastTask();

       BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);



其中RTC_SetCounter是設置秒累加器的
void RTC_SetCounter(uint32_t CounterValue)
{
  RTC_EnterConfigMode();

  RTC->CNTH = CounterValue>> 16;

  RTC->CNTL = (CounterValue& RTC_LSB_MASK);
  RTC_ExitConfigMode();
}

也是通過設置RTC高16位RTC->CNTH和RTC低16位寄存器實現的,可見RTC部分也是通過控制RTC->CNTL和 RTC->CNTH 寄存器實現的,寫寄存器就是設置,然后讀寄存器就是讀秒,它是按照設置的1HZ及1s的頻率不斷的累加,掉電也是可以工作的,因為VBAT管腳外接3V紐扣電池作為后備電池,

設置日期的函數
void set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_tday)
{
    time_t now;
    struct tm* ti;
    rt_device_tdevice;

    ti = RT_NULL;
   
   time(&now);

    ti =localtime(&now);
    if (ti != RT_NULL)
    {
       ti->tm_year = year -1900;//UNIX下時間處理
       ti->tm_mon = month - 1;
       ti->tm_mday = day;
    }

    now = mktime(ti);

    device =rt_device_find("rtc");
    if (device !=RT_NULL)
    {
       rt_rtc_control(device,RT_DEVICE_CTRL_RTC_SET_TIME, &now);
    }
}
FINSH_FUNCTION_EXPORT(set_date, set date. e.g:set_date(2010,2,28))

void set_time(rt_uint32_t hour, rt_uint32_t minute,rt_uint32_t second)
{
    time_t now;
    struct tm* ti;
    rt_device_tdevice;

    ti = RT_NULL;
   
   time(&now);

    ti =localtime(&now);
    if (ti != RT_NULL)
    {
       ti->tm_hour = hour;
       ti->tm_min = minute;
       ti->tm_sec = second;
    }

    now = mktime(ti);
    device =rt_device_find("rtc");
    if (device !=RT_NULL)
    {
       rt_rtc_control(device,RT_DEVICE_CTRL_RTC_SET_TIME, &now);
    }
}


顯示時間和日期函數
void list_date(void)
{
    time_t now;
struct tm *pt;
   time(&now);//讀取當前秒數
     pt =localtime(&now); //把當前時間戳轉換成對應的日期
if(pt != NULL)
   {
rt_kprintf(" Y = %d M = %d D = %d\n",(1900+pt->tm_year),(1+pt->tm_mon),pt->tm_mday);
rt_kprintf(" %d \n", pt->tm_wday);
rt_kprintf(" %d:%d:%d \n", pt->tm_hour,pt->tm_min, pt->tm_sec);
}
rt_kprintf("%d\n",now);//把秒轉換成對應的時間日期
    rt_kprintf("%s\n",ctime(&now));//把秒轉換成對應的時間日期
}



上面還有一個需要注意的地方
gmtime在MDK下面是無法正常使用的,嗲有gmtime函數返回的一直是NULL,后來找到庫函數使用說明:
gmtime語法:
   #include <time.h>  struct tm *gmtime( const time_t *time );
功能:函數返回給定的統一世界時間(通常是格林威治時間),如果系統不支持統一世界時間系統返回NULL。警告!
相關主題:
localtime(), time(), andasctime().

gmtime()函數是分時區的世界時間,而MDK環境下面是不支持的,所以使用gmtime()函數無法得到想要的結果,解決方法很簡單直接localtime()即可

   #include <time.h>  struct tm *localtime( const time_t *time );
功能:函數返回本地日歷時間。警告!
相關主題:
gmtime(), time(), andasctime().


localtime函數此處不再去介紹它是標準的POSIX接口函數,所以可以去查POSIX時間相關的API,此處不再詳細介紹,總體來說RTC使用還是挺簡單的,希望此篇文章能夠給像我一樣使用RTC的同學一些幫助,


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日屁视频 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 性一交一乱一伦视频免费观看 | 久久久久久亚洲精品 | 日韩成人在线视频 | 九九伦理片 | 四虎影院在线免费观看 | 婷婷久久网 | 欧美日韩国产一区二区三区不卡 | 日日骚网| 成人在线视频免费观看 | 精品国产免费人成在线观看 | 国久久| 国产亚洲精品成人av久久ww | 国产一级在线 | 久久久噜噜噜久久中文字幕色伊伊 | 伊人网91| 男人的天堂久久 | 国产免费一区二区三区 | 国产精品久久久久久久久久免费看 | 久久国产精品久久久久久久久久 | 国产福利视频网站 | 色婷婷亚洲国产女人的天堂 | 久久久久久久久久爱 | 三极网站| 一区二区三区高清在线观看 | 中文字幕四虎 | 日韩欧美中文字幕在线观看 | 久久久久一区二区三区 | 久久亚洲一区二区 | 亚洲九九 | 色综合成人网 | 免费在线观看av片 | 日本一区二区三区免费观看 | 日韩a视频| 亚洲小视频在线播放 | 国产精品一区二 | 亚洲一区国产 | 91av视频在线免费观看 | 亚洲小视频在线观看 | 亚洲人va欧美va人人爽 |