主頁 > 作業系統 > STM32-RTC

STM32-RTC

2023-06-01 10:26:30 作業系統

RTC簡介

  1. RTC是一個獨立的定時器,它可以連續計數和提供了時鐘日歷功能,使用BKP暫存器存盤具有掉電保存功能
  2. 存粹的計時的,
  3. 觸發中斷

    ——鬧鐘中斷,用來產生一個可編程的鬧鐘中斷,

    ——秒中斷,用來產生一個可編程的周期性中斷信號(最快1秒,最慢1秒,只能1秒)

    ——溢位中斷,指示內部可編程計數器溢位并回傳為0的狀態,

  1. RTC的特性掉電之后保存資料,但是f1的日期資料是保存到運行暫存器的(掉電丟失)
  2. 它是一個 32 位的計數器只能向上計 數,它的時鐘來源有三種,分別為高速外部時鐘的 128 分頻( HSE/128 )、 低速內部時鐘 LSI 以及低速外部時鐘 LSE,
  3. 時間暫存器,日期暫存器(32位的)分別存盤時分秒,年月日,

啟用RTC流程:

開始遇到的問題:

  1. 

  2. 

   3. 

   4. 

   5. 

  6.   開啟串口用于列印時間資訊:

STM32CubeMX設定RTC就完成了,以下是代碼:

  1.  定義結構體變數,獲取資料

 RTC_TimeTypeDef GET_Time; /* 獲取時間結構體 */ 

 RTC_DateTypeDef GET_Date; /* 獲取時期結構體 */  

??2.  列印資料
        /* 列印時間結構體資料 */
        HAL_RTC_GetDate(&hrtc, &GET_Date, RTC_FORMAT_BIN);
        HAL_RTC_GetTime(&hrtc, &GET_Time, RTC_FORMAT_BIN);
 
        /* 列印時期結構體資料 */
        printf("%04d/%02d/%02d/\r\n",2000+GET_Date.Year,GET_Date.Month,GET_Date.Date);
        printf("%02d:%02d:%02d:\r\n",GET_Time.Hours,GET_Time.Minutes,GET_Time.Seconds);        

        /* 延時 */
        HAL_Delay(1000);

 

 

列印日歷成功

注意:這個是掉電丟失的!,因為f103的RTC功能日期是保存到BKP里面的,但是我門每次復位或掉電之后,都是會重復初始化 void MX_RTC_Init(void)這個函式,所以掉電之后或復位之后重新計時,

怎么掉電不丟失:

  1.  掉電丟失的問題一

   可以看到圖二這里面根據CubeMX里面的配置初始化了存盤時期與時間的結構體(變數)如下圖一

圖一

    /** Initialize RTC and set the Time and Date
    */
    sTime.Hours = 0x20;
    sTime.Minutes = 0x44;
    sTime.Seconds = 0x00;

    if( HAL_RTC_SetTime( &hrtc, &sTime, RTC_FORMAT_BCD ) != HAL_OK )
    {
        Error_Handler();
    }

    DateToUpdate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
    DateToUpdate.Month = RTC_MONTH_MAY;
    DateToUpdate.Date = 0x31;
    DateToUpdate.Year = 0x23;

 

 

void MX_RTC_Init(void): 圖二

  /* RTC init function */
  void MX_RTC_Init(void)
  {
  
    /* USER CODE BEGIN RTC_Init 0 */
  
    /* USER CODE END RTC_Init 0 */
  
    RTC_TimeTypeDef sTime = {0};
   RTC_DateTypeDef DateToUpdate = {0};
 
   /* USER CODE BEGIN RTC_Init 1 */
 
   /* USER CODE END RTC_Init 1 */

   /** Initialize RTC Only
   */
   hrtc.Instance = RTC;
   hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
   hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
   if (HAL_RTC_Init(&hrtc) != HAL_OK)
   {
     Error_Handler();
   }
 
   /* USER CODE BEGIN Check_RTC_BKUP */
 
   /* USER CODE END Check_RTC_BKUP */
 
   /** Initialize RTC and set the Time and Date
   */
   sTime.Hours = 9;
   sTime.Minutes = 40;
   sTime.Seconds = 0;
 
   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
   {
     Error_Handler();
   }
   DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;
   DateToUpdate.Month = RTC_MONTH_JUNE;
   DateToUpdate.Date = 6;
   DateToUpdate.Year = 23;
 
   if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK)
   {
     Error_Handler();
   }
   /* USER CODE BEGIN RTC_Init 2 */
 
   /* USER CODE END RTC_Init 2 */
 
 }

 

  2. 在MX_RTC_Init函式的結尾,把0x7240這段資料寫入BKP某個16位的暫存器里面,之后在MX_RTC_Init函式的開始寫一個判斷BKP某個暫存器是否為0x7240這段資料,如果條件為真則return出函式,這樣就達到了初始化一次的效果了,

     (BKP的特性掉電不丟失,可以去查看手冊)

    (0x7240這段資料可以寫任意數,別太大了)

 

  以下是代碼:

   MX_RTC_Init頭

   /* USER CODE BEGIN Check_RTC_BKUP */
    /* 只初始化一次 */
     if( HAL_RTCEx_BKUPRead( &hrtc,RTC_BKP_DR1 ) == 0x7240 )
     {
         return ;
     }
 
   /* USER CODE END Check_RTC_BKUP */

 

  MX_RTC_Init尾

 HAL_RTCEx_BKUPWrite( &hrtc,RTC_BKP_DR1,0x7240 );  

  2.  掉電丟失的問題二

  f103的RTC日期是不保存的,我門可以利用定時器中斷來計數保存資料,代碼如下:

  1. 開啟RTC定時器

  2.  在stm32f1xx_it.c里面寫,中斷后存資料到指定BKP暫存器

/**
  * @brief This function handles RTC global interrupt.
  */
void RTC_IRQHandler(void)
{
  /* USER CODE BEGIN RTC_IRQn 0 */

  /* USER CODE END RTC_IRQn 0 */
    HAL_RTCEx_RTCIRQHandler(&hrtc);
  /* USER CODE BEGIN RTC_IRQn 1 */
    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR2,hrtc.DateToUpdate.Year);
    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR3,hrtc.DateToUpdate.Month);
    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR4,hrtc.DateToUpdate.Date);
  /* USER CODE END RTC_IRQn 1 */
}

 

 

   3. rtc.c的HAL_RTC_MspInit函式內寫

 __HAL_RTC_ALARM_ENABLE_IT(&hrtc,RTC_IT_SEC);  

  4. 讀BKP暫存器的日期資料到計時變數內

    /* 只初始化一次 */
    if( HAL_RTCEx_BKUPRead( &hrtc,RTC_BKP_DR1 ) == 0x7240 )
    {
        /* 讀BKP暫存器的日期資料到計時變數內 */
        hrtc.DateToUpdate.Year =  HAL_RTCEx_BKUPRead( &hrtc,RTC_BKP_DR2 );
        hrtc.DateToUpdate.Month =  HAL_RTCEx_BKUPRead( &hrtc,RTC_BKP_DR3 );
        hrtc.DateToUpdate.Date =  HAL_RTCEx_BKUPRead( &hrtc,RTC_BKP_DR4 );

        HAL_RTC_GetTime( &hrtc, &sTime, RTC_FORMAT_BIN );
        return ;
    }

 

 

這樣就達到了日期存盤的功能了,

以下是代碼下載鏈接:

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/554026.html

標籤:嵌入式

上一篇:kali-linux運行python腳本時出現”word unexpected (expecting ")")“錯誤的解決

下一篇:返回列表

標籤雲
其他(160137) Python(38193) JavaScript(25471) Java(18172) C(15235) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7221) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5344) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4580) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1979) 功能(1967) Web開發(1951) HtmlCss(1950) C++(1928) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1879) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • STM32-RTC

    RTC簡介: RTC是一個獨立的定時器,它可以連續計數和提供了時鐘日歷功能。使用BKP暫存器存盤具有掉電保存功能 存粹的計時的, 觸發中斷 ——鬧鐘中斷,用來產生一個可編程的鬧鐘中斷。 ——秒中斷,用來產生一個可編程的周期性中斷信號(最快1秒,最慢1秒,只能1秒) ——溢位中斷,指示內部可編程計數器 ......

    uj5u.com 2023-06-01 10:26:30 more
  • kali-linux運行python腳本時出現”word unexpected (expecting "

    # 前言 在剛剛開始學習網路安全時候,裝好了kali準備測驗一下。 運行了py結尾的腳本出現了以下錯誤: ![](https://img2023.cnblogs.com/blog/2572943/202305/2572943-20230531000850176-695077837.png) #解決方 ......

    uj5u.com 2023-05-31 07:28:15 more
  • Linux作業原理2常用基本命令和目錄層次結構

    本章是對本書中你將遇到的Unix命令和工具的指南。 為什么是Unix命令?這不是一本關于Linux如何作業的書嗎?當然是的,但Linux在本質上是一種Unix風格。在本章中,你會看到Unix這個詞,而不是Linux,因為你可以把你學到的東西直接帶到BSD和其他Unix風味的系統中去。我試圖避免涉及太 ......

    uj5u.com 2023-05-29 10:30:37 more
  • linux服務器,nginx日志切割保存

    我們都知道,默認情況下,nginx的專案log是一直被累計寫入的,隨著時間越久,那么這個檔案就會越大,這個時候如果我們要去做一些查找和排查就會比較困難,因為日志檔案太大,操作起來比較費勁。 因此我們為了規避這個問題,提出日志切割的方案。 那日志切割的原理是怎么樣的,我們來分析一下,我們先統計下連續1 ......

    uj5u.com 2023-05-26 15:30:38 more
  • 深度決議 slab 記憶體池回收記憶體以及銷毀全流程

    在上篇文章 [《深入理解 slab cache 記憶體分配全鏈路實作》](https://mp.weixin.qq.com/s?__biz=Mzg2MzU3Mjc3Ng==&mid=2247488152&idx=1&sn=7c65f8ee28e9cc14a86e9df92b6d2b93&chksm=c ......

    uj5u.com 2023-05-26 15:29:05 more
  • linux服務器,nginx日志切割保存

    我們都知道,默認情況下,nginx的專案log是一直被累計寫入的,隨著時間越久,那么這個檔案就會越大,這個時候如果我們要去做一些查找和排查就會比較困難,因為日志檔案太大,操作起來比較費勁。 因此我們為了規避這個問題,提出日志切割的方案。 那日志切割的原理是怎么樣的,我們來分析一下,我們先統計下連續1 ......

    uj5u.com 2023-05-26 15:26:14 more
  • 深度決議 slab 記憶體池回收記憶體以及銷毀全流程

    在上篇文章 [《深入理解 slab cache 記憶體分配全鏈路實作》](https://mp.weixin.qq.com/s?__biz=Mzg2MzU3Mjc3Ng==&mid=2247488152&idx=1&sn=7c65f8ee28e9cc14a86e9df92b6d2b93&chksm=c ......

    uj5u.com 2023-05-26 15:25:12 more
  • 容器編排器們的自我介紹

    哈嘍大家好,我是咸魚 咸魚在《[一文帶你了解容器技術的前世今生](https://mp.weixin.qq.com/s?__biz=MzkzNzI1MzE2Mw==&mid=2247484578&idx=1&sn=a8ae0d1c470351a8bbcb6891bae0ca23&chksm=c293 ......

    uj5u.com 2023-05-25 11:13:55 more
  • 容器編排器們的自我介紹

    哈嘍大家好,我是咸魚 咸魚在《[一文帶你了解容器技術的前世今生](https://mp.weixin.qq.com/s?__biz=MzkzNzI1MzE2Mw==&mid=2247484578&idx=1&sn=a8ae0d1c470351a8bbcb6891bae0ca23&chksm=c293 ......

    uj5u.com 2023-05-25 10:58:52 more
  • linux yum安裝

    目錄 一、yum安裝 二、yum安裝分類 三、yum命令 四、實驗 一、yum安裝 yum:1.基于rpm升級,彌補rpm只能一個一個安裝依賴檔案 2.yum可以自動安裝依賴檔案。 3.從倉庫中下載包 centos8:使用yum或者dhf(兩種命令格式基本一致,檔案格式.rpm) ubuntu:使用 ......

    uj5u.com 2023-05-24 07:44:05 more