日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]一開始,所有實(shí)驗(yàn)都是在神舟板上去完成,根本就沒有發(fā)現(xiàn)RTC的問題。直到我們自己畫板來后調(diào)試時(shí),才發(fā)現(xiàn)STM32 RTC的外部時(shí)鐘源存在問題。這也算是STM32的一個(gè)雞肋,對(duì)于LSE外部晶振太過于苛刻,手冊(cè)上要求使用6pf,這

一開始,所有實(shí)驗(yàn)都是在神舟板上去完成,根本就沒有發(fā)現(xiàn)RTC的問題。直到我們自己畫板來后調(diào)試時(shí),才發(fā)現(xiàn)STM32 RTC的外部時(shí)鐘源存在問題。

這也算是STM32的一個(gè)雞肋,對(duì)于LSE外部晶振太過于苛刻,手冊(cè)上要求使用6pf,這個(gè)規(guī)格的晶振市場(chǎng)上太少,魚龍混雜,中招的高手菜鳥不在少數(shù)。我們自己的板也是如此,幾經(jīng)波折,反反復(fù)復(fù)嘗試使用不同的規(guī)格的晶振,替換外部的電容,電阻都沒有能讓這個(gè)32.768K的LSE起振。但是又需要有RTC來提供時(shí)間,考慮的方法主要有2種,第一采用外部RTC時(shí)鐘芯片,如DS1302。第二是使用內(nèi)部其它的時(shí)鐘源來提供RTC時(shí)鐘。毫無疑問,目前板已經(jīng)制好,添加時(shí)鐘芯片肯定造成板上布局更改,還得重新打板,這里采用了第二種方法。

查看STM32的手冊(cè)上時(shí)鐘樹,如下:


除去不能起振的外部低速LSE外,可供使用的只有LSI和HSE的128分頻,LSI這個(gè)是內(nèi)部的40KHz RC振蕩器,頻率在30~60KHz浮動(dòng),自然這個(gè)不能用于RTC計(jì)時(shí),誤差太大。

我們的板上配的是STM32F107這款芯片,外部高速晶振是25MHz的。128分頻后頻率為 25000000 / 128 = 195312.5 Hz,很顯然這里也不能做到很精確,有小許誤差。

然后設(shè)置RTC_PRL寄存器,寫入195312這個(gè)分頻值,便可以得到1Hz的頻率。使用HSE作為RTC時(shí)鐘,缺點(diǎn)就是無法在斷開電源后使用后備電池進(jìn)行供電,維持RTC的正常。下次需要上位機(jī)重新去設(shè)置時(shí)間。


代碼大致如下:

void RTC_Configuration(void)

{

u8 i = 0;

/* Enable PWR and BKP clocks */

/* PWR時(shí)鐘(電源控制)與BKP時(shí)鐘(RTC后備寄存器)使能 */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR " RCC_APB1Periph_BKP, ENABLE);

/* Allow access to BKP Domain */

/*使能RTC和后備寄存器訪問 */

PWR_BackupAccessCmd(ENABLE);

/* Reset Backup Domain */

/* 將外設(shè)BKP的全部寄存器重設(shè)為缺省值 */

BKP_DeInit();

/* Enable LSE */

/* 使能LSE(外部32.768KHz低速晶振)*/

RCC_LSEConfig(RCC_LSE_ON);

/* Wait till LSE is ready */

/* 等待外部晶振震蕩穩(wěn)定輸出 */

TIM5_Init_Query(CALC_TYPE_MS); //ms 級(jí)別

for (i = 0;i < 10;i++) //10次檢測(cè),如果LSE仍然沒有起振,證明這玩意有問題,跳出循環(huán)

{

if (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != RESET)

break;

TIM5_MS_CALC(1); //1ms延時(shí)

}

//while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){}

if (i == 10)

{

//RCC->CSR |= 0x1; //開啟內(nèi)部低速晶振

//while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);

//RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //使用LSI提供RTC時(shí)鐘

//使用外部高速晶振 128分頻

RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

}else

{

/* Select LSE as RTC Clock Source */

/*使用外部32.768KHz晶振作為RTC時(shí)鐘 */

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

}

/* Enable RTC Clock */

/* 使能 RTC 的時(shí)鐘供給 */

RCC_RTCCLKCmd(ENABLE);

/* Wait for RTC registers synchronization */

/*等待RTC寄存器同步 */

RTC_WaitForSynchro();

/* Wait until last write operation on RTC registers has finished */

/* 等待上一次對(duì)RTC寄存器的寫操作完成 */

RTC_WaitForLastTask();

/* Enable the RTC Second */

/* 使能RTC的秒中斷 */

RTC_ITConfig(RTC_IT_SEC, ENABLE);

/* Wait until last write operation on RTC registers has finished */

/* 等待上一次對(duì)RTC寄存器的寫操作完成 */

RTC_WaitForLastTask();

/* Set RTC prescaler: set RTC period to 1sec */

/* 32.768KHz晶振預(yù)分頻值是32767,如果對(duì)精度要求很高可以修改此分頻值來校準(zhǔn)晶振 */

if (i != 10) //LSE不能正常

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

else

RTC_SetPrescaler(195312); //25000000 / 128 = 195312.5,如果是8M / 128 = 62500,則這里應(yīng)該填為62499

/* Wait until last write operation on RTC registers has finished */

/* 等待上一次對(duì)RTC寄存器的寫操作完成 */

RTC_WaitForLastTask();

}

void Init_RTC(void)

{

/* 以下if...else.... if判斷系統(tǒng)時(shí)間是否已經(jīng)設(shè)置,判斷RTC后備寄存器1的值

是否為事先寫入的0XA5A5,如果不是,則說明RTC是第一次上電,需要配置RTC,

提示用戶通過串口更改系統(tǒng)時(shí)間,把實(shí)際時(shí)間轉(zhuǎn)化為RTC計(jì)數(shù)值寫入RTC寄存器,

并修改后備寄存器1的值為0XA5A5。

else表示已經(jīng)設(shè)置了系統(tǒng)時(shí)間,打印上次系統(tǒng)復(fù)位的原因,并使能RTC秒中斷

*/

if (BKP_ReadBackupRegister(BKP_DR1) != RTC_SEQ_ID)

{

/* Backup data register value is not correct or not yet programmed (when

the first time the program is executed) */

/* RTC Configuration */

RTC_Configuration();

/* Adjust time by values entred by the user on the hyperterminal */

RTC_SetCounter(Time_Regulate(YEAR_BASE,01,01,0,0,0)); //2008-1-1 0:0:0

/* 修改后備寄存器1的值為0XA5A5 */

BKP_WriteBackupRegister(BKP_DR1, RTC_SEQ_ID);

}else

{

/* Check if the Power On Reset flag is set */

//RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET

// printf("rnn Power On Reset occurred....");

/* Check if the Pin Reset flag is set */

//else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)

// printf("rnn External Reset occurred....");

if (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)

{

//RCC->CSR |= 0x1; //開啟內(nèi)部低速晶振

//while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);

//RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //使用LSI提供RTC時(shí)鐘

//RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

RTC_Configuration();

}

//printf("rn No need to configure RTC....");

/* Wait for RTC registers synchronization */

RTC_WaitForSynchro();

/* Enable the RTC Second */

RTC_ITConfig(RTC_IT_SEC, ENABLE);

/* Wait until last write operation on RTC registers has finished */

RTC_WaitForLastTask();

}

#ifdef RTCClockOutput_Enable

/* Enable PWR and BKP clocks */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

/* Allow access to BKP Domain */

PWR_BackupAccessCmd(ENABLE);

/* Disable the Tamper Pin */

BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper

functionality must be disabled */

/* Enable RTC Clock Output on Tamper Pin */

BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);

#endif

/* Clear reset flags */

RCC_ClearFlag();

}

實(shí)際測(cè)試,RTC效果還行,然后配合上位機(jī)隔一定的時(shí)間后同步時(shí)間基本上能夠滿足要求。

萬惡的LSE晶振,這東西簡(jiǎn)直不能忍受......


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

在嵌入式開發(fā)中,STM32的時(shí)鐘系統(tǒng)因其靈活性和復(fù)雜性成為開發(fā)者關(guān)注的焦點(diǎn)。然而,看似簡(jiǎn)單的時(shí)鐘配置背后,隱藏著諸多易被忽視的陷阱,輕則導(dǎo)致系統(tǒng)不穩(wěn)定,重則引發(fā)硬件損壞。本文從時(shí)鐘源選擇、PLL配置、總線時(shí)鐘分配等關(guān)鍵環(huán)...

關(guān)鍵字: STM32 時(shí)鐘系統(tǒng)

在嵌入式系統(tǒng)開發(fā)中,STM32系列微控制器的內(nèi)部溫度傳感器因其低成本、高集成度特性,廣泛應(yīng)用于設(shè)備自檢、環(huán)境監(jiān)測(cè)等場(chǎng)景。然而,受芯片工藝差異和電源噪聲影響,其原始數(shù)據(jù)存在±1.5℃的固有誤差。本文從硬件配置、校準(zhǔn)算法、軟...

關(guān)鍵字: STM32 溫度傳感器

在能源效率與智能化需求雙重驅(qū)動(dòng)下,AC-DC轉(zhuǎn)換器的數(shù)字控制技術(shù)正經(jīng)歷從傳統(tǒng)模擬方案向全數(shù)字架構(gòu)的深刻變革。基于STM32微控制器的PFM(脈沖頻率調(diào)制)+PWM(脈沖寬度調(diào)制)混合調(diào)制策略,結(jié)合動(dòng)態(tài)電壓調(diào)整(Dynam...

關(guān)鍵字: AC-DC STM32

當(dāng)前智能家居產(chǎn)品需求不斷增長(zhǎng) ,在這一背景下 ,對(duì)現(xiàn)有澆花裝置缺陷進(jìn)行了改進(jìn) ,設(shè)計(jì)出基于STM32單片機(jī)的全 自動(dòng)家用澆花機(jī)器人。該設(shè)計(jì)主要由機(jī)械結(jié)構(gòu)和控制系統(tǒng)構(gòu)成 ,機(jī)械結(jié)構(gòu)通過麥克納姆輪底盤與噴灑裝置的結(jié)合實(shí)現(xiàn)機(jī)器...

關(guān)鍵字: STM32 麥克納姆輪 安全可靠 通過性強(qiáng)

用c++編程似乎是讓你的Arduino項(xiàng)目起步的障礙嗎?您想要一種更直觀的微控制器編程方式嗎?那你需要了解一下Visuino!這個(gè)圖形化編程平臺(tái)將復(fù)雜電子項(xiàng)目的創(chuàng)建變成了拖動(dòng)和連接塊的簡(jiǎn)單任務(wù)。在本文中,我們將帶您完成使...

關(guān)鍵字: Visuino Arduino ESP32 STM32

基于STM32與LoRa技術(shù)的無線傳感網(wǎng)絡(luò)憑借其低功耗、廣覆蓋、抗干擾等特性,成為環(huán)境監(jiān)測(cè)、工業(yè)自動(dòng)化等場(chǎng)景的核心解決方案。然而,如何在復(fù)雜電磁環(huán)境中實(shí)現(xiàn)高效休眠調(diào)度與動(dòng)態(tài)信道優(yōu)化,成為提升網(wǎng)絡(luò)能效與可靠性的關(guān)鍵挑戰(zhàn)。本...

關(guān)鍵字: STM32 LoRa

在實(shí)時(shí)控制系統(tǒng)、高速通信協(xié)議處理及高精度數(shù)據(jù)采集等對(duì)時(shí)間敏感的應(yīng)用場(chǎng)景中,中斷響應(yīng)延遲的優(yōu)化直接決定了系統(tǒng)的可靠性與性能上限。STM32系列微控制器憑借其靈活的嵌套向量中斷控制器(NVIC)、多通道直接內(nèi)存訪問(DMA)...

關(guān)鍵字: STM32 DMA

數(shù)字電源技術(shù)向高功率密度、高效率與高動(dòng)態(tài)響應(yīng)方向加速演進(jìn),STM32微控制器憑借其基于DSP庫的算法加速能力與對(duì)LLC諧振變換器的精準(zhǔn)控制架構(gòu),成為優(yōu)化電源動(dòng)態(tài)性能的核心平臺(tái)。相較于傳統(tǒng)模擬控制或通用型數(shù)字控制器,STM...

關(guān)鍵字: STM32 數(shù)字電源

STM32微控制器憑借其針對(duì)電機(jī)控制場(chǎng)景的深度優(yōu)化,成為高精度、高可靠性驅(qū)動(dòng)系統(tǒng)的核心選擇。相較于通用型MCU,STM32在電機(jī)控制領(lǐng)域的核心優(yōu)勢(shì)集中體現(xiàn)在FOC(磁場(chǎng)定向控制)算法的硬件加速引擎與PWM死區(qū)時(shí)間的動(dòng)態(tài)補(bǔ)...

關(guān)鍵字: STM32 電機(jī)控制

無線充電技術(shù)加速滲透消費(fèi)電子與汽車電子領(lǐng)域,基于Qi協(xié)議的無線充電發(fā)射端開發(fā)成為智能設(shè)備能量補(bǔ)給的核心課題。傳統(tǒng)模擬控制方案存在響應(yīng)滯后、參數(shù)調(diào)整困難等問題,而基于STM32的數(shù)字PID控制結(jié)合FOD(Foreign O...

關(guān)鍵字: STM32 無線充電
關(guān)閉