2344|0

57

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【TI首届低功耗设计大赛】【超低功耗码表】--方便的Calendar [复制链接]

    在msp430fr5969手册里看到个“RTC_B”模块,原来它还有实时时钟,那可就太方便了。以前本科的时候自己躲在寝室玩51单片机,想做一个彩屏电子日历,花了几天把TFT彩屏驱动做好了,显示的字体从网上找的艺术字,很是美观,但做到最后发现日历不好计算。时间倒还好,定时器定时,累计中断次数,然后到达1s的时候给Seconds加一,以此类推。可是日期就没这么简单了,不仅要考虑闰年平年,每个月的天数也不一样,在网上查了一下,基本都是用计算加查表方式。然后就仿照移植了一个,但做出来跟手机的万年历比较一下发现不对。仔细研究后发现上传者提供的月基数数组竟然有一个月份是错的。再搜了一下发现很多地方都是照抄或转载这个方法,都是同一个月份错了。后来自己按照月基数计算方法重新算了几遍才确认自己是正确的,更改之后果然对了。不禁小小感慨一番。


这是当年做的,忘了哪个月有问题被我改正整了,当时也没有详细记录的习惯。


    当时学校离电子市场比较远,去一次并不容易,所以缺零件都是想办法替换或自己改造,现在想想也是有好处的。如今这430内部都集成了日历,连DS1302这种时钟芯片都不用驱动了,直接设置好,每秒都会产生一次中断,一条语句就读出来了,像这样:


其中currentTime是个Calendar结构体,在rtv_b.h里有声明


研究rtc_b里的函数,初始化函数有两个,分别是
void RTC_B_initCalendar (uint16_t baseAddress,
    Calendar *CalendarTime,
    uint16_t formatSelect)
{
    HWREG8(baseAddress + OFS_RTCCTL01_H) |= RTCHOLD_H;

    HWREG16(baseAddress + OFS_RTCCTL01) &= ~(RTCBCD);
    HWREG16(baseAddress + OFS_RTCCTL01) |= formatSelect;

    HWREG8(baseAddress + OFS_RTCTIM0_L) = CalendarTime->Seconds;
    HWREG8(baseAddress + OFS_RTCTIM0_H) = CalendarTime->Minutes;
    HWREG8(baseAddress + OFS_RTCTIM1_L) = CalendarTime->Hours;
    HWREG8(baseAddress + OFS_RTCTIM1_H) = CalendarTime->DayOfWeek;
    HWREG8(baseAddress + OFS_RTCDATE_L) = CalendarTime->DayOfMonth;
    HWREG8(baseAddress + OFS_RTCDATE_H) = CalendarTime->Month;
    HWREG16(baseAddress + OFS_RTCYEAR) = CalendarTime->Year;
}

void RTC_B_calendarInit (uint16_t baseAddress,
    Calendar CalendarTime,
    uint16_t formatSelect)
{
    HWREG8(baseAddress + OFS_RTCCTL01_H) |= RTCHOLD_H;

    HWREG16(baseAddress + OFS_RTCCTL01) &= ~(RTCBCD);
    HWREG16(baseAddress + OFS_RTCCTL01) |= formatSelect;

    HWREG8(baseAddress + OFS_RTCTIM0_L) = CalendarTime.Seconds;
    HWREG8(baseAddress + OFS_RTCTIM0_H) = CalendarTime.Minutes;
    HWREG8(baseAddress + OFS_RTCTIM1_L) = CalendarTime.Hours;
    HWREG8(baseAddress + OFS_RTCTIM1_H) = CalendarTime.DayOfWeek;
    HWREG8(baseAddress + OFS_RTCDATE_L) = CalendarTime.DayOfMonth;
    HWREG8(baseAddress + OFS_RTCDATE_H) = CalendarTime.Month;
    HWREG16(baseAddress + OFS_RTCYEAR) = CalendarTime.Year;
}
上面一个是用指针方式传递结构体变量,下面一个使用变量名传递(其实还是指针吧),上面那种ram开销应该小一些,效率也会高一些,可为什么还要留下下面那种方法呢?难道只是为了照顾不习惯用指针的开发者吗?求大神解释一下


 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表