娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

簡介

"RTC"是Real Time Clock 的簡稱,意為實時時鐘。即,提供類似于 PC 上的時間記錄信息的功能。既然是實時時鐘,則至少應(yīng)該有秒、分、時等信息。也可以直觀的把他理解成為一個計數(shù)器,一直累加。但又不同于 CPU 上電后的那些計數(shù)器,對于 RTC ,需要支持的是掉電后的繼續(xù)計數(shù)(存在備用電源)。所謂掉電,是指電源Vpp斷開的情況下,為了RTC外設(shè)掉電可以繼續(xù)運行,必須給STM32芯片通過VBAT引腳街上鋰電池.當主電源VDD有效時,由VDD給RTC外設(shè)供電.當VDD掉電后,由VBAT給RTC外設(shè)供電.無論由什么電源供電,RTC中的數(shù)據(jù)始終都保存在屬于RTC的備份域中,如果主電源和VBA都掉電,那么備份域中保存的所有數(shù)據(jù)都將丟失.(備份域除了RTC模塊的寄存器,還有42個16位的寄存器可以在VDD掉電的情況下保存用戶程序的數(shù)序,系統(tǒng)復(fù)位或電源復(fù)位時,這些數(shù)據(jù)也不會被復(fù)位). 


STM32 的 RTC 操作,主要功能由三部分組成:


電源配置


后備(BKP配置)


RTC 配置


時鐘

RTC 時鐘可以選擇三種時鐘源的輸入:


1. 高速外部時鐘 HSE 的 128 分頻


2. 低速外部時鐘 LSE


3. 低速內(nèi)部時鐘 LSI

針對單板上,我們選擇 LSE 32.768kHz 的 LSE 作為 RTC 的時鐘輸入。

當主電源掉電的時候,由Vbat進行供電:

工作原理

灰色部分為備用區(qū)域,系統(tǒng)掉電后,由后備電源持續(xù)供電,寄存器相關(guān)的值會持續(xù)存在并持續(xù)工作。同時,此部分的復(fù)位也單獨存在 BKP 復(fù)位部分,即通過對 BKP 的復(fù)位來進行此部分的復(fù)位。


可以看到, RTC CLK 供給 RTC 模塊時,首先通過一個分頻器,進行分頻,經(jīng)過分頻器后的時鐘 TR_CLK 用于后續(xù)的計數(shù)器使用。RTC 支持鬧鐘功能,即,在 RTC_ALR 寄存器設(shè)置一個期望的值,RTC_CNT 在 TR_CLK 下進行計數(shù),當計數(shù)器的值到達了 RTC_ALR ,則產(chǎn)生鬧鐘事件。


注:普通情況下,通過計算,使得 RTC 計數(shù)器能以 1s 一次的方式進行計數(shù),這樣能夠滿足基本使用。


除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系統(tǒng)寄存器都由系統(tǒng)復(fù)位或電源復(fù)位進行異步復(fù)位。

RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器僅能通過備份域復(fù)位信號復(fù)位。


中斷

RTC 支持 3 個中斷:


1. 秒中斷:即經(jīng)過分頻器的時鐘 TR_CLK 每次計數(shù)產(chǎn)生的中斷


2. 溢出中斷 : 計數(shù)器是 32bits 的,當計數(shù)器達到上限的時候產(chǎn)生的中斷


3. 鬧鐘中斷:當計數(shù)器的值達到配置的期望值 (RTC_ALR) 的時候產(chǎn)生鬧鐘


這三個中斷均需要配置對應(yīng)的中斷使能位,進行使能后,方可使用。

訪問限制

由于 RTC 處于 STM32 的備用區(qū)域(BKP),同時 RTC  的核心獨立于 APB1,同時又是使用了 APB1 進行訪問,此處,在訪問 RTC 相關(guān)寄存器的時候,硬件有跨時鐘域的同步操作,需要有幾點注意的地方:


A. 訪問 RTC 相關(guān)寄存器之前,首先需要開啟 BKP 和 PWR 相關(guān)的時鐘


B. 設(shè)置 PWR 的 DBP 位,使能對后備寄存器和RTC的訪問


C. 若在讀取 RTC 寄存器時,RTC 的 APB1 接口曾經(jīng)處于禁止狀態(tài),則軟件首先必須等待 RTC_CRL 寄存器中的 RSF 位(寄存器同步標志)被硬件置’1’。


D. 對RTC任何寄存器的寫操作,都必須在前一次寫操作結(jié)束后進行。可以通過查詢RTC_CR寄存器中的RTOFF狀態(tài)位,判斷RTC寄存器是否處于更新中。僅當RTOFF狀態(tài)位是’1’時,才可以寫入RTC寄存器。


C. 使能 RTC 進入配置模式,在配置模式下進行寄存器更新,設(shè)置完后,退出配置模式


針對最后一項D,訪問過程如下:


    D1. 查詢RTOFF位,直到RTOFF的值變?yōu)椤?’


    D2. 置 CNF 值為1,進入配置模式


    D3. 對一個或多個RTC寄存器進行寫操作


    D4. 清除CNF標志位,退出配置模式


    D5. 查詢RTOFF,直至RTOFF位變?yōu)椤?’以確認寫操作已經(jīng)完成。


配置過程

1. 開啟 PWR,BKP 區(qū)域的時鐘


2. 寫 PWR 的 DBP 位,使能后備區(qū)域的訪問權(quán)限


3. Deinit RTC 模塊


4. 配置 LSE 的時鐘開啟,并等待 LSE 穩(wěn)定(32.768kHz)


5. 選擇 RTC 的時鐘為 LSE(注意,此部分不在 RTC 寄存器,故,無需滿足”訪問限制”章節(jié)的限制)


6. 使能 RTC


7. 由于是上電配置,故 APB1 之前出于禁止狀態(tài),故需要等待 RSF 置位


8. 等待 RTOFF 置位,即等待 RTC 出于 no busy


9. 設(shè)置分頻系數(shù)為 32768 - 1,并等待 RTOFF 置位(等待寫完成)


10. 配置使能秒中斷,并等待 RTOFF 置位(等待寫完成)


11. 初始化當前時間(這個可以隨意設(shè)置)


12. 配置 NVIC


注意:為了使上電后,RTC 只被配置一次,這里使用了一個備用寄存器來作為 RTC 是否被配置過的標志(如果使用軟件的一個變量,掉電后,變量的值會丟掉)。每次上電的時候進行 check, 如果配置過 RTC,則不再配置。


這里測試的時候,使用一個全局變量進行讀數(shù)據(jù),每次在秒中斷中,將數(shù)據(jù)讀出并解析。(因為寄存器中的計數(shù)器的單位是s秒)


當然,在中斷處理程序 RTC_IRQHandler ,對 clear 中斷 pending 的標志,也是需要等待寫完成的 (RTOFF 置位)


代碼如下:


#define LSE_CLK_32768KHZ     32768

#define RTC_CFG_DONE        0xAAAA

#define LEAP_YEAR_SEC       31622400

#define NORMAL_YEAR_SEC     31536000

#define A_DAY_SEC           86400

#define A_HOUR_SEC          3600

#define A_MIN_SEC           60

 

#define MAX_DAY             10

#define ONE_DAY_HOURS       24

#define ONE_HOUR_MIN        60

#define ONE_MIN_SEC         60

#define MAX_SEC             (MAX_DAY * ONE_DAY_HOURS * ONE_HOUR_MIN * ONE_MIN_SEC)

 

typedef struct {

    uint32_t day;

    uint32_t hour;

    uint32_t min;

    uint32_t sec;

} SK_TIME_t;

 

SK_TIME_t g_stCurrentTime;

 

static void _setCurrentTime(SK_TIME_t *cur_time)

{

    // Test RTC At 2018.7.13 -- 00:26:00

    RTC_SetCounter(0x00);

    RTC_WaitForLastTask();

}

 

void SK_getCurrentTime(SK_TIME_t *cur_time)

{

    uint32_t secCount = RTC_GetCounter();

    uint32_t sec = secCount % A_DAY_SEC;

 

    cur_time->day   = secCount / A_DAY_SEC ;

    cur_time->hour  = sec / 3600;

    cur_time->min   = (sec % 3600) / 60;

    cur_time->sec   = (sec % 3600) % 60;

}

 

static uint8_t SK_RTCIsConfiged(void)

{

    return ((BKP_ReadBackupRegister(BKP_DR1) == RTC_CFG_DONE) ? 1 : 0);

}

 

static void SK_RTCNVICConfig(void)

{

    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 

    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

}

 

static void SK_RTC_Configuration(void)

{

    // Step 1 : Open Power & Backup zone Clock

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

 

    // Step 2 : Set Power register to allow to access backup domain

    PWR_BackupAccessCmd(ENABLE);

 

    // Step 3 : Rest BackUp domain

    BKP_DeInit();

 

    // Step 4 : Enable LSE Clock and wait for ready

    RCC_LSEConfig(RCC_LSE_ON);

    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

 

    // Step 5 : Configure the LSE as RTC Clock input

    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

 

    // Step 6 : Enable RTC Clock

    RCC_RTCCLKCmd(ENABLE);

 

    // Step 7 : Because APB1 was reset when power on, follow datasheet, must wait RSF

    RTC_WaitForSynchro();

 

    // Step 8 : Wait until last write was finished

    RTC_WaitForLastTask();

 

    // Step 9 : Set prescaler as 32767

    // RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)

    RTC_SetPrescaler(LSE_CLK_32768KHZ - 1);

    RTC_WaitForLastTask();

 

    // Step 10 : Enable second interrupt

    RTC_ITConfig(RTC_IT_SEC, ENABLE);

    RTC_WaitForLastTask();

}

 

 

void SK_RTCInit(void)

{

    // First Configure RTC

    if (!SK_RTCIsConfiged())

    {

        SK_RTC_Configuration();

        _setCurrentTime(&stTestRTCTime);

        BKP_WriteBackupRegister(BKP_DR1, RTC_CFG_DONE);

    }

    else

    {

        RTC_WaitForSynchro();

        RTC_ITConfig(RTC_IT_SEC, ENABLE);

        RTC_WaitForLastTask();

    }

    SK_RTCNVICConfig();

    SK_getCurrentTime(&g_stCurrentTime);

}

 

void SK_RTCDeInit(void)

{

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    PWR_BackupAccessCmd(ENABLE);

    BKP_DeInit();

}

 

void RTC_IRQHandler(void)

{

    if (RTC_GetITStatus(RTC_IT_SEC) != RESET)

    {

        if (RTC_GetCounter() >= MAX_SEC)

        {

            RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

            PWR_BackupAccessCmd(ENABLE);

            RTC_WaitForLastTask();

            RTC_SetCounter(0x0);

            RTC_WaitForLastTask();

        }

        SK_getCurrentTime(&g_stCurrentTime);

    }

    if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)

    {

        RTC_ClearITPendingBit(RTC_IT_ALR);

    }

    RTC_ClearITPendingBit(RTC_IT_SEC | RTC_IT_OW);

    RTC_WaitForLastTask();

}

關(guān)鍵字:STM32F103ZET6  RTC  實時時鐘 引用地址:STM32F103ZET6 — RTC

上一篇:STM32F103ZET6 — EXTI
下一篇:STM32F103ZET6 — TIM6/TIM7

推薦閱讀

上個月底,一加手機在美國紐約舉行了新品發(fā)布會。正式發(fā)布了一加6T新機。配置方面,一加6T配備6.41英寸、縱橫比19.5:9、分辨率為2340*1080的AMOLED水滴屏,采用第六代康寧大猩猩保護玻璃;搭載高通驍龍845處理器;配置6GB/8GB+128GB/256GB機身存儲規(guī)格;內(nèi)置3700mAh電池,支持20W快充;支持光感屏幕指紋識別。一加6T的起售價為549美元(約合人民幣3822元)...
  1 測量方法  測量紋波首先必須知道正確的測量方法,很多工程師拿數(shù)字示波器測量出來幾百mV的紋波值,和參數(shù)規(guī)格一比,完全差了幾十的倍數(shù)這個肯定是測量方式不正確造成。下面以鼎陽公司的SDS1000為例,進行常規(guī)測量所采用的正確操作步驟:  1、 打開SDS1000的帶寬限制功能,限制示波器帶寬為20MHz,或者是打開數(shù)字濾波選擇低通濾波功能,調(diào)節(jié)低...
日前,由俄羅斯雙院院士王成彪領(lǐng)銜,總投資20億元的彗晶芯片散熱新材料項目正式簽約落戶浙江杭州蕭山經(jīng)濟技術(shù)開發(fā)區(qū)。蕭山經(jīng)濟技術(shù)開發(fā)區(qū)消息顯示,彗晶芯片散熱新材料制造項目產(chǎn)品散熱系數(shù)在國內(nèi)處于領(lǐng)先水平,可面向數(shù)據(jù)中心、5G設(shè)備、AI芯片、泛電子消費品終端、新能源汽車、IC封裝等眾多業(yè)務(wù)領(lǐng)域提供具備競爭力的解決方案。該項目今年3月已獲美國紅杉...
STM32F103ZET6 支持 20 個外部中斷輸入(EXIT0~EXIT19),其中有4個:EXTI線16連接到PVD輸出EXTI線17連接到RTC鬧鐘事件EXTI線18連接到USB喚醒事件EXTI線19連接到以太網(wǎng)喚醒事件(只適用于互聯(lián)型產(chǎn)品)另外的16個均可以作為外部輸入中斷,其中:EXIT0~EXIT4 有獨立的中斷向量EXIT6~EXIT9 共享一個中斷向量 EXTI9_5_IRQHandlerEXIT10~EXIT16 共享一個...

史海拾趣

問答坊 | AI 解惑

基于單片機的電子密碼鎖實際設(shè)計

基于單片機的電子密碼鎖實際設(shè)計…

查看全部問答∨

MMU地址映射表問題!

目前在做一個SRAM驅(qū)動,寫成的是流驅(qū)動,驅(qū)動寫好了! 但是在做MMU地址映射表時出問題了!具體如下: 原來的g_oalAddressTable[DATA] 表為 g_oalAddressTable         DCD     0x80000000, ...…

查看全部問答∨

Pos機的原理,用什么語言開發(fā)?C#?Java?

公司交給我讓我先了解下pos機,但是我對Pos機一點不了解,公司做的pos機是和銀行沒有關(guān)系的。就是給本公司的會員使用 想問下大蝦: 1:Pos機的相關(guān)硬件有什么設(shè)備 2:用什么語言開發(fā),能運行到什么系統(tǒng),是否認能兼容 3:軟硬件兩者怎么相互嵌 ...…

查看全部問答∨

SD WiFi 插拔之后工作不正常(Wince 5.0) Urgent

SD WiFi在首次插入后均可以與指定AP(Access Point)成功連接,后經(jīng)過一次拔插后,就無法工作了,只有重新系統(tǒng)才可以。經(jīng)Trace log可知,無法得到BSSI List,其列表為空,由此可知,WiFi Adapter處于異常狀態(tài),至今沒有找到具體原因,曾試過NdisReset ...…

查看全部問答∨

STM32 ,用固件庫寫一個流水燈的程序需要哪些庫?

STM32 ,用固件庫寫一個流水燈的程序需要哪些庫?我知道肯定要用GPIO,RCC要用到USART,NVIC嗎?為什么啊? 初學(xué)者求助…

查看全部問答∨

方法和技術(shù)——《使用2790型數(shù)字源表開關(guān)系統(tǒng)測試雙安全氣囊充氣機模塊》

機械臂接口 – 數(shù)字I/O 2790內(nèi)置的數(shù)字接口能夠直接控制器件機械臂。數(shù)字接口包含五路TTL兼容數(shù)字輸出和兩路輸入,以及外部供電的繼電器和地線連接。五路輸出提供測試通過/失敗通知。可以定義兩個上限和兩個下限用于任何數(shù)字萬用表測試。每個測 ...…

查看全部問答∨

有誰用過CC430及CC1111的嗎?

本帖最后由 paulhyde 于 2014-9-15 03:39 編輯 有誰用過CC430及CC1111的嗎?有沒有相關(guān)的資料,最好是中文的  …

查看全部問答∨

求教FPGA程序JTAG及AS口加載問題

今天調(diào)新板子,程序從JTAG和AS口都下不進去,且提示不同。 加載JTAG,程序燒到48%,出ERROR:  CFG_DONE pin failed to go high. 用萬用表測,CFG_DONE 角經(jīng)電阻10K接到3.3V,且 CFG_nCE 已接地。 換成AS口,在選擇目標POF文件時就出錯 ...…

查看全部問答∨

我想用單片機制作一個比較大音樂顯示屏,

我想用單片機制作一個比較大音樂顯示屏,但是我只是初學(xué)者。求大神給點電路圖和材料列表。謝謝…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 康乐县| 新密市| 博爱县| 璧山县| 通山县| 枞阳县| 克山县| 定州市| 台中县| 垦利县| 龙陵县| 五寨县| 舞阳县| 新龙县| 嘉兴市| 黔西县| 汉沽区| 云和县| 偃师市| 丰顺县| 霍城县| 大安市| 博爱县| 禹城市| 永寿县| 达拉特旗| 襄汾县| 砀山县| 长葛市| 阳西县| 湘潭县| 中方县| 灵台县| 黔南| 武强县| 怀仁县| 淅川县| 嵊泗县| 包头市| 浮山县| 商洛市|