考试终于完了···下个任务也要来了···要去玩ZigBee了···
赶紧剩下几天把手上的这块KE02Z好好用一下。:lol
今天研究RTC时钟,RTC时钟是一个很实用的模块,用于计时等等···
用的是官方的例程,表示这个ke02的库写的还是不错的啊,很清楚,一看就明白调用了那些量,值是多少,(不像NXP的库···表示看了很头大)
例程很简单,下载后,1s间隔向串口上传一次时间数据
然后来分析下
RTC_SetTime(&rtc_set_time); //这个函数根据给定的时间结构设置RTC时间。
RTC_SetAlarm(&alarm_set_time); //这个函数根据给定的时间结构设置闹钟RTC时间。发生匹配后立即报警。
RTC_SetupTimerCallback(RTC_Task); //这个函数设置回调函数
RTC_Init(RTC_CLKSRC_1KHZ,0, RTC_CLK_PRESCALER_1000);
这几句完成了对RTC的初始化,和控制.
理解下,前两个应该是设置RTC时钟的模式,类似实时的时间,xx天xx小时xx分xx秒的进位之类的控制
而回调给我的感觉类似触发中断,切换到另一个任务执行,然后再回调到主任务。
下面就是RTC初始化了,看下程序
void RTC_Init(uint8 clkSrc,uint16 modulo, uint8 prescaler)
{
SIM_SCGC |= SIM_SCGC_RTC_MASK; /*enable clock to RTC*/
RTC_MOD= modulo; /*NOTE: RTC_MOD must be written after RTC_SC*/
RTC_SC = 0 | RTC_SC_RTIE_MASK | RTC_SC_RTCO_MASK ;
RTC_SC |= ((clkSrc & 0x3) << 14) | ((prescaler & 0x07)<<8);
/*enable interrupt*/
enable_irq(20);
}
这里应该是设置为1KHz的时钟频率,然后模式0,分频为1/1000,这样就有一个较为准确的1Hz的信号了,也就是1s
还有其他的分频配置,在寄存器RTC_SC中第8-10位
000 Off
001 If RTCLKS = x0, it is 1; if RTCLKS = x1, it is 128. 010 If RTCLKS = x0, it is 2; if RTCLKS = x1, it is 256.
011 If RTCLKS = x0, it is 4; if RTCLKS = x1, it is 512. 100 If RTCLKS = x0, it is 8; if RTCLKS = x1, it is 1024.
101 If RTCLKS = x0, it is 16; if RTCLKS = x1, it is 2048. 110 If RTCLKS = x0, it is 32; if RTCLKS = x1, it is 100.
111 If RTCLKS = x0, it is 64; if RTCLKS = x1, it is 1000.
当然还有时钟源的选择RTC_SC中第14-15位
00 External clock source.
01 Real-time clock source is 1 kHz.
10 Internal clock.
11 Bus clock.
然后···就产生了一个问题,为何要这样写 RTC_SC |= ((clkSrc & 0x3) << 14) | ((prescaler & 0x07)<<8);
而不是直接 RTC_SC |= (clkSrc << 14)|(prescaler<<8);
实际测试,也有一定的误差产生了···这是为何?不太清楚了,以前都是直接位移操作的,貌似也没影响啊,这是一个问题
继续看····
至于中断的产生,应该是这一句话 enable_irq(20);吧,是m0头文件里面的一个定义,用于初始化中断
还发现了个很有趣的函数···void RTC_ConfigADCTriggering (void),貌似是rtc触发adc的转换
试了下,确实如此,会回传AD采样的值,不过为啥回传的是8位的?恩···等会继续研究下ADC··
关于RTC的研究就这样了:loveliness:
|