MSP430F5438 RTC操作实验详解

1.模块原理
如图 ,rtc 由两个分频寄存器 rp0ts,rp1ts 对 rtossel 选择的时钟源进行分频,在日历模式下,时钟源 aclk=32768,经过 rp0ts,rp1ts 分别 256 和 128 分频率后频率为 1hz ,提供给 32 位 rtc 寄存器时钟源,通过 rtcssel 选择 11 或者 10。每 1s ,rtcsec(秒)加一秒,加到 60,秒从 0 开始计数,rtcmin 加 1,rtchour,rtcmon ,rtcyear ,rtcdow(星期),rtcday等 依次这样。并且在日历模式下,rtc 可以设置为 bcd 码显示在存储器中。另外 rtc 提供闹钟功能,我们可以设置 alarm 寄存器的 rtcamin ,rtcahour,rtcaday,rtcadow(星期).另外 rtc 模块也可以作为 32 位计数器使用,其原理方法和 wdt,ta 一致。
2,rtc 内部框图

3,寄存器配置
在 f5xx 单片机硬件 rtc 可以工作在计数器模式也可以工作在日历模式,通过配置寄存器 rtcctl01 的 rtcmode 位来实现对工作模式的选择,当选择工作在日历模式的时候,rt0ps 时钟源自动选择 aclk,tp0ps 分频系数自动为/256,rt1ps 时钟源来自 rt0ps 输出,rt1ps 分频系数自动配置为/128,因此配置 aclk 时钟为 32768hz。
闹钟可以配置分钟,小时,星期,以分钟为例子时间设置完毕后,比如 08:23 分钟设置完毕后,将最高位为 ae 设置为 1,就会闹钟有效果,每个小时的第 23 分钟闹钟响。
影响整个 rtc 模块的时间的误差和时钟关系很大,本硬件 rtc 对时钟可以进行校正,如寄存器。
rtccals 为 1,加计算,每个 lsb 加 4ppm,如果为 0,减计算,每 lsb 减 2。
rtcctl3 寄存器中 rtccalf 配置选择输出 512hz,256hz,1hz 其中一个频率,然后将 rtcclk引脚设置为特殊引脚输出,用示波器观察频率与标准比看相差多少ppm,然后通过寄存器rtcctl2进行校正,例如我选择的是 512hz 频率输出,观察最后的示数为 512.009hz , 计算高出 18ppm,因此在校正时候要减去一个 18ppm,因此 rtcctl2 中位 rtccals 位为 0,减计算。每 lsb 减 2,因此在 rtccal 中赋予数值 9。
4,实验代码:
#include msp430x54x.h
void init_rtc(void);
void init_clk(void);
void init_system(void);
void main(void)
{
wdtctl = wdtpw + wdthold; // 关看门狗
init_system(); // 系统初始化
__bis_sr_register(lpm3_bits + gie); // 进入低功耗 3
}
/************************ rtc 中断*****************************/
#pragma vector=rtc_vector
__interrupt void basic_timer(void)
{
switch(rtciv)
{
case 2 : p1out ^= bit0;break; //rtcrdyifg
case 4 : break;
case 6 : p1out |= bit1;break; //rtcaifg
case 8 : break;
case 10 : break;
}
}
void init_system(void)
{
init_clk(); //调用时钟函数
init_rtc(); //rtc 初始化
p1dir |= bit1 + bit0; //p1.1 p1.0 为输出
p1out &= ~(bit1 + bit0);
}
void init_rtc(void)
{ // bcd 码日历格式输出
rtcctl01 = rtcbcd + rtchold + rtcmode + rtctev_0 ;
rtcps0ctl = rt0pshold ; //配置两个计数器分频
rtcps1ctl = rt1pshold ;
rtcsec = 0x54; //初始化秒
rtcmin = 0x59 ; //初始化分钟
rtchour =0x21; //初始化小时
rtcdow = 0x02 ;
//rtctim1 = 0x0421;
rtcday = 0x24; //日期初始化
rtcmon = 0x11 ; //初始化月份
rtcyear = 0x2005; //初始化年份
rtcaminhr = 0x0180; //闹钟小时和分钟设置
rtcadowday = 0x1203; //闹钟星期和日期设置
rtcctl01 &= ~rtchold; //打开 rtc 模块
rtcps0ctl &= ~rt0pshold; //打开 rtcps0ctl
rtcps1ctl &= ~rt1pshold; //打开 rtcps1ctl
rtcctl0 |= rtcaie + rtcrdyie; //打开安全访问使能 ,闹钟使能
}
void init_clk(void)
{
p7sel |= 0x03; //启动 xt1
ucsctl1 = dcorsel_2; //dco 范围配置
ucsctl4 = selm_3 + sela_0 + sels_4; //设置时钟源
while (sfrifg1 & ofifg) //等待时钟系统正常工作
{
ucsctl7 &= ~( xt1lfoffg + dcoffg);
sfrifg1 &= ~ofifg;
}
}
5,实验现象

兆易创新推出全国产化24nm SPI NAND Flash
病理领域的AI研究也有了新的进展
维安达斯防爆产品广泛应用于智慧城市-综合管廊
电瓶修复技术—给现在的充电挑些毛病!
芯片制造商的战场正转向智能汽车
MSP430F5438 RTC操作实验详解
编程中用到的字符编码知识点
广和通携手产业链合作伙伴开拓更广阔的5G物联网市场
谷歌语音系统AI新科技:同真人声音无法区分
GAP8物联网应用处理器的主要使用案例
2018国际第三代半导体专业赛现场采访星启创新创始人王磊
多目标跟踪雷达的功能主要包括哪些
泰克TDS6804B示波器提升实验室功能
单相电机怎么接电容
电装开发出汽车图像传感器 体积减小50%
中国移动正在放任2G用户的流失
一招让贴标机的接线和编程更简单
NI与摩尔精英签署合作备忘录
网络分析仪中如何理解矢网的框图
RF MEMS开关的运作、优势