<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM學(xué)習《十》—關(guān)于STM32的RTC調試

ARM學(xué)習《十》—關(guān)于STM32的RTC調試

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò ) 收藏
這兩天一直在調試STM32的RTC部分,本來(lái)打算弄一個(gè)萬(wàn)年歷的,但是現在看來(lái)是暫時(shí)實(shí)現不了了。為什么這樣說(shuō),因為RTC對晶振的要求非常高,必須是6p負載電容的32768晶振,這種晶振很難買(mǎi),而且還很貴。下面是摘自一位網(wǎng)友的話(huà):

今天到電子市場(chǎng)找了一下,幾乎都是12.5p負載電容的32768晶振,只有一家有少量,負載電容是6p,20ppm的晶振要價(jià)是12.5p晶振的5倍,而且從外觀(guān)上也看不出來(lái),也沒(méi)有測試方法能測出負載電容是6p還是12.5p。賣(mài)晶振的老板在這行干了10幾年,一說(shuō)到6p的32768晶振就笑了。這個(gè)要求以前就有多個(gè)公司中過(guò)招,特別是DALLAS的片子,讓一家公司吃盡了苦頭,焊上的許多高精度12.5p晶振被迫全部換掉,訂的數萬(wàn)只晶振也只能委托賣(mài)掉。老板說(shuō)這種方式是IC廠(chǎng)家和大的晶振廠(chǎng)家聯(lián)合的一個(gè)小陰謀,因為以前6p的晶振只有很少幾個(gè)大廠(chǎng)家能做好,這樣可以幫助大晶振廠(chǎng)家形成壟斷。DALLAS的東西不敢恭維,向來(lái)賣(mài)得很貴,一片增強型的51經(jīng)常還要賣(mài)四五十。
6p的晶振既昂貴又不好采購,而且也難以辨認和測試。STM32這樣設計實(shí)在是難以理喻。其它我們用過(guò)的所有涉及RTC的MCU和時(shí)鐘芯片都不存在這個(gè)問(wèn)題,如三星的44B0,2410,2440,飛利浦的LPC213x,LP214x等等。
STM32是高度強調性?xún)r(jià)比的芯片,但是卻在RTC晶振上給中小客戶(hù)帶來(lái)很大不必要的麻煩,既增加成本和采購難度,又留下致命的隱患(RTC啟動(dòng)死機)。特別是試樣和試生產(chǎn)階段,量又不大,怎么去專(zhuān)門(mén)訂做?
希望ST公司能正視這個(gè)問(wèn)題,在以后的改進(jìn)中修正這個(gè)問(wèn)題,能支持12.5p的常規32768晶振。

本文引用地址:http://dyxdggzs.com/article/201611/318953.htm

調試了好長(cháng)時(shí)間,我說(shuō)怎么沒(méi)有反應,原來(lái)是因為晶振的原因,而且電容必須接6PF,我用的是15P的電容,等待晶振起振的時(shí)間特別長(cháng)(1分鐘左右),開(kāi)始我還以為是程序死在哪了呢!

后來(lái)程序是調通了,但是1S中斷特別不準,我相信一定是因為晶振和電容的原因,先不管準不準,至少程序是調通了。把設置RTC的過(guò)程和大家分享:

還是將寄存器定義添加若頭文件:

//*************************************************************

//PWR-Register

//*************************************************************

#define PWR_CR(*((volatile unsigned long *)0x40007000))

#define PWR_CSR(*((volatile unsigned long *)0x40007004))

//*******************************************************************

//

// RTC-Register

//

//*******************************************************************

#define RTC_CRH(*((volatile unsigned long *)0x40002800))

#define RTC_CRL(*((volatile unsigned long *)0x40002804))

#define RTC_PRLH(*((volatile unsigned long *)0x40002808))

#define RTC_PRLL(*((volatile unsigned long *)0x4000280C))

#define RTC_DIVH(*((volatile unsigned long *)0x40002810))

#define RTC_DIVL(*((volatile unsigned long *)0x40002814))

#define RTC_CNTH(*((volatile unsigned long *)0x40002818))

#define RTC_CNTL(*((volatile unsigned long *)0x4000281C))

#define RTC_ALRH(*((volatile unsigned long *)0x40002820))

#define RTC_ALRL(*((volatile unsigned long *)0x40002824))

接下來(lái)就是RTC的寄存器配置:

void RTC_Configuration(void)

{

RCC_APB1ENR|=0x18000000;//電源接口時(shí)鐘使能,備份接口時(shí)鐘使能

PWR_CR|=0x00000100;//位8,允許訪(fǎng)問(wèn)RTC寄存器和備份寄存器

RCC_APB1RSTR|=0x08000000;//位27 BKPRST備份接口復位

RCC_BDCR|=0x00000001;//位0 LSEON外部低速振蕩器使能

while(RCC_BDCR&0x00000002==0); //位1LSERDY外部低速振蕩器可用

RCC_BDCR|=0x00000100; //選擇LSE位RTC時(shí)鐘

RCC_BDCR|=0x00008000; //位15 RTCEN RTC時(shí)鐘使能

RTC_CRL|=0x10;//位4配置標志,1:進(jìn)入配置模式

while(RTC_CRL&0x04==0);//位3 RSF:寄存器同步標志

while(RTC_CRL&0x20==0);//位5,在RTC寄存器上最近一次寫(xiě)操作已經(jīng)完成

RTC_CRH=0x01;//使能1S中斷

while(RTC_CRL&0x20==0);//位5,在RTC寄存器上最近一次寫(xiě)操作已經(jīng)完成

RTC_PRLL=0xFF;//(1S中斷應該是32767,但我的晶振不準,0xFF都是1S多)

while(RTC_CRL&0x20==0);//位5,在RTC寄存器上最近一次寫(xiě)操作已經(jīng)完成

RTC_CRL&=0xFFEF;//位4,退出配置模式(開(kāi)始更新RTC寄存器).

SETENA0|=0x00000008;//允許RTC中斷

}

RTC中斷處理函數:

void RTC_IRQHandler(void)

{

if(RTC_CRL&0x01==1) //查詢(xún)1S中斷標志

{

RTC_CRL&=0xFFFE; // 1S中斷標志清除

if(IO_flag==0)//1S,LED閃爍一次

{

GPIO_PORTB_ODR|=(1<<5);

IO_flag=1; // IO_flag為自己設的一個(gè)全局變量,用于LED取反

}

else {GPIO_PORTB_ODR&=~(1<<5);

IO_flag=0;

}

}

}

int main()

{

SystemInit0();//系統(時(shí)鐘)初始化

stm32_GpioSetup (); //GPIO初始化

RTC_Configuration();//RTC配置

while(1)

{

}

}

又搞定了一部分……




關(guān)鍵詞: ARM學(xué)習STM32RTC調

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>