查看: 4028|回复: 5

[分享] 【YL-KL26Z开发】+ RTC中断翻转LED

[复制链接]

该用户从未签到

42

主题

340

帖子

0

高级会员

Rank: 4

积分
722
最后登录
2016-1-9
发表于 2015-7-25 20:52:54 | 显示全部楼层 |阅读模式
本帖最后由 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


程序中红色部分是本次程序实现必须要有的部分,蓝色部分相当于小提示,这部分可能会是程序出错。


本次程序的和兴是时间警报中断触发的时机以及紫色部分,触发时机见下图:

QQ截图20150725204133.png

计数与警报相等时不会触发中断,而是等到一次计数增加时触发中断,翻转LED同时将警报值加一。
这样才实现了程序的功能。

但是,由于板子上好像没有外接32.768KHZ的晶振,所以程序中用到的是1KHZ的时钟频率,导致时间计数增加要很长时间。
原本程序是每隔1s翻转一次LED的。


下面是视频,大家可以感受一下:



下面是源工程: RTC_Alarm.zip (926.17 KB, 下载次数: 60)

评分

参与人数 1NXP金币 +35 收起 理由
小七 + 35 打赏!

查看全部评分

回复

使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2015-7-25 22:32:46 | 显示全部楼层
    学习,学习。。。 null - 副本 - 副本 - 副本.png null - 副本 - 副本 (2).png null - 副本 - 副本 (3).png null - 副本 - 副本.png null - 副本 (2) - 副本.png null - 副本 (2).png null - 副本 (3).png null - 副本 (4).png null - 副本.png null.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2022-3-3 09:56
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    106

    主题

    836

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    1527
    最后登录
    2023-6-12
    发表于 2015-7-27 15:55:46 | 显示全部楼层
    学习了,有没有测试RTC的精度??

    233r ew.PNG
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    42

    主题

    340

    帖子

    0

    高级会员

    Rank: 4

    积分
    722
    最后登录
    2016-1-9
     楼主| 发表于 2015-7-27 16:09:34 | 显示全部楼层
    jinyi7016 发表于 2015-7-27 15:55
    学习了,有没有测试RTC的精度??

    这倒没有,对于时钟的设置我还不是很熟练
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-18 11:35
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    21

    主题

    945

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2001
    最后登录
    2020-6-8
    发表于 2015-7-29 10:28:45 | 显示全部楼层
    学习,学习。。。  
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16706
    最后登录
    1970-1-1
    发表于 2015-8-16 23:40:51 | 显示全部楼层
    学习了
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-23 14:24 , Processed in 0.245811 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表