今日到电子市场找了一下,简直都是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)
{
}
}
又搞定了一部分……