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

发布者:科技思想家最新更新时间:2016-04-29 来源: eefocus关键字:ARM学习  STM32  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); // 位1 LSERDY 外部低速振荡器可用

 

  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)

 {

}

}

又搞定了一部分……


关键字:ARM学习  STM32  RTC调试 引用地址:ARM学习《十》—关于STM32的RTC调试

上一篇:ARM学习《九》——关于STM32的systick定时器的详细说明
下一篇:ARM学习《十一》—不用库函数自己动手配置STM32中的DMA

推荐阅读最新更新时间:2024-03-16 14:52

STM32标准库中的GPIO_Pin_N与GPIO_PinSourceN话题
最近做项目遇到这个问题,上网看到这篇文章,感觉很好,是人家的实际项目中总结出来的,转载过来,用以学习交流。一开始我也是分不清这两个参数的定义,总是以为是一样的,没注意他们的区别,以至于在按键消抖上面,总是不能很好的消抖,按下按键屏幕老是闪一下。原因就是我把该写GPIO_Pin_N的写成了GPIO_PinSourceN,其实这点和keil官方的MDK有关系,手写代码的时候,编辑器首先提示的是GPIO_PinSourceN,我就直接确定了。没想到是错误的。 下面是原文:(链接: http://www.51hei.com/bbs/dpj-40992-1.html ) 某日,有个工程师电话跟我交流,他在使用STM32F042芯片开发产
[单片机]
<font color='red'>STM32</font>标准库中的GPIO_Pin_N与GPIO_PinSourceN话题
关于IAR开发STM32配置
因为自己要学Msp430还有ZigBee发现IAR真的挺好用,,,所以以后想着就用IAR写单片机程序,, 这次配置我不会把程序的配置弄得有条理,分开文件夹存放,,,我要把那些文件全都放到一块,,弄得乱七八糟,,,因为自己一开始学习用Keil开发32的时候,,网上的视频建工程全都是建的 很有条理,,对于一开始学的自己当时就感觉特麻烦,,,对于初学者更是感觉麻烦,,反而让初学者觉得难,,,,,所以呢!嘿嘿,,,,,,,哪样简单哪样弄 不要以为我不是一个讲究的人哈,我自己建的工程都是很有条理的,,看我Keil的,,,第一次用IAR嘛,,先怎样简单怎样建,,,,,,,, 首先你要有下载的STM32的固件库 新建一个文件夹 把
[单片机]
关于IAR开发<font color='red'>STM32</font>配置
STM32——PWM基本知识及配置过程
将通用定时器分为四个部分: 1,选择时钟 2,时基电路 3,输入捕获 4,输出比较 本节定时器PWM输出主要涉及到定时器框图右下方部分,即输出比较部分 和上一讲相同,时基时钟来源于内部默认时钟 对此有疑问请参考 : 定时器中断实验 中 定时器时钟选择部分 和 定时器时钟来源部分 什么是PWM 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 PWM工作过程 每个定时器有四个通道,每一个通道都有一个捕获比较寄存器, 将寄存器
[单片机]
<font color='red'>STM32</font>——PWM基本知识及配置过程
基于STM32+华为云IOT设计的智能温室大棚监控系统
一、项目背景 当前文章介绍基于STM32单片机的智能温室大棚监控系统,当前系统由温湿度传感器、二氧化碳传感器、光敏电阻传感器、土壤湿度传感器笨时温宏大棚中内作物生长环境因子主要包括温度、湿度、光度、土壤湿度传感、二氧化碳浓度等参数进行监控。 采集数据,判断是否在系统设定上限、下限范围,如果超出了上限下限蜂鸣器报警、通风系统、LED补光系统、水泵系统就会启也可以通过手机APP和华为云华为云物联网云平台对温室大棚中的数据进行修改和设定新的数据。 本设计整体主要采用STM32单片机为核心、温湿度传感器、二氧化碳传感器、光敏电阻传感器、土壤湿度传感器、通风系统、LED补光系统、水泵系统组成。 (1) 温湿度传感器: 主要对温室大棚
[单片机]
基于STM32+华为云IOT设计的智能温室大棚监控系统
stm32的IO 8种基本类型设置
GPIO_Mode_AIN //模拟输入 一般用作ADC等 GPIO_Mode_IN_FLOATING //浮空输入 可以用作按键 GPIO_Mode_IPD //下拉输入 GPIO_Mode_IPU //上垃输入 GPIO_Mode_Out_OD //开漏输出 GPIO_Mode_Out_PP //推挽输出 GPIO_Mode_AF_OD //复用开漏输出 GPIO_Mode_AF_PP //复用推挽输出 IO的输出类型设置主要还是查询芯片手册或者根据自己应用设置对应的类型。
[单片机]
stm32专题二十七:MPU6050 驱动程序
提供了一个简单的mpu6050的驱动: mpu6050.h #ifndef __MPU6050_H #define __MPU6050_H #include stdint.h #include i2c.h #include usart.h #include stm32f1xx_hal.h /* MPU6050 */ #define DELAY_MS 10 // 初始化延时 #define DEVICE_ADDR (0XD0) // 8位设备地址 #define PWR_MGMT_1 (0X6B) // 电源管理1 #define MPU6050_
[单片机]
<font color='red'>stm32</font>专题二十七:MPU6050 驱动程序
关于在eclipse中调试stm32的djyos工程
djyos作者写了在eclipse中调试2440,但没有说如何调试stm32,对于像我这样的小白来说确实走很多弯路,现在我把相关的过程记下来,供自己以后参考。 1、打开djyos作者的工程,如下图 2.点击下图的小锤子,或者project中的build all,编译工程 3.点下图的那个虫子在里面选Debug Configurations... 3. 4、打开后双击GDB hardware debugging会出现下面的界面,将相关参数填写好 5、点击下图的select other,选择 using standard gdb hardware debugging launcher 6、点击debugg
[单片机]
关于在eclipse中<font color='red'>调试</font><font color='red'>stm32</font>的djyos工程
IAR5.4中创建STM32工程
1. 在 www.st.com 上下载stm32的外设驱动库文件stm32f10x_stdperiph_lib,现在最新的是STM32F10x_StdPeriph_Lib_V3.3.0。 2. 打开stm32f10x_stdperiph_libSTM32F10x_StdPeriph_Lib_V3.3.0ProjectSTM32F10x_StdPeriph_Template文件夹,将EWARMv5文件夹复制到自己的工程文件夹中(这个是IAR下的工程模板,里面的RVMDK是uVision下的模板)。 3. 以ADC例程为例。 打开stm32f10x_stdperiph_libSTM32F10x_StdPeriph_Lib_V3
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved