親測實驗,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);//開啟內部低速晶振LSIwhile(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使用內部低速時鐘LSI時,對RTC的配置過程
下面是一開始寫程式時,配置過程: 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歲不轉行,就是在等死這樣危言聳聽的言論,為何平均工資上萬的程式設計師們,會有這樣的焦慮呢? 這裡還是要推薦下我自己建的前端學習群: