没有合适的资源?快使用搜索试试~ 我知道了~
首页STM32之精准RTC时间设计
资源详情
资源评论
资源推荐
STM32之精准之精准RTC时间设计时间设计
本文主要讲了一下关于STM32之精准RTC时间设计,希望对你的学习有所帮助。
一年前开始做STM32的RTC,到现在才开始整理,战线拖得有点长啦。
先说说为啥要做RTC吧,公司有个产品要定时启动语音提示,本来是想使用STM32内部RTC的,后来发现STM32内部RTC时间有些快,产品上的时间,一个月快了3分钟多,一年那就是半个小时还多。
在网上查了资料说,可以软件校准STM32的RTC,这个兴奋啊!
原文:
“
实现RTC 校准的核心之一是库文件Stm321f0x_bkp.c中的void BKP_SetRTCCalibrationValue (uint8_t CalibrationValue) 函数。谈到RTC校准的相关参考文档包括AN2604.pdf,AN2821.pdf和
AN2821.zip。这三个文档都可以从STM32官方网站下载。按照AN2604.pdf描述的原理,RTC 的校准值应在0-127之间。可实现的校准误差对应为0-121ppm。相当于每30天跑快的秒数为0-314s。
”
这个方法,我也不知道有没有人做过,不过我真的把这些资料认真研读,并且做了实验,不过可惜的是,这个方法是让RTC跑慢了下来,但是效果还是不理想,一个月大概快105S的样子(因为这个时间
是推算出来的,两天快7,实验做了5天),所以不得不换方法。
后来,有网友建议使用DS1337,这次我也做了实验,还好这次实验比前面的效果好很多,4天快7S的样子,一个月也有一分钟的误差,这个误差说大不大,说小也不小,可能是有强迫症,然后有重新找
方法,看了好多关于DS3231的资料,这次直接买了一个DS3231的模块,实验比较了一下,三天的时间没什么误差,后来买了芯片搞起来。效果真的不错,一个月的误差在2S的范围内,这次果断用了。
具体的做法是,使用STM32模拟IIC与DS3231进行通信,读取和设置相关参数;然后再通过模拟IIC与OLED进行通信,将实时时间数据显示在OLED上。以下是实验代码:
OLED.h
#ifndef __OLED_H
#define __OLED_H
#include "sys.h"
#include "stdlib.h"
#ifdef __cplusplus
extern "C" {
#endif
/*************Pin Define***************/
#define SCL_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_3) //LED1点亮//P1OUT|=BIT0 //SCL P1.0
#define SCL_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_3) //P1OUT&=~BIT0
#define SDA_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_4) //P1OUT|=BIT1 //SDA P1.1
#define SDA_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_4) //P1OUT&=~BIT1
/****************************************************/
void OLED_Initial(void);
void IIC_Start(void);
void IIC_Stop(void);
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
void Write_IIC_Byte(unsigned char IIC_Byte);
void LCD_Set_Pos(unsigned char x, unsigned char y);
void LCD_CLS(void);
void LCD_P8x16Str(unsigned char x,unsigned char y,unsigned char ch[]);
void LCD_P16x16Ch(unsigned char x,unsigned char y,unsigned char N);
void LCD_P6x8Str(unsigned char x,unsigned char y,unsigned char ch[]);
void Draw_BMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]);
#ifdef __cplusplus
}
#endif
#endif
OLED.c
#include "stm32f10x_i2c.h"
#include "oled.h"
#include "delay.h"
#include "sys.h"
#define XLevelL 0x00
#define XLevelH 0x10
#define XLevel ((XLevelH&0x0F)*16+XLevelL)
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xCF
#define X_WIDTH 128
#define Y_WIDTH 64
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void OLED_Initial()
{
GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/* PB8,9 SCL and SDA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
delay_ms(100); //延时
Write_IIC_Command(0xAE); //display off
Write_IIC_Command(0x20); //Set Memory Addressing Mode
Write_IIC_Command(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
Write_IIC_Command(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
Write_IIC_Command(0xc8); //Set COM Output Scan Direction
Write_IIC_Command(0x00);//---set low column address
Write_IIC_Command(0x10);//---set high column address
Write_IIC_Command(0x40);//--set start line address
Write_IIC_Command(0x81);//--set contrast control register
Write_IIC_Command(0x7f);
Write_IIC_Command(0xa1);//--set segment re-map 0 to 127
Write_IIC_Command(0xa6);//--set normal display
Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64)
Write_IIC_Command(0x3F);//
Write_IIC_Command(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
Write_IIC_Command(0xd3);//-set display offset
Write_IIC_Command(0x00);//-not offset
Write_IIC_Command(0xd5);//--set display clock pide ratio/oscillator frequency
Write_IIC_Command(0xf0);//--set pide ratio
Write_IIC_Command(0xd9);//--set pre-charge period
Write_IIC_Command(0x22); //
Write_IIC_Command(0xda);//--set com pins hardware configuration
Write_IIC_Command(0x12);
Write_IIC_Command(0xdb);//--set vcomh
Write_IIC_Command(0x20);//0x20,0.77xVcc
Write_IIC_Command(0x8d);//--set DC-DC enable
Write_IIC_Command(0x14);//
Write_IIC_Command(0xaf);//--turn on oled panel
LCD_CLS();
LCD_Set_Pos(0,0);
}
/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{
SCL_HIGH;
SDA_HIGH;
SDA_LOW;
SCL_LOW;
}
/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
SCL_LOW;
SDA_LOW;
SCL_HIGH;
SDA_HIGH;
}
/**********************************************
// IIC Write byte
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(IIC_Byte&0x80) //1?0?
SDA_HIGH;
else
SDA_LOW;
SCL_HIGH;
SCL_LOW;
IIC_Byte<<=1; //loop
}
SDA_HIGH;
SCL_HIGH;
SCL_LOW;
}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
Write_IIC_Byte(0x00); //write command
Write_IIC_Byte(IIC_Command);
IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40); //write data
Write_IIC_Byte(IIC_Data);
IIC_Stop();
}
/*********************LCD 设置坐标************************************/
void LCD_Set_Pos(unsigned char x, unsigned char y)
{
Write_IIC_Command(0xb0+y);
Write_IIC_Command(((x&0xf0)>>4)|0x10);
Write_IIC_Command((x&0x0f)|0x01);
}
/*********************LCD复位************************************/
void LCD_CLS(void)
{
unsigned char y,x;
for(y=0;y<8;y++)
{
Write_IIC_Command(0xb0+y);
Write_IIC_Command(0x01);
Write_IIC_Command(0x10);
for(x=0;x<X_WIDTH;x++)
Write_IIC_Data(0);
}
剩余11页未读,继续阅读
weixin_38693084
- 粉丝: 4
- 资源: 927
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0