您的位置 首页 观点

ARM学习《十》—关于STM32的RTC调试

这两天一直在调试STM32的RTC部分,本来打算弄一个万年历的,但是现在看来是暂时实现不了了。为什么这样说,因为RTC对晶振的要求非常高,必…

这两天一直在调试STM32的RTC部分,原本计划弄一个万年历的,可是现在看来是暂时完结不了了。为什么这样说,由于RTC对晶振的要求十分高,有必要是6p负载电容的32768晶振,这种晶振很难买,并且还很贵。下面是摘自一位网友的话:

今日到电子市场找了一下,简直都是12.5p负载电容的32768晶振,只要一家有少数,负载电容是6p,20ppm的晶振要价是12.5p晶振的5倍,并且从外观上也看不出来,也没有测验办法能测出负载电容是6p仍是12.5p。卖晶振的老板在这行干了10几年,一说到6p的32768晶振就笑了。这个要求曾经就有多个公司中过招,特别是DALLAS的片子,让一家公司吃尽了苦头,焊上的许多高精度12.5p晶振被逼悉数换掉,订的数万只晶振也只能托付卖掉。老板说这种方法是IC厂家和大的晶振厂家联合的一个小诡计,由于曾经6p的晶振只要很少几个大厂家能做好,这样能够协助大晶振厂家构成独占。DALLAS的东西不敢恭维,历来卖得很贵,一片增强型的51常常还要卖四五十。
6p的晶振既贵重又欠好收购,并且也难以辨认和测验。STM32这样规划实在是难以理喻。其它咱们用过的一切触及RTC的MCU和时钟芯片都不存在这个问题,如三星的44B0,2410,2440,飞利浦的LPC213x,LP214x等等。
STM32是高度着重性价比的芯片,可是却在RTC晶振上给中小客户带来很大不必要的费事,既增加本钱和收购难度,又留下丧命的危险(RTC发动死机)。特别是试样和试生产阶段,量又不大,怎样去专门订做?
期望ST公司能正视这个问题,在今后的改善中批改这个问题,能支撑12.5p的惯例32768晶振。

调试了好长时刻,我说怎样没有反应,本来是由于晶振的原因,并且电容有必要接6PF,我用的是15P的电容,等候晶振起振的时刻特别长(1分钟左右),开端我还以为是程序死在哪了呢!

后来程序是调通了,可是1S中止特别禁绝,我信任必定是由于晶振和电容的原因,先不论准禁绝,至少程序是调通了。把设置RTC的进程和我们共享:

仍是将寄存器界说增加若头文件:

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

//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))

接下来便是RTC的寄存器装备:

void RTC_Configuration(void)

{

RCC_APB1ENR|=0x18000000;//电源接口时钟使能,备份接口时钟使能

PWR_CR|=0x00000100;//位8,答应拜访RTC寄存器和备份寄存器

RCC_APB1RSTR|=0x08000000;//位27 BKPRST备份接口复位

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

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

RCC_BDCR|=0x00000100; //挑选LSE位RTC时钟

RCC_BDCR|=0x00008000; //位15 RTCEN RTC时钟使能

RTC_CRL|=0x10;//位4装备标志,1:进入装备形式

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

while(RTC_CRL&0x20==0);//位5,在RTC寄存器上最近一次写操作现已完结

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

while(RTC_CRL&0x20==0);//位5,在RTC寄存器上最近一次写操作现已完结

RTC_PRLL=0xFF;//(1S中止应该是32767,但我的晶振禁绝,0xFF都是1S多)

while(RTC_CRL&0x20==0);//位5,在RTC寄存器上最近一次写操作现已完结

RTC_CRL&=0xFFEF;//位4,退出装备形式(开端更新RTC寄存器).

SETENA0|=0x00000008;//答应RTC中止

}

RTC中止处理函数:

void RTC_IRQHandler(void)

{

if(RTC_CRL&0x01==1) //查询1S中止标志

{

RTC_CRL&=0xFFFE; // 1S中止标志铲除

if(IO_flag==0)//1S,LED业绩一次

{

GPIO_PORTB_ODR|=(1<<5);

IO_flag=1; // IO_flag为自己设的一个全局变量,用于LED取反

}

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

IO_flag=0;

}

}

}

int main()

{

SystemInit0();//体系(时钟)初始化

stm32_GpioSetup (); //GPIO初始化

RTC_Configuration();//RTC装备

while(1)

{

}

}

又搞定了一部分……

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/264446.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部