0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于N32G45的RTC電子鐘

嵌入式技術(shù) ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-12-08 08:47 ? 次閱讀

1.RTC簡介

RTC,英文全稱:Real-time clock,中文名稱:實時時鐘,是指可以像時鐘一様輸出實際時間的電子設(shè)備,一般會是集成電路,因此也稱為時鐘芯片。實時時鐘芯片是日常生活中應(yīng)用最為廣泛的消費類電子產(chǎn)品之一。它為人們提供精確的實時時間,或者為電子系統(tǒng)提供精確的時間基準(zhǔn),目前實時時鐘芯片大多采用精度較高的晶體振蕩器作為時鐘源。

RTC特性

實時時鐘( RTC)是一個獨立的 BCD 定時器/計數(shù)器

軟件支持夏時令補償

編程周期性自動喚醒定時器

兩個 32 位寄存器包含時、分、秒、年、月、日(幾號)、星期(星期幾)

獨立的 32 位寄存器包含亞秒

兩個編程鬧鐘

兩個 32 位寄存器包含編程鬧鐘時、分、秒、年、月、日(幾號)、星期(星期幾)

兩個獨立的 32 位寄存器包含編程鬧鐘亞秒

數(shù)字精密校準(zhǔn)功能

時間戳功能

在 Backup 域復(fù)位后,所有 RTC 寄存器都受到保護, 以防止可能的意外寫訪問

多個中斷/事件喚醒源,包括鬧鐘 A、鬧鐘 B、喚醒定時器、時間戳

RCC 寄存器使能 RTC 模塊且電壓保持在工作范圍內(nèi), RTC 在任何模式下都不會停止(包括 RUN 模式、SLEEP 模式、 STOP0 模式、 STOP2 模式和 STANDBY 模式)

RTC 提供多種喚醒源可以使 MCU 從所有的低功耗模式下喚醒( SLEEP 模式, STOP0 模式, STOP2 模式和 STANDBY 模式)

pYYBAGOQZhuANoZxAAHNEO2DXew675.png

RTC框圖

pYYBAGOQZkyAQQE5AAEroqIRxes296.png

2.RTC功能特性

RTC 包括以下功能模塊:

Alarm A 和 Alarm B 事件/中斷

時間戳事件/中斷

RTC 輸出功能:

256 Hz 或者 1Hz 時鐘輸出(當(dāng) LSE 頻率是 32.768 kHz)

鬧鐘輸出(極性可配置),鬧鐘 A 和鬧鐘 B 可選

自動喚醒輸出(極性可配置)

RTC 輸入功能:

時間戳事件檢測

通過配置輸出寄存器控制 PC13:

設(shè)置 RTC_OPT.TYPE 位配置 PC13 開漏/推挽輸出

3.RTC相關(guān)寄存器

RTC在配置過程中,需要完成配置的有RTC寫保護相關(guān)寄存器、RTC時鐘和預(yù)分頻寄存器、日歷寄存器以及鬧鐘和校準(zhǔn)寄存器。

RTC寄存器寫保護

PWR_CTRL.DBKP 位(見電源控制部分) 默認(rèn)被清除,所以 PWR_CTRL.DBKP 必須置 1 去使能 RTC 寄存器寫功能。一旦備份域復(fù)位,所有的 RTC 寫保護寄存器都會寫保護,所有的 RTC 寫保護寄存器需要按如下步驟去解鎖寫保護:

將 0xCA 寫入 RTC_WRP 寄存器

將 0x53 寫入 RTC_WRP 寄存器

在解鎖這些寄存器后,可以通過清除 PWR_CTRL.DBKP 位激活寫保護。解鎖機制只檢查 RTC_WRP 寄存器的寫操作。在解鎖過程中、解鎖前、解鎖后,對其他寄存器的寫操作不會影響解鎖結(jié)果。

RTC時鐘和預(yù)分頻

RTC 時鐘源:

LSE 時鐘

LSI 時鐘

HSE/128 時鐘

為了降低功耗,將預(yù)分頻器分為異步預(yù)分頻器和同步預(yù)分頻器。如果同時使用兩個預(yù)分頻器,建議異步預(yù)分頻器的值盡可能大。

7 位異步預(yù)分頻器由 RTC_PRE.DIVA[6:0] 位控制

15 位同步預(yù)分頻器由 RTC_PRE.DIVS[14:0] 位控制

pYYBAGOQf5iASlHSAABUshacY2k779.png


ck_apre 時鐘用于對 RTC_SUBS 亞秒遞減計數(shù)器提供時鐘。當(dāng)?shù)竭_ 0 時,用 RTC_PRE.DIVS[14:0]的值重新加載 RTC_SUBS。

RTC日歷

這里有三個影子寄存器,分別是 RTC_DATE, RTC_TSH 和 RTC_SUBS。 RTC 時間和日期寄存器可以通過影子寄存器訪問。也可以直接訪問,以避免等待同步時間。這三個影子寄存器如下:

RTC_DATE: 設(shè)置和讀取日期

RTC_TSH: 設(shè)置和讀取時間

RTC_SUBS: 讀取亞秒

4.RTC電子鐘配置流程

1.RTC作為實時電子鐘外設(shè)模塊,在默認(rèn)情況下只需要初始化一次即可。為了達到該目的,我們可以借助后備域寄存器BKP。

備份存儲器位于備份域里,電源 VDD 關(guān)閉后由 VBAT 供電維持。 BKP 共有 42 個 16 位的寄存器,可用來存儲并保護用戶應(yīng)用數(shù)據(jù)。這 84 個字節(jié)不受系統(tǒng)待機模式喚醒或系統(tǒng)復(fù)位的影響。

pYYBAGOQgcKAQbMqAAIAlxvsJTI318.png

根據(jù)備份存儲器復(fù)位不會清除數(shù)據(jù)特性,我們可以在第一次配置好RTC寄存器后將對應(yīng)的某一個寄存器寫入標(biāo)志位,這樣下次若檢測到標(biāo)志位存在,則直接啟動RTC即可。

2.選擇RTC時鐘源。因為RTC時鐘源選擇有3個:HSE/128、LSE、LSI。為了讓RTC更精準(zhǔn),應(yīng)優(yōu)先選擇LSE(外部低速時鐘32.768KHZ),而我們當(dāng)前開發(fā)板剛好有LSI。

pYYBAGOQgvWAfIXZAACG59buUsE510.png

在RCC_BDCRCTL的0和1位,選擇LSE時鐘源;RCC_BDCRCTL的第15位使能RTC時鐘。

pYYBAGOQg6yAHTooAADKWjSOLNY318.pngpoYBAGOQgzeAPpB0AAHUk8G0mig897.png

3.設(shè)置RTC的工作頻率。設(shè)置RTC的工作頻率我們可以通過RTC_PRE預(yù)分頻寄存器完成。

pYYBAGOQhISAA_ONAAFNjMZCnoc121.png

我們選擇的是LSE=32.768KHZ時鐘源,根據(jù)時鐘頻率計算公式,我們可以設(shè)置RTC_PRE=0xFF7F來產(chǎn)生1HZ工作頻率。根據(jù)官方文檔,異步預(yù)分頻盡量設(shè)置大些。

4.設(shè)置電子日歷。電子日歷可通過時間寄存器RTC_TSH和日期寄存器RTC_DATE完成配置。

pYYBAGOQhbWAOVFkAAIKJKJqmL0265.pngpoYBAGOQhdWAXoteAACdB29Mu9k580.pngpYYBAGOQheSAXe8SAAE40roll2Y319.png

5.輸出1HZ頻率。在使用RTC日歷功能時,參考官方提供示例日歷功能是通過RTC校準(zhǔn)輸出引腳PC13輸出,然后在開啟一個外部中斷器檢測該引腳,從而輸出電子日歷。

在使用RTC本身喚醒中斷時發(fā)現(xiàn)無法觸發(fā),也可能是配置有問題,這個等下一次解決后再來敘述說明,本示例則按照官方示例實現(xiàn)。

PC13引腳模式配置

poYBAGOQhymASaJBAADpJTnUMB4610.png

4.1 RTC配置示例

按照上述步驟,RTC電子日歷功能配置示例如下:

void RTC_Init(void)
{
  //開啟RTC和后備域權(quán)限
  RCC->APB1PCLKEN|=1<<27;//開啟備份接口時鐘
  RCC->APB1PCLKEN|=1<<28;//電源接口時鐘
  /* 允許訪問RTC*/
  PWR->CTRL|=1<<8;//允許寫入RTC和后備區(qū)域
	if(BKP->DAT2!=0xAA)//判斷是否上一次RTC初始化
	{
    printf("進入初始化rn");
    RCC->BDCTRL&=~(1<<15);//關(guān)閉RTC時鐘
    
		//2.選擇RTC時鐘源
		RCC->BDCTRL|=1<<0;//開啟32.768KHZ時鐘
		while(!(RCC->BDCTRL&1<<1)){}//等待32.768KHZ時鐘準(zhǔn)備就緒	
		RCC->BDCTRL&=~(0x3<<8);//清除原來寄存器中的值
		RCC->BDCTRL|=0x1<<8;//時鐘源為32.768KHZ
    RCC->BDCTRL|=1<<15;//開啟RTC時鐘
    /*解除RTC寫保護*/
    RTC->WRP=0xCA;
    RTC->WRP=0x53; 
    while(!(RTC->INITSTS&1<<5)){} //等待日歷影子寄存器同步
    
    RTC->INITSTS|=1<<7;//進入初始化模式
    while(!(RTC->INITSTS&1<<6)){}//等待初始化標(biāo)志置1
    printf("進入配置模式rn");  
    /*設(shè)置分頻系數(shù),產(chǎn)生1HZ*/
    RTC->PRE=0;      
    RTC->PRE|=0X7F<<16;
    RTC->PRE|=0xFF;

    RTC->INITSTS&=~(1<<7);//退出初始化模式
    RTC->WRP=0xff; 
    for(int i=0;i<0x2FF;i++);//等待配置完成
    BKP->DAT2=0xAA;//RTC初始化完成標(biāo)志	
    RTC_SetDate(&RTC_Time);

	}
  RTC->WRP = 0xCA;
  RTC->WRP = 0x53;  
  RTC->CTRL|=1<<19;//輸出1HZ
  RTC->OPT|=1<<0;//推挽輸出
  RTC->CTRL|=1<<23;//開啟校準(zhǔn)輸出
  RTC->WRP = 0xFF;
  printf("初始化完成rn");
}

4.2 配置PA7引腳,捕獲RTC電子日歷

由于RTC產(chǎn)生的1HZ頻率是通過PC13引腳輸出,所以我們配置一個硬件來實現(xiàn)電子日歷。

void EXTI_Init(void)
{
  //1.GPIO口配置

  RCC->APB2PCLKEN|=1<<2;
  GPIOA->PL_CFG&=0x0FFFFFFF;
  GPIOA->PL_CFG|=0x80000000;
  //2.開AFIO時鐘,選擇觸發(fā)源
  RCC->APB2PCLKEN|=1<<0;//開AFIO時鐘
  /*外部中斷7--PA7*/
  AFIO->EXTI_CFG[1]&=~(0xF<<3*4);//PA7
  EXTI->IMASK|=1<<7;//使能中斷線7
  EXTI->RT_CFG|=1<<7;//檢測上升沿
  N32_NVIC_SetPriority(EXTI9_5_IRQn,1,1);//設(shè)置優(yōu)先級
}
void EXTI9_5_IRQHandler(void)
{
 

  else if(PAin(7))
  {
    RTC_GetDate(&RTC_Time);
  }
  EXTI->PEND|=0xf<<5;//清除標(biāo)志位
}

4.3 RTC設(shè)置時間

為方便后續(xù)時間校準(zhǔn)(串口校時或者網(wǎng)絡(luò)校時或其它方式)實現(xiàn),這里單獨封裝一個RTC時間校準(zhǔn)函數(shù)。

/*設(shè)置RTC時間和日期*/
void RTC_SetDate(RTC_TIME *RTC_Time)
{
  RTC->WRP = 0xCA;
  RTC->WRP = 0x53;
  RTC->INITSTS|=1<<7;//進入初始化模式
  while(!(RTC->INITSTS&1<<6)){}//等待初始化標(biāo)志置1 
   //設(shè)置日期
   RTC->DATE=0;
  //年
  RTC->DATE=0;
  RTC->DATE|=(RTC_Time->year / 10)<<20;
  RTC->DATE|=(RTC_Time->year % 10)<<16;
  //星期1
  RTC->DATE|=(RTC_Time->week % 8)<<13;
  //月
  RTC->DATE|=(RTC_Time->mon / 10)<<12;
  RTC->DATE|=(RTC_Time->mon % 10)<<8;
  //日
  RTC->DATE|=(RTC_Time->day / 10)<<4;
  RTC->DATE|=(RTC_Time->day % 10)<<0;  
    
  /*設(shè)置時間*/
  RTC->TSH=0;
  RTC->TSH&=~(1<<22);//24小時制
  //時
  RTC->TSH|=(RTC_Time->hour / 10)<<20;
  RTC->TSH|=(RTC_Time->hour % 10)<<16; 
  //分
  RTC->TSH|=(RTC_Time->min /10)<<12; 
  RTC->TSH|=(RTC_Time->min %10)<<8;  
  //秒
  RTC->TSH|=(RTC_Time->sec /10)<<4; 
  RTC->TSH|=(RTC_Time->sec %10)<<0;
  RTC->INITSTS&=~(1<<7);//退出初始化模式
  RTC->WRP=0xff;
}

4.4 RTC時間讀取

為方便后續(xù)做時間顯示處理,封裝時間獲取函數(shù)。

/*讀取RTC時間和日期*/
void RTC_GetDate(RTC_TIME *RTC_Time)
{
  u32 date=RTC->DATE;
  u32 tsh=RTC->TSH;
  RTC_Time->year=((date>>20)&0xf)*10+ ((date>>16)&0xf);
  RTC_Time->mon=((date>>12)&0x1)*10+ ((date>>8)&0xf);
  RTC_Time->day=((date>>4)&0x3)*10+(date&0xf);
  RTC_Time->week=((date>>13)&0x7);
  //時間,注意,+-優(yōu)先級 高于 &的優(yōu)先級
  RTC_Time->hour=((tsh>>20)&0x3)*10+((tsh>>16)&0xf);
  RTC_Time->min=((tsh>>12)&0x7)*10+((tsh>>8)&0xf);
  RTC_Time->sec=((tsh>>4)&0x7)*10+(tsh&0xf);
 // printf("%d/%d/%d -- %d:%d:%d rn",RTC_Time->year,RTC_Time->mon,RTC_Time->day, 
                                         RTC_Time->hour,RTC_Time->min,RTC_Time->sec);
}

4.5 串口校時

通過串口方式進行時間校準(zhǔn)。串口數(shù)據(jù)格式如下:

pYYBAGOQiUiAJRXHAAChoDD9qG4337.png

if(usart1_flag)
{
	usart1_rx_buff[usart1_cnt]='?';//字符串結(jié)束標(biāo)志符
	printf("usart1:%srn",usart1_rx_buff);
	//*20200822102540
	if(usart1_rx_buff[0]=='*' && usart1_cnt==15)
	{
		RTC_Time.year=(usart1_rx_buff[3]-'0')*10+(usart1_rx_buff[4]-'0')*1;
		RTC_Time.mon=(usart1_rx_buff[5]-'0')*10+(usart1_rx_buff[6]-'0')*1;
		RTC_Time.day=(usart1_rx_buff[7]-'0')*10+(usart1_rx_buff[8]-'0')*1;
		RTC_Time.hour=(usart1_rx_buff[9]-'0')*10+(usart1_rx_buff[10]-'0')*1;
		RTC_Time.min=(usart1_rx_buff[11]-'0')*10+(usart1_rx_buff[12]-'0')*1;
		RTC_Time.sec=(usart1_rx_buff[13]-'0')*10+(usart1_rx_buff[14]-'0')*1;
        RTC_ChangeWeek(RTC_Time.year,RTC_Time.mon,RTC_Time.day);//星期
		RTC_SetDate(&RTC_Time);//設(shè)置時間和日期
	}
	usart1_flag=0;	
	usart1_cnt=0;			
}

4.6 運行效果

將獲取到的時間通過OLED屏幕顯示。OLED屏幕驅(qū)動參考:http://www.ttokpm.com/d/1950506.htmltrack_id=myCenter&mod=article&share

pYYBAGOQisKAfiVXACPvJ3gaY6E555.png
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 電子鐘
    +關(guān)注

    關(guān)注

    7

    文章

    189

    瀏覽量

    36836
  • RTC
    RTC
    +關(guān)注

    關(guān)注

    2

    文章

    511

    瀏覽量

    65897
  • n32g455
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    903
收藏 人收藏

    評論

    相關(guān)推薦

    基于N32G45電子鐘# #嵌入式開發(fā)

    單片機國民技術(shù)
    IT_阿水
    發(fā)布于 :2022年12月07日 22:07:30

    基于RT-Thread和N32G457的電子墨水屏電子鐘設(shè)計方案

    1、基于RT-Thread和N32G457的電子墨水屏電子鐘設(shè)計本方案可以用于桌擺時鐘及定時器,用于倒計時提醒,查看時間等場景。定時器功能同時顯示了倒計時時長已經(jīng)定時到達時間,方便設(shè)置預(yù)期的提醒時間
    發(fā)表于 10-28 17:29

    國民技術(shù)N32G45環(huán)境搭建及點燈測試

    1.N32G45簡介??N32G45系列集成了最新一代嵌入式ARM Cortex?-M4F處理器,在Cortex?-M3內(nèi)核的基礎(chǔ)上強化了運算能力、新增加了浮點運算處理單元(FPU)、DSP
    發(fā)表于 12-03 16:34

    【國民技術(shù)N32項目移植】基于N32G45電子鐘項目移植

    基于N32G45電子鐘項目移植1.項目簡介??本項目主要完RCC時鐘、GPIO引腳、USART、DMA協(xié)助串口收發(fā)、TIM輸出PWM控制LED閃爍以實現(xiàn)程序運行指示、硬件SPI驅(qū)動0.96寸
    發(fā)表于 12-07 21:57

    【精品合集】國民技術(shù)N32開源移植挑戰(zhàn)賽作品合集

    345XVL-STB項目移植 —開箱+資料【國民技術(shù)N32項目移植】MacOS開發(fā)N32G45 1、創(chuàng)建開發(fā)環(huán)境【國民技術(shù)N32項目移植】RT-THread 移植 LED閃燈【國民技術(shù)N
    發(fā)表于 01-10 13:59

    【國民技術(shù)N32項目移植】5.項目提交-天氣顯示及預(yù)報系統(tǒng)介紹以及演示

    技術(shù)N32G45芯片微處理器,運行RT-Thread操作系統(tǒng),實現(xiàn)包括系統(tǒng)外設(shè)初始化、網(wǎng)絡(luò)接入、系統(tǒng)管理、數(shù)據(jù)獲取、數(shù)據(jù)顯示等功能。平臺層和應(yīng)用層功能則由服務(wù)器和開發(fā)板以及顯示屏協(xié)同實現(xiàn)。系統(tǒng)整體框圖
    發(fā)表于 02-22 19:53

    【國民技術(shù)N32項目移植】基于N32G45智能家居平臺

    ;5.RTC電子鐘??RTC,英文全稱:Real-time clock,中文名稱:實時時鐘,是指可以像時鐘一様輸出實際時間的電子設(shè)備,一般會是集成電路,因此也稱為時鐘芯片。實時時鐘芯片
    發(fā)表于 02-25 18:29

    N32G45的工程項目如何添加AT組件?

    目前使用的是N32G45的工程項目,需要添加AT組件,然后我根據(jù)文檔發(fā)現(xiàn)沒有AT的代碼,從rtthread studio新建的項目中把AT文件夾復(fù)制過來,在其中使用ENV工具配置,手動將程序全都放進工程中新建的文件夾,編譯的時候發(fā)現(xiàn)沒有,下載了at_device軟件版之后不知道怎么配置了。
    發(fā)表于 09-07 16:52

    N32G45x_N32G4FR_N32WB452_GCC開發(fā)環(huán)境應(yīng)用筆記

    AN_N32G45x_N32G4FR_N32WB452_GCC開發(fā)環(huán)境應(yīng)用筆記_V1
    發(fā)表于 11-07 15:05 ?17次下載

    國民技術(shù)N32G45XVL-STB開發(fā)版資料

    國民技術(shù)N32G45XVL-STB開發(fā)版資料,本資料包含原理圖源文件、PCB源文件以及N32G45XVL-STB開發(fā)板硬件使用手冊
    發(fā)表于 11-07 15:23 ?0次下載

    N32G45x系列用戶手冊

    N32G45x系列用戶手冊
    發(fā)表于 11-10 19:50 ?2次下載
    <b class='flag-5'>N32G45</b>x系列用戶手冊

    N32G45x系列用戶手冊

    N32G45x系列用戶手冊
    發(fā)表于 11-10 19:50 ?0次下載
    <b class='flag-5'>N32G45</b>x系列用戶手冊

    N32G45x系列用戶手冊

    N32G45x系列用戶手冊
    發(fā)表于 11-10 19:50 ?0次下載
    <b class='flag-5'>N32G45</b>x系列用戶手冊

    基于N32G45的按鍵驅(qū)動

    N32G45系列集成了最新一代嵌入式ARM Cortex?-M4F處理器,在Cortex?-M3內(nèi)核的基礎(chǔ)上強化了運算能力、新增加了浮點運算處理單元(FPU)、DSP和并行計算指令,提供1.25DMIPS/MHz的優(yōu)異性能。
    的頭像 發(fā)表于 12-04 10:44 ?1846次閱讀
    基于<b class='flag-5'>N32G45</b>的按鍵驅(qū)動

    如何在KW45-EVK上使用RTC

    電子發(fā)燒友網(wǎng)站提供《如何在KW45-EVK上使用RTC.pdf》資料免費下載
    發(fā)表于 01-03 09:41 ?0次下載
    如何在KW<b class='flag-5'>45</b>-EVK上使用<b class='flag-5'>RTC</b>