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

歷史上的今天

今天是:2025年06月14日(星期六)

2020年06月14日 | STM32基于固件庫學(xué)習(xí)筆記(11)RTC實時時鐘

發(fā)布者:翅膀小鷹 來源: eefocus關(guān)鍵字:STM32  固件庫  RTC  實時時鐘 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

實時時鐘(RTC)

小容量產(chǎn)品是指閃存存儲器容量在16K至32K字節(jié)之間的STM32F101xx、STM32F102xx和STM32F103xx微控制器

中容量產(chǎn)品是指閃存存儲器容量在64K至128K字節(jié)之間的STM32F101xx、STM32F102xx和STM32F103xx微控制器。

大容量產(chǎn)品是指閃存存儲器容量在256K至512K字節(jié)之間的STM32F101xx和STM32F103xx微控制器。

互聯(lián)型產(chǎn)品是指STM32F105xx和STM32F107xx微控制器。


主要特性

● 可編程的預(yù)分頻系數(shù):分頻系數(shù)最高為20 。

● 32位的可編程計數(shù)器,可用于較長時間段的測量。

● 2個分離的時鐘:用于APB1接口的PCLK1和RTC時鐘(RTC時鐘的頻率必須小于PCLK1時鐘頻率的四分之一以上)。

● 可以選擇以下三種RTC的時鐘源:

─ HSE時鐘除以128;

─ LSE振蕩器時鐘;

─ LSI振蕩器時鐘

● 2個獨(dú)立的復(fù)位類型:

─ APB1接口由系統(tǒng)復(fù)位;

─ RTC核心(預(yù)分頻器、鬧鐘、計數(shù)器和分頻器)只能由后備域復(fù)位。

● 3個專門的可屏蔽中斷:

─ 鬧鐘中斷,用來產(chǎn)生一個軟件可編程的鬧鐘中斷。

─ 秒中斷,用來產(chǎn)生一個可編程的周期性中斷信號(最長可達(dá)1秒)。

─ 溢出中斷,指示內(nèi)部可編程計數(shù)器溢出并回轉(zhuǎn)為0的狀態(tài)。


STM32 RTC 時鐘簡介

STM32 的實時時鐘(RTC)是一個獨(dú)立的定時器。STM32 的 RTC 模塊擁有一組連續(xù)計數(shù)的計數(shù)器,在相應(yīng)軟件配置下,可提供時鐘日歷的功能。修改計數(shù)器的值可以重新設(shè)置系統(tǒng)當(dāng)前的時間和日期。


RTC 模塊和時鐘配置系統(tǒng)(RCC_BDCR 寄存器)是在后備區(qū)域,即在系統(tǒng)復(fù)位或從待機(jī)模式喚醒后 RTC 的設(shè)置和時間維持不變。但是在系統(tǒng)復(fù)位后,會自動禁止訪問后備寄存器和 RTC,以防止對后備區(qū)域(BKP)的意外寫操作。所以在要設(shè)置時間之前, 先要取消備份區(qū)域(BKP)寫保護(hù)。


RTC 由兩個主要部分組成(參見上圖 ),第一部分(APB1 接口)用來和 APB1 總線相連。此單元還包含一組 16 位寄存器,可通過 APB1 總線對其進(jìn)行讀寫操作。APB1 接口由 APB1 總線時鐘驅(qū)動,用來與 APB1 總線連接。


另一部分(RTC 核心)由一組可編程計數(shù)器組成,分成兩個主要模塊。第一個模塊是 RTC 的預(yù)分頻模塊,它可編程產(chǎn)生 1 秒的 RTC 時間基準(zhǔn) TR_CLK。RTC 的預(yù)分頻模塊包含了一個 20位的可編程分頻器(RTC 預(yù)分頻器)。如果在 RTC_CR 寄存器中設(shè)置了相應(yīng)的允許位,則在每個TR_CLK 周期中 RTC 產(chǎn)生一個中斷(秒中斷)。第二個模塊是一個 32 位的可編程計數(shù)器,可被初始化為當(dāng)前的系統(tǒng)時間,一個 32 位的時鐘計數(shù)器,按秒鐘計算,可以記錄 4294967296 秒,約合 136 年左右,作為一般應(yīng)用,這已經(jīng)是足夠了的。


復(fù)位過程

除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系統(tǒng)寄存器都由系統(tǒng)復(fù)位或電源復(fù)位進(jìn)行異步復(fù)位。RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器僅能通過備份域復(fù)位信號復(fù)位。


讀RTC寄存器

RTC核完全獨(dú)立于RTC APB1接口。

軟件通過APB1接口訪問RTC的預(yù)分頻值 、 計數(shù)器值和鬧鐘值。但是,相關(guān)的可讀寄存器只在與RTC APB1時鐘進(jìn)行重新同步的RTC時鐘的上升沿被更新。RTC標(biāo)志也是如此的。


這意味著,如果APB1接口曾經(jīng)被關(guān)閉,而讀操作又是在剛剛重新開啟APB1之后,則在第一次的內(nèi)部寄存器更新之前,從APB1上讀出的RTC寄存器數(shù)值可能被破壞了(通常讀到0)。下述幾種


情況下能夠發(fā)生這種情形:

● 發(fā)生系統(tǒng)復(fù)位或電源復(fù)位。

● 系統(tǒng)剛從待機(jī)模式喚醒。

4.3 ● 系統(tǒng)剛從停機(jī)模式喚醒。

所有以上情況中,APB1接口被禁止時(復(fù)位、無時鐘或斷電)RTC核仍保持運(yùn)行狀態(tài)。

因此,若在讀取RTC寄存器時,RTC的APB1接口曾經(jīng)處于禁止?fàn)顟B(tài),則軟件首先必須等待RTC_CRL寄存器中的RSF位(寄存器同步標(biāo)志)被硬件置’1’。


注: RTC 的 APB1 接口不受 WFI 和 WFE 等低功耗模式的影響。

配置RTC寄存器

必須設(shè)置RTC_CRL寄存器中的CNF位,使RTC進(jìn)入配置模式后,才能寫入RTC_PRL、RTC_CNT、RTC_ALR寄存器。

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


配置過程: 配置過程:

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

置CNF值為1,進(jìn)入配置模式

對一個或多個RTC寄存器進(jìn)行寫操作

清除CNF標(biāo)志位,退出配置模式

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

僅當(dāng)CNF標(biāo)志位被清除時,寫操作才能進(jìn)行,這個過程至少需要3個RTCCLK周期。

RTC標(biāo)志的設(shè)置

在每一個RTC核心的時鐘周期中,更改RTC計數(shù)器之前設(shè)置RTC秒標(biāo)志(SECF)。

在計數(shù)器到達(dá)0x0000之前的最后一個RTC時鐘周期中,設(shè)置RTC溢出標(biāo)志(OWF)。

在計數(shù)器的值到達(dá)鬧鐘寄存器的值加1(RTC_ALR+1)之前的RTC時鐘周期中,設(shè)置RTC_Alarm和RTC鬧鐘標(biāo)志(ALRF)。對RTC鬧鐘的寫操作必須使用下述過程之一與RTC秒標(biāo)志同步:

● 使用RTC鬧鐘中斷,并在中斷處理程序中修改RTC鬧鐘和/或RTC計數(shù)器。

● 等待RTC控制寄存器中的SECF位被設(shè)置,再更改RTC鬧鐘和/或RTC計數(shù)器。


RTC 正常工作的一般配置步驟

1. 使能BPK PWR時鐘、中斷初始化


//必須先使能電源時鐘和備份區(qū)域時鐘

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  //中斷初始化 

  NVIC_InitTypeDef NVIC_InitStruct;

  NVIC_InitStruct.NVIC_IRQChannel =RTC_IRQn;

  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStruct);


2. 取消備份區(qū)寫保護(hù)


  PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后備寄存器訪問


3. 復(fù)位備份區(qū)域,開啟外部低速振蕩器


  BKP_DeInit();//復(fù)位備份區(qū)域

  RCC_LSEConfig(RCC_LSE_ON);//開啟外部低速振蕩器

  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);//檢查指定的 RCC 標(biāo)志位設(shè)置與否,等待低速晶振就緒


4. 配置RCT時鐘源


  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //選擇 LSE 作為 RTC 時鐘  

  RCC_RTCCLKCmd(ENABLE); //使能 RTC 時鐘

  RTC_WaitForLastTask(); //等待最近一次對 RTC 寄存器的寫操作完成

  RTC_WaitForSynchro(); //等待 RTC 寄存器同步

  RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中斷

  RTC_WaitForLastTask(); //等待最近一次對 RTC 寄存器的寫操作完成


5. 設(shè)置 RTC 的分頻,以及配置 RTC 時鐘


  RTC_EnterConfigMode();/// 允許配置

  RTC_SetPrescaler(32767);//設(shè)置 RTC 時鐘分頻數(shù) 晶振32.768KHz

  RTC_ITConfig(RTC_IT_SEC,ENABLE); //使能 RTC 秒中斷 

  RTC_SetCounter(0);//最后在配置完成之后


6. 更新配置,設(shè)置RTC中斷分組


  RTC_ExitConfigMode();//退出配置模式,更新配置 

//往備份區(qū)域?qū)懹脩魯?shù)據(jù)

  void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);

//讀取備份區(qū)域指定寄存器的用戶數(shù)據(jù)

 BKP_ReadBackupRegister(uint16_t BKP_DR);


7. 編寫中斷服務(wù)函數(shù)

注:中斷標(biāo)志

RTC_FLAG_RTOFF RTC 操作 OFF 標(biāo)志位

RTC_FLAG_RSF 寄存器已同步標(biāo)志位

RTC_FLAG_OW 溢出中斷標(biāo)志位

RTC_FLAG_ALR 鬧鐘中斷標(biāo)志位

RTC_FLAG_SEC 秒中斷標(biāo)志位


void RTC_IRQHandler(void)

{

  if (RTC_GetITStatus(RTC_IT_SEC) != RESET) //秒鐘中斷

  {

    data++;

    printf("time:%dt",data);

  }

  RTC_ClearITPendingBit(RTC_IT_SEC); //清中斷

  RTC_WaitForLastTask();

}


完整程序

#include "stm32f10x.h"  

#include "stdio.h"

int fputc(int ch, FILE *f)

{

  while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

  USART_SendData(USART1,(uint8_t)ch);

  return ch;

}

void delay_ms(u16 time)

{    

   u16 i = 0;  

   while(time--)

   {

      i = 12000;  

      while(i--);    

   }

}

u16 data = 0;

void Usart_Init()

  GPIO_InitTypeDef GPIO_ITDef1;

  GPIO_InitTypeDef GPIO_ITDef;

  USART_InitTypeDef  USART_ITDef;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級

//掛載時鐘(復(fù)用PA) 串口時鐘使能,GPIO 時鐘使能,復(fù)用時鐘使能

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

//PA9 TXD初始化

  GPIO_ITDef.GPIO_Pin = GPIO_Pin_9;//PA9 TXD

  GPIO_ITDef.GPIO_Mode = GPIO_Mode_AF_PP;////復(fù)用推挽輸出

  GPIO_ITDef.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA,&GPIO_ITDef);

//PA10 TXD初始化

  GPIO_ITDef1.GPIO_Pin = GPIO_Pin_10;//PA10 RXD

  GPIO_ITDef1.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入

  GPIO_Init(GPIOA,&GPIO_ITDef1);

  

//USART初始化

  USART_ITDef.USART_BaudRate = 115200;//波特率

  USART_ITDef.USART_WordLength = USART_WordLength_8b;//發(fā)送數(shù)據(jù)長度

  USART_ITDef.USART_StopBits = USART_StopBits_1; //一個停止位   

  USART_ITDef.USART_Parity = USART_Parity_No; //無奇偶校驗位     

  USART_ITDef.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制

  USART_ITDef.USART_Mode = USART_Mode_Tx| USART_Mode_Rx ;//發(fā)送模式 

  USART_Init(USART1,&USART_ITDef);

  USART_Cmd(USART1, ENABLE);//使能串口

}

void RTC_Init(void)

{

  //1.使能BPK PWR時鐘

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  

  NVIC_InitTypeDef NVIC_InitStruct;

  NVIC_InitStruct.NVIC_IRQChannel =RTC_IRQn;

  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStruct);

  //2.取消備份區(qū)寫保護(hù)

  PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后備寄存器訪問

  //3.復(fù)位備份區(qū)域,開啟外部低速振蕩器

  BKP_DeInit();//復(fù)位備份區(qū)域

  RCC_LSEConfig(RCC_LSE_ON);//開啟外部低速振蕩器

  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);//檢查指定的 RCC 標(biāo)志位設(shè)置與否,等待低速晶振就緒

  //4.配置RCT時鐘源

  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //選擇 LSE 作為 RTC 時鐘  

  RCC_RTCCLKCmd(ENABLE); //使能 RTC 時鐘

  

  RCC_RTCCLKCmd(ENABLE); //使能 RTC 時鐘

  RTC_WaitForLastTask(); //等待最近一次對 RTC 寄存器的寫操作完成

  RTC_WaitForSynchro(); //等待 RTC 寄存器同步

  RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中斷

  RTC_WaitForLastTask(); //等待最近一次對 RTC 寄存器的寫操作完成

  

  //5.設(shè)置 RTC 的分頻,以及配置 RTC 時鐘

  RTC_EnterConfigMode();/// 允許配置

  RTC_SetPrescaler(32767);//設(shè)置 RTC 時鐘分頻數(shù) 晶振32.768KHz

  RTC_ITConfig(RTC_IT_SEC,ENABLE); //使能 RTC 秒中斷

  

  RTC_SetCounter(0);//最后在配置完成之后

  //6.更新配置,設(shè)置RTC中斷分組。

  RTC_ExitConfigMode();//退出配置模式,更新配置  

}  

int main(void)

{

  Usart_Init();

  RTC_Init();

  while(1)

  {

   ;   

  }     

}

//每秒觸發(fā)一次

void RTC_IRQHandler(void)

{

  if (RTC_GetITStatus(RTC_IT_SEC) != RESET) //秒鐘中斷

  {

    data++;//每一秒+1

    printf("time:%dt",data);//串口打印當(dāng)前時間值

  }

  RTC_ClearITPendingBit(RTC_IT_SEC); //清中斷

  RTC_WaitForLastTask();

}


常用資料:

  STM32F10x_StdPeriph_Lib_V3.5.0(官方固件庫)

  鏈接:《STM32固件庫使用手冊的中文翻譯版》    提取碼:4lkx

  鏈接:(keil5 IAR 等常用助手)           提取碼:xzgj

  鏈接:《STM32中文參考手冊V10》         提取碼:j748

關(guān)鍵字:STM32  固件庫  RTC  實時時鐘 引用地址:STM32基于固件庫學(xué)習(xí)筆記(11)RTC實時時鐘

上一篇:STM32F4學(xué)習(xí)筆記之GPIO(使用固件庫)
下一篇:STM32基于固件庫學(xué)習(xí)筆記(3)串口的收發(fā)功能+WiFi基礎(chǔ)配置

推薦閱讀

現(xiàn)代機(jī)器人的研究始于20世紀(jì)中期,其技術(shù)背景是和自動化的發(fā)展,以及原子能的開發(fā)利用。自1946年第一臺數(shù)字電子計算機(jī)問世以來,計算機(jī)取得了驚人的進(jìn)步,向高速度、大容量、低價格的方向發(fā)展。大批量生產(chǎn)的迫切需求推動了自動化技術(shù)的進(jìn)展,其結(jié)果之一便是1952年數(shù)控機(jī)床的誕生。與數(shù)控機(jī)床相關(guān)的控制、機(jī)械零件的研究又為機(jī)器人的開發(fā)奠定了基礎(chǔ)。 另...
作者簡介:知乎id ryan woo,硅谷軟件工程師,第一批特斯拉Model 3車主之前筆者曾在知乎上發(fā)表過兩篇關(guān)于Tesla Autopilot 1.0的文章,感興趣的讀者可在知乎上查找「Ryan Woo:Tesla自動駕駛的前世今生」、「Ryan Woo:Tesla 自動駕駛2.0」。今天筆者將主要剖析Tesla全自動駕駛之路的最近一個進(jìn)程——從 Autopilot 2.0 到 3.0的升級。 雖然 HW ...
縱觀浙江省歷年重大項目,2020年前半導(dǎo)體類項目數(shù)量少、占比極低,然而到了2020年,半導(dǎo)體項目的數(shù)量忽然躍升。這似乎在一定程度上反應(yīng)浙江集成電路風(fēng)向的調(diào)整。據(jù)集微網(wǎng)統(tǒng)計,2020年進(jìn)入浙江省重點項目的集成電路類項目,并不完全是2020年前后規(guī)劃建設(shè)的。其中,中芯紹興項目早已于2018年簽約落地。2018年3月,中芯國際、紹興市政府、盛洋集團(tuán)共同出資設(shè)...

史海拾趣

小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(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
主站蜘蛛池模板: 田林县| 聂拉木县| 繁昌县| 阿克| 确山县| 巴南区| 屯门区| 海原县| 锦屏县| 方城县| 绥阳县| 台州市| 乳山市| 鄯善县| 青浦区| 陇川县| 青浦区| 巫山县| 贡山| 石台县| 称多县| 济南市| 保亭| 济南市| 三穗县| 五家渠市| 枣阳市| 河东区| 兴国县| 射洪县| 阿拉善盟| 沭阳县| 西乌| 安乡县| 辽阳县| 阿拉尔市| 巨野县| 教育| 秭归县| 辽阳县| 越西县|