久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32 RTC模塊實現日歷功能
[打印本頁]
作者:
51heisex
時間:
2016-1-23 02:53
標題:
STM32 RTC模塊實現日歷功能
最近在用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的同學一些幫助,
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日本一区二区高清不卡
|
在线观看亚洲专区
|
亚洲久久
|
精品国产三级
|
精品国产乱码久久久久久蜜退臀
|
国产欧美日韩二区
|
欧美精品久久
|
成人免费一级视频
|
国产片网站
|
日韩欧美国产一区二区
|
中文字幕免费
|
偷拍自拍在线观看
|
毛片毛片毛片毛片毛片
|
91精品国产一区二区三区动漫
|
亚洲人va欧美va人人爽
|
国产999精品久久久久久
|
成人精品国产一区二区4080
|
狠狠干美女
|
在线色网站
|
成人免费视频7777777
|
亚洲九九
|
性做久久久久久免费观看欧美
|
夜夜爽99久久国产综合精品女不卡
|
成人在线免费电影
|
亚洲成人中文字幕
|
美女131mm久久爽爽免费
|
日韩图区
|
成人亚洲片
|
国产在线一区二区
|
日韩在线观看网站
|
国产精品久久久久久久岛一牛影视
|
产真a观专区
|
国产女人与拘做受视频
|
久久综合99
|
一级片av
|
在线视频三区
|
在线观看中文字幕视频
|
国产精品一区二区日韩
|
精品久久一区
|
一区二区三区在线免费看
|
av黄色片
|