在线时间151 小时
UID3129923
注册时间2015-5-21
NXP金币0
该用户从未签到
高级会员

- 积分
- 722
- 最后登录
- 2016-1-9
|
本帖最后由 LokTarOgar 于 2015-7-25 21:46 编辑
接上次的PWM控制LED亮度实验:https://www.nxpic.org.cn/module/forum/thread-600270-1-1.html
本次所做实验为RTC(实时时钟)Alarm中断翻转LED。
下面是程序:
主函数:
int main (void)
{
SystemCoreClockUpdate();
PORT_ENABLE_CLK(MKL_PORTB); /* LED配置 */
uart0Init(9600,0,0,8,1);
printf("RTC Demo \r\n");
IO_FUN_SEL(MKL_PORTB,18,1);
IO_FUN_SEL(MKL_PORTB,19,1);
GPIO_DDR_OUTPUT(MKL_PORTB,18);
GPIO_DDR_OUTPUT(MKL_PORTB,19);
GPIO_CLR(MKL_PORTB,18);
GPIO_CLR(MKL_PORTB,18);
rtcInit(0); /* RTC初始化,初始计数值为0 */
rtcIntConfig(1,MKL_RTC_TAI); /* RTC Alarm中断配置 */
rtcStart(); /* 启动RTC */
while(1){
printf("time = %d \r\n" , RTC_TSR);
myDelay(2000);
}
}
RTC初始化:
void rtcInit(INT32U ulSeconds)
{
INT32U i;
SIM_SCGC6 |= SIM_SCGC6_RTC_MASK; /* RTC控制时钟使能 */
SIM_SOPT1 = SIM_SOPT1_OSC32KSEL(MKL_RTC_SOURCE); /* RTC时钟源选择 */
RTC_CR = RTC_CR_SWR_MASK; /* RTC软件复位 */
RTC_CR &= ~RTC_CR_SWR_MASK; /* 解除复位 */
if (RTC_SR & RTC_SR_TIF_MASK){ /* 清除TIF标志 */
RTC_TSR = 0x00000000;
}
if (RTC_SR & RTC_SR_TCE_MASK) { /* 如果RTC已经使能,则禁能 */
RTC_SR &= ~RTC_SR_TCE_MASK;
}
RTC_TSR = ulSeconds;
if (MKL_RTC_SOURCE != 3) {
RTC_CR |= RTC_CR_OSCE_MASK|RTC_CR_SC16P_MASK; /* 使能1KHz时钟,接入16pF电容 */
for(i = 0; i < 0x600000; i++); /* 等待时钟源稳定 */
}
RTC_SR |= RTC_SR_TCE_MASK; /*启动RTC*/
}
void rtcIntConfig(INT32U ulAlarm,INT8U ucIntType)
{
if(ucIntType & MKL_RTC_TSI) {
RTC_IER |= RTC_IER_TSIE_MASK;
NVIC_EnableIRQ(RTC_Seconds_IRQn);
NVIC_SetPriority(RTC_Seconds_IRQn,3); /* 用户自己定义 */
}
if(ucIntType & MKL_RTC_TAI) {
RTC_TAR = ulAlarm; /*设置时间警报初值 */
RTC_IER |= RTC_IER_TAIE_MASK; /*使能时间警报中断*/
NVIC_EnableIRQ(RTC_IRQn); /*允许RTC中断*/
NVIC_SetPriority(RTC_IRQn,3);
}
if(ucIntType & MKL_RTC_TOI) {
RTC_IER |= RTC_IER_TOIE_MASK;
NVIC_EnableIRQ(RTC_IRQn);
NVIC_SetPriority(RTC_IRQn,3); /* 用户自己定义 */
}
if(ucIntType & MKL_RTC_TII) {
RTC_IER |= RTC_IER_TIIE_MASK;
NVIC_EnableIRQ(RTC_IRQn);
NVIC_SetPriority(RTC_IRQn,3); /* 用户自己定义 */
}
}
中断服务函数:
void RTC_IRQHandler(void)
{
if (RTC_SR & RTC_SR_TAF_MASK) {
RTC_TAR = RTC_TAR + 1; /*时间警报值加一*/
GPIO_TOGGLE(MKL_PORTB,19); /*翻转LED*/
}
if (RTC_SR & RTC_SR_TOF_MASK) {
}
if (RTC_SR & RTC_SR_TIF_MASK) {
}
}
依照惯例,串口和IO的程序就不贴了。
简单说明一下本次程序实现的原理:
1.设置时间计数为0
2.设置时间警报为1
3.开启警报中断
4.配置串口和IO
5.串口显示当前时间计算值
6.当时间计数与时间警报相等时,触发中断,翻转LED
程序中红色部分是本次程序实现必须要有的部分,蓝色部分相当于小提示,这部分可能会是程序出错。
本次程序的和兴是时间警报中断触发的时机以及紫色部分,触发时机见下图:
计数与警报相等时不会触发中断,而是等到一次计数增加时触发中断,翻转LED同时将警报值加一。
这样才实现了程序的功能。
但是,由于板子上好像没有外接32.768KHZ的晶振,所以程序中用到的是1KHZ的时钟频率,导致时间计数增加要很长时间。
原本程序是每隔1s翻转一次LED的。
下面是视频,大家可以感受一下:
下面是源工程:
RTC_Alarm.zip
(926.17 KB, 下载次数: 60)
|
评分
-
查看全部评分
|