专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
lpc1768 rtc 每次重上电的话,时间都会慢几秒钟时间?
2019-03-25 20:17
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
NXP MCU
5864
9
1527
关于LPCRTC的问题,我外挂一个时间芯片(RX8025),然后让LPC1768重复的上下电,
RX8025时间正常走时没误差,可
lpc1768 rtc 每次重上电的话,时间都会慢几秒钟时间?大家是否有碰到这种问题! 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
zhaojun_xf
2019-03-26 13:05
/**************************************************************************************
* FunctionName : RTCInit()
* Description : 初始化RTC设置
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void RTCInit(void)
{
LPC_RTC->CCR = 0x0; // 禁止时间计数器
LPC_RTC->ILR = 0x03; // 清除中断
LPC_RTC->CIIR = 0x1; // 使能秒增量中断
LPC_RTC->AMR = 0xFF; // 禁止报警中断
LPC_RTC->CIIR = 0x01; // 计数器递增中断寄存器
NVIC_EnableIRQ(RTC_IRQn); // 设置中断并使能
LPC_RTC->CCR = 0x01; // 启动RTC
}
/**************************************************************************************
* FunctionName : RTCSetClock()
* Description : 设置时间
* EntryParameter : pClock - 时钟值,顺序:秒,分,时,周,日,月,年,采用BCD码
* ReturnValue : None
**************************************************************************************/
void RTCSetClock(uint8 *clock)
{
uint16 clockTmp[7];
// 把BCD码转换成十进制
*(clockTmp+0) = ((*(clock+6)>>4) * 10) + (*(clock+6) & 0x0F) + 2000; // 年
*(clockTmp+1) = ((*(clock+5)>>4) * 10) + (*(clock+5) & 0x0F); // 月
*(clockTmp+2) = ((*(clock+4)>>4) * 10) + (*(clock+4) & 0x0F); // 日
*(clockTmp+3) = ((*(clock+3)>>4) * 10) + (*(clock+3) & 0x0F); // 周
*(clockTmp+4) = ((*(clock+2)>>4) * 10) + (*(clock+2) & 0x0F); // 时
*(clockTmp+5) = ((*(clock+1)>>4) * 10) + (*(clock+1) & 0x0F); // 分
*(clockTmp+6) = ((*(clock+0)>>4) * 10) + (*(clock+0) & 0x0F); // 秒
// 写入设置时间
LPC_RTC->YEAR = *(clockTmp+0); // 年
LPC_RTC->MONTH = *(clockTmp+1); // 月
LPC_RTC->ALDOM = *(clockTmp+2); // 日
LPC_RTC->ALDOW = *(clockTmp+3); // 周
LPC_RTC->HOUR = *(clockTmp+4); // 时
LPC_RTC->MIN = *(clockTmp+5); // 分
LPC_RTC->SEC = *(clockTmp+6); // 秒
}
/**************************************************************************************
* FunctionName : RTCGetClockr()
* Description : 获取时间
* EntryParameter : pClock - 时钟值,顺序:秒,分,时,周,日,月,年,采用BCD码
* ReturnValue : None
**************************************************************************************/
void RTCGetClock(uint8 *clock)
{
uint32 datas;
uint32 times;
uint16 clockTmp[7];
// 读取完整的时钟寄存器
times = LPC_RTC->CTIME0; // SEC(5:0), MIN(13:8), HOUR(20:16), WEEK(26:24)
datas = LPC_RTC->CTIME1; // DATE(4:0), MONTH(11:8), YEAR(31:28)
// 把时钟分别取出放入数组中
*(clockTmp+0) = (datas >> 16) & 0xFFF; // 年
*(clockTmp+1) = (datas >> 8) & 0x0F; // 月
*(clockTmp+2) = datas & 0x1F; // 日
*(clockTmp+3) = (times >> 24) & 0x07; // 周
*(clockTmp+4) = (times >> 16) & 0x1F; // 时
*(clockTmp+5) = (times >> 8) & 0x3F; // 分
*(clockTmp+6) = times & 0x3F; // 秒
// 转成BCD码,放入数组
*(clock+0) = ((*(clockTmp+6)/10) << 4) | (*(clockTmp+6) % 10); // 秒
*(clock+1) = ((*(clockTmp+5)/10) << 4) | (*(clockTmp+5) % 10); // 分
*(clock+2) = ((*(clockTmp+4)/10) << 4) | (*(clockTmp+4) % 10); // 时
*(clock+3) = *(clockTmp+3); // 周
*(clock+4) = ((*(clockTmp+2)/10) << 4) | (*(clockTmp+2) % 10); // 日
*(clock+5) = ((*(clockTmp+1)/10) << 4) | (*(clockTmp+1) % 10); // 月
*(clock+6) = (((*(clockTmp+0)%100)/10) << 4) | ((*(clockTmp+0)%100)% 10); // 年
}
复制代码
加载中...
查看其它9个回答
一周热门
更多
>
相关问题
相关文章
IMX6UL定时器按键消抖实验
0个评论
IMX6UL 裸机C语言IO 输入中断编程
0个评论
Cortex-A7 IO 输入中断系统分析
0个评论
IMX6UL裸机实现C语言按键输入实验
0个评论
IMX6UL裸机实现C语言蜂鸣器实验
0个评论
通过结构体的方式来定义和使用寄存器地址
0个评论
IMX6UL裸机实现C语言LED点亮与闪烁
0个评论
I.MX6U处理器LED灯点亮汇编程序之命令行方式编译与链接
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
- /**************************************************************************************
复制代码* FunctionName : RTCInit()
* Description : 初始化RTC设置
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void RTCInit(void)
{
LPC_RTC->CCR = 0x0; // 禁止时间计数器
LPC_RTC->ILR = 0x03; // 清除中断
LPC_RTC->CIIR = 0x1; // 使能秒增量中断
LPC_RTC->AMR = 0xFF; // 禁止报警中断
LPC_RTC->CIIR = 0x01; // 计数器递增中断寄存器
NVIC_EnableIRQ(RTC_IRQn); // 设置中断并使能
LPC_RTC->CCR = 0x01; // 启动RTC
}
/**************************************************************************************
* FunctionName : RTCSetClock()
* Description : 设置时间
* EntryParameter : pClock - 时钟值,顺序:秒,分,时,周,日,月,年,采用BCD码
* ReturnValue : None
**************************************************************************************/
void RTCSetClock(uint8 *clock)
{
uint16 clockTmp[7];
// 把BCD码转换成十进制
*(clockTmp+0) = ((*(clock+6)>>4) * 10) + (*(clock+6) & 0x0F) + 2000; // 年
*(clockTmp+1) = ((*(clock+5)>>4) * 10) + (*(clock+5) & 0x0F); // 月
*(clockTmp+2) = ((*(clock+4)>>4) * 10) + (*(clock+4) & 0x0F); // 日
*(clockTmp+3) = ((*(clock+3)>>4) * 10) + (*(clock+3) & 0x0F); // 周
*(clockTmp+4) = ((*(clock+2)>>4) * 10) + (*(clock+2) & 0x0F); // 时
*(clockTmp+5) = ((*(clock+1)>>4) * 10) + (*(clock+1) & 0x0F); // 分
*(clockTmp+6) = ((*(clock+0)>>4) * 10) + (*(clock+0) & 0x0F); // 秒
// 写入设置时间
LPC_RTC->YEAR = *(clockTmp+0); // 年
LPC_RTC->MONTH = *(clockTmp+1); // 月
LPC_RTC->ALDOM = *(clockTmp+2); // 日
LPC_RTC->ALDOW = *(clockTmp+3); // 周
LPC_RTC->HOUR = *(clockTmp+4); // 时
LPC_RTC->MIN = *(clockTmp+5); // 分
LPC_RTC->SEC = *(clockTmp+6); // 秒
}
/**************************************************************************************
* FunctionName : RTCGetClockr()
* Description : 获取时间
* EntryParameter : pClock - 时钟值,顺序:秒,分,时,周,日,月,年,采用BCD码
* ReturnValue : None
**************************************************************************************/
void RTCGetClock(uint8 *clock)
{
uint32 datas;
uint32 times;
uint16 clockTmp[7];
// 读取完整的时钟寄存器
times = LPC_RTC->CTIME0; // SEC(5:0), MIN(13:8), HOUR(20:16), WEEK(26:24)
datas = LPC_RTC->CTIME1; // DATE(4:0), MONTH(11:8), YEAR(31:28)
// 把时钟分别取出放入数组中
*(clockTmp+0) = (datas >> 16) & 0xFFF; // 年
*(clockTmp+1) = (datas >> 8) & 0x0F; // 月
*(clockTmp+2) = datas & 0x1F; // 日
*(clockTmp+3) = (times >> 24) & 0x07; // 周
*(clockTmp+4) = (times >> 16) & 0x1F; // 时
*(clockTmp+5) = (times >> 8) & 0x3F; // 分
*(clockTmp+6) = times & 0x3F; // 秒
// 转成BCD码,放入数组
*(clock+0) = ((*(clockTmp+6)/10) << 4) | (*(clockTmp+6) % 10); // 秒
*(clock+1) = ((*(clockTmp+5)/10) << 4) | (*(clockTmp+5) % 10); // 分
*(clock+2) = ((*(clockTmp+4)/10) << 4) | (*(clockTmp+4) % 10); // 时
*(clock+3) = *(clockTmp+3); // 周
*(clock+4) = ((*(clockTmp+2)/10) << 4) | (*(clockTmp+2) % 10); // 日
*(clock+5) = ((*(clockTmp+1)/10) << 4) | (*(clockTmp+1) % 10); // 月
*(clock+6) = (((*(clockTmp+0)%100)/10) << 4) | ((*(clockTmp+0)%100)% 10); // 年
}
一周热门 更多>