1. 程式人生 > >親測實驗,RTC使用內部低速時鐘LSI時,對RTC的配置過程

親測實驗,RTC使用內部低速時鐘LSI時,對RTC的配置過程

下面是一開始寫程式時,配置過程:

char RTCInit()
{

char count = 0;

StartTime.year = 16;
StartTime.month = 3;
StartTime.day = 5;
StartTime.hour = 20;
StartTime.min = 41;
StartTime.sec = 0;
 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR , ENABLE);

PWR_BackupAccessCmd(ENABLE);//開啟後備域電源,可以訪問後備域暫存器



//(由於RTC的配置資料在後備域BKP中,所以只要Vbat或者VDD不丟電就不丟失(即使復位了也不丟失),故可通過讀BKP某個值來判斷是否丟電,進而判斷RTC是否需要初始化配置)
if(BKP_ReadBackupRegister(BKP_DR1) != 0xAA00)//Vbat且VDD掉電
{
BKP_DeInit(); //復位備份區域,將BKP暫存器清空


/////////////////////(時鐘配置部分)////////////////////////////

//RCC_LSEConfig(RCC_LSE_ON);//開啟外部低速晶振LSE
RCC_LSICmd(ENABLE);//開啟內部低速晶振LSI

while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == 0 && count<11) 
//while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == 0 && count<11)  //等待LSE啟振,判斷在2S內配置是否成功,不成功返回0
{
count++;
delay_ms(200);
}

if(count == 10)
{
return 0;//LSI啟振失敗
}

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
//RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//使用外部低速晶振LSE為RTC時鐘源

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


RTC_WaitForLastTask();//等待上一次寫RTC任務完成(常用,只要涉及對RTC裡值的修改,都需要在修改後加上此函式)
RTC_WaitForSynchro();//等待與APB1的同步,才能讀RTC暫存器


///////////////// ////(暫存器配置部分)////////////////////////////

RTC_EnterConfigMode();//允許RTC配置
RTC_WaitForLastTask();//等待上一次寫RTC任務完成


RTC_SetPrescaler(40000);//分頻後為1HZ
//RTC_SetPrescaler(32767);//分頻後為1HZ
RTC_WaitForLastTask();//等待上一次寫RTC任務完成

   //RTC_ClearITPendingBit(RTC_IT_ALR);
   //RTC_WaitForLastTask();

RTC_ITConfig(RTC_IT_ALR , DISABLE);//使能鬧鐘中斷.  秒中斷RTC_IT_SEC

RTC_WaitForLastTask();//等待上一次寫RTC任務完成


SetWriteTime(&StartTime);//寫入起始日曆轉變給RTC


RTC_WaitForLastTask();//等待上一次寫RTC任務完成

RTC_ExitConfigMode(); //退出RTC配置模式


BKP_WriteBackupRegister(BKP_DR1, 0xAA00);//寫入想要的丟電判斷資料
GPIOInit(GPIOA ,GPIO_Pin_2, GPIO_Mode_Out_PP);//  LED   PA2

}

else//已經初始化過一次且沒掉電
{

RTC_WaitForSynchro();//等待與APB1的同步,才能讀RTC暫存器
RTC_EnterConfigMode();//允許RTC配置

RTC_ITConfig(RTC_IT_ALR, DISABLE);//使能鬧鐘中斷.  秒中斷RTC_IT_SEC

RTC_WaitForLastTask();//等待上一次寫RTC任務完成

RTC_ExitConfigMode(); //退出RTC配置模式
RTC_WaitForLastTask();//等待上一次寫RTC任務完成

GPIOInit(GPIOA ,GPIO_Pin_6, GPIO_Mode_Out_PP);//  LED   PA6
}


return 1;//配置成功
}

實驗結果,微控制器剛上電PA2的LED燈可以亮,但按下復位時,PA6的LED燈不工作,按正常來說RTC在不掉電情況只要配置一次即可,按復位後應該進入else語句,進而點亮PA6的LED,但實際不然。通過線上除錯,發現程式死在了RTC_WaitForSynchro();的同步函式裡。

通過各種除錯,程式還是卡死,因此懷疑是不是使用內部低速時鐘LSI不穩定引起?(具體原因還不是很清楚??),不過當我把RTC的時鐘配置部分複製到else語句裡,奇蹟出現了,復位後PA6的LED可以點亮。因此不管是上電還是復位,都需要對RST的時鐘重新配置。於是有了下面正確的配置函式:

char RTCInit()

{

char count = 0;

StartTime.year = 16;
StartTime.month = 3;
StartTime.day = 5;
StartTime.hour = 20;
StartTime.min = 41;
StartTime.sec = 0;
 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR , ENABLE);

PWR_BackupAccessCmd(ENABLE);//開啟後備域電源,可以訪問後備域暫存器

//(由於RTC的配置資料在後備域BKP中,所以只要Vbat或者VDD不丟電就不丟失(即使復位了也不丟失),故可通過讀BKP某個值來判斷是否丟電,進而判斷RTC是否需要初始化配置)
if(BKP_ReadBackupRegister(BKP_DR1) != 0xAA00)//Vbat且VDD掉電
{

BKP_DeInit(); //復位備份區域,將BKP暫存器清空

/////////////////////(時鐘配置部分)////////////////////////////

RCC_LSICmd(ENABLE);//開啟內部低速晶振LSI

while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == 0 && count<11) //等待LSI啟振,判斷在2S內配置是否成功,不成功返回0
{
count++;
delay_ms(200);
}

if(count == 10)
{
return 0;//LSI啟振失敗
}

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

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


RTC_WaitForLastTask();//等待上一次寫RTC任務完成(常用,只要涉及對RTC裡值的修改,都需要在修改後加上此函式)
RTC_WaitForSynchro();//等待與APB1的同步,才能讀RTC暫存器


///////////////// ////(暫存器配置部分)////////////////////////////

RTC_EnterConfigMode();//允許RTC配置
RTC_WaitForLastTask();//等待上一次寫RTC任務完成


RTC_SetPrescaler(40000);//分頻後為1HZ
//RTC_SetPrescaler(32767);//分頻後為1HZ
RTC_WaitForLastTask();//等待上一次寫RTC任務完成


RTC_ITConfig(RTC_IT_ALR , DISABLE);//使能鬧鐘中斷.  秒中斷RTC_IT_SEC

RTC_WaitForLastTask();//等待上一次寫RTC任務完成


SetWriteTime(&StartTime);//寫入起始日曆轉變給RTC


RTC_WaitForLastTask();//等待上一次寫RTC任務完成

RTC_ExitConfigMode(); //退出RTC配置模式


BKP_WriteBackupRegister(BKP_DR1, 0xAA00);//寫入想要的丟電判斷資料
GPIOInit(GPIOA ,GPIO_Pin_2, GPIO_Mode_Out_PP);//  LED   PA2

}

else//已經初始化過一次且沒掉電
{
/////////////////////(時鐘配置部分)////////////////////////////
RCC_LSICmd(ENABLE);//開啟內部低速晶振LSI

while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == 0 && count<11) 
{
count++;
delay_ms(200);
}

if(count == 10)
{
return 0;//LSI啟振失敗
}

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

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


RTC_WaitForLastTask();//等待上一次寫RTC任務完成(常用,只要涉及對RTC裡值的修改,都需要在修改後加上此函式)
RTC_WaitForSynchro();//等待與APB1的同步,才能讀RTC暫存器

///////////////// ////(暫存器配置部分)////////////////////////////

RTC_EnterConfigMode();//允許RTC配置

RTC_ITConfig(RTC_IT_ALR, DISABLE);//使能鬧鐘中斷.  秒中斷RTC_IT_SEC

RTC_WaitForLastTask();//等待上一次寫RTC任務完成

RTC_ExitConfigMode(); //退出RTC配置模式
RTC_WaitForLastTask();//等待上一次寫RTC任務完成

GPIOInit(GPIOA ,GPIO_Pin_6, GPIO_Mode_Out_PP);//  LED   PA6
}


return 1;//配置成功
}

相關推薦

實驗RTC使用內部低速時鐘LSIRTC配置過程

下面是一開始寫程式時,配置過程: char RTCInit() {char count = 0; StartTime.year = 16;StartTime.month = 3;StartTime.day = 5;StartTime.hour = 20;StartTime.

實驗stm32待機模式和停機模式喚醒程式的區別以及喚醒後程序入口。

這兩天研究了STM32的低功耗知識,低功耗裡主要研究的是STM32的待機模式和停機模式。讓微控制器進入的待機模式和停機模式比較容易,實驗中通過設定中斷口PA1來響應待機和停機模式。 void EXTI1_IRQHandler(void) {if(!GPIO_ReadInputDataBit(

可用】win7下行動硬碟無法訪問拒絕訪問位置不可用時的解決方案!

首先感謝這位作者:leo_w YSU ,我也是看了很多網上的解決辦法,多數都是chkdsk的辦法,根本解決不了這個問題,而用這個辦法,徹底解決了這個問題。     本人本本為win7 sp1 旗艦版作業系統。今天用行動硬碟從導師的電腦(XPsp3 系統)上拷了一些資料,想複製到電腦上。結果插上行動硬碟後,

div內部巢狀div高度設定問題

問題 當div內部巢狀多個div,內部div設定浮動時,父級div的高度受影響,無法計算,外層div會變成一條水平線! 程式碼結構如下: <div class="outer">

山科java實驗3-2 在安排教師監考需要從一組教師中隨機選取n個教師參加監考。要求實現一個類RandomTeacher的靜態方法public static String[] getRandomT

在安排教師監考時,需要從一組教師中隨機選取n個教師參加監考。要求實現一個類RandomTeacher的靜態方法public static String[] getRandomTeachers(String[] teachers, int n),能夠從teachers中隨機選擇

已經在Git Server服務器上導入了SSH公鑰可用TortoiseGit同步代碼還是提示輸入密碼?

www 服務器端 com 技術分享 style 訪問 github 情況 ima GitHub雖好,但畢竟在國內訪問不是很穩定,速度也不快,而且推送到上面的源碼等資料必須公開,除非你給他交了保護費;所以有條件的話,建議大家搭建自己的Git Server。本地和局域網服務器都

要求根據RandomStr.java:使用類型轉換生成六位驗證字符串示例程序每次運 行都會生成不同的字符串。

str ima method edi 驗證碼 不同的 [] 類型 直接 1.程序設計思想驗證碼 ①定義一個字符串變量來保存隨機生成的。 ②利用循環產生六位隨機數,在產生每一位時將其轉換為char類型並寫在字符串後面。 ③利用對話框顯示生成的驗證碼,並提示用戶輸入驗證碼。 ④

TextBlock 重寫當文本過長自動截斷文本並出現Tooltip

XML oca center res clr des glob ner edi 如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

word多出空標題樣式是列出段落 - -顯示選擇不勾選“隱藏文字”

clas 文字 class 技術分享 span ask alt 樣式 png word多出空標題,樣式是列出段落 word多出空標題,樣式是列出段落 - -顯示時,選擇不勾選“隱藏文字”

Qt---去掉標題欄後最大化應用程序窗口窗口遮住了任務欄的問題

cat bsp zed 任務欄 available des 問題 ica try 不應該使用: this->showFullScreen(); 或 this->showMaximized(); 而應該使用: this->setGeometry(

【java】【mybatis】在使用mybatis進行批量插入批量更新等批量操作切割In集合List進行分批批量操作的java中的切割代碼

lse span ati 批量更新 次數 sublist 調用 size ==       紅字部分代表mybatis的批量操作調用方法:       int num = 0; int maxLength = 200; in

ln 軟體連結目錄當連結檔案已經存在結果非預期

建立軟體連結的語法如下: link -s  target  linkName   例項: ln -s ssh_connect_home link1   但是當我們想把此連結指向第二個檔案時,結果卻不如意料那般: &nbs

當執行sql更新失誤添加了錯誤的判斷條件導致資料表資料出錯如何利用備份資料庫實現聯合更新還原資料。

  首先得有備份資料庫,沒有備份肯定無法聯合更新回覆。 我錯誤更新了 [SBSDB].[dbo].[wallet_user_info]中的使用者名稱user_name 我的備份資料庫及對應資料表SBSDBTest.dbo.t_user_detail  先select 出錯

String類重寫的equals方法比較的是字元序列比較物件不是字串注意使用toString()方法

今天幫同事debug,問題描述:判斷相應條件之後,沒有按照預想的結果接入if語句中; 其程式碼如下: Map<String, Object> alarmByAlarmNum = alarmMapper.getAlarmByDeviceNumber(deviceNumber);

程序鎖用在螢幕列印資料多程序

from multiprocessing import Process, Lockdef f(l, i): #l.acquire() print('hello world', i) #l.release()if __name__ == '__main__': lock = Lock()

實現ResponseBodyAdvice介面統一攔截介面返回資料controller返回值是String 型別異常

為實現介面統一返回資料時自定義的攔截響應資料時出現異常情況。 如果controller 方法返回值 是String 型別時丟擲異常。 異常如下: java.lang.ClassCastException: com.lk.face.common.model.ResponseDataVo c

“子查詢返回的值不止一個。當子查詢跟隨在 =、!=、<、<=、>、>= 之後或子查詢用作表示式這種情況是不允許的。”SQL查詢錯誤解析

為了實現下述程式碼,首先得有資料庫和相應的表格,本文用的是https://blog.csdn.net/qaz13177_58_/article/details/5575711/中的案例,即先用連線中那些命令建立資料庫、生成資料表,然後就有了student,teacher,course,score等表。 &n

模仿事物一個功能執行不成功另一個也不能執行

        double d = 0;         double f = 1;         double g = d / f;

android 建立或轉出檔案後在電腦端檢視檔案並沒有對應的變化

問題: 在手機連線電腦狀態時,手機應用建立或刪除檔案/資料夾時,電腦端檢視檔案/資料夾時,沒有看到相應的操作。即:當應用刪除檔案時,電腦端依舊可以看到檔案存在;或當應用建立後,電腦端查詢不到相應檔案。 原因: Android手機系統對於檔案的處理的模式,手機需

工資上萬的程式設計師為何在35歲”高齡“都會被迫轉行

在我們的印象中,似乎只有模特、空姐這類吃青春飯的職業,然而程式設計師這個職業,卻也被一部分人貼上了“青春”的標籤,甚至在碼農界,流傳著35歲不轉行,就是在等死這樣危言聳聽的言論,為何平均工資上萬的程式設計師們,會有這樣的焦慮呢? 這裡還是要推薦下我自己建的前端學習群: