查看: 2712|回复: 4

[原创] yl-kl26z开发笔记之定时器RTC中断

[复制链接]

该用户从未签到

12

主题

22

帖子

0

注册会员

Rank: 2

积分
178
最后登录
2017-3-8
发表于 2015-3-17 21:54:39 | 显示全部楼层 |阅读模式
首先是MBED的一个实例
#include "mbed.h"

Timer t;

int main()
{
    t.start();
    printf("Hello World!\n");
    t.stop();
    printf("The time taken was %f seconds\n", t.read());
}

timer是有许多好用的函数的
还有ticker,更加方便快捷
#include "mbed.h"

Ticker tick;
DigitalOut led1(LED_RED);
DigitalOut led2(LED_GREEN);

void flip()
{
    led2 = !led2;
}

int main()
{
    tick.attach(&flip, 0.7); // setup ticker to call flip every 0.7 seconds

    while (true) {
        led1 = !led1;
        wait (0.3); // flip led1 every 0.3 seconds
    }
}

不过这里先给出例程中的RTC函数
#define MKL_RTC_SOURCE  3                                  /* Source 0: System oscillator (OSC32KCLK)  */
                                                            /* Source 1: Reserved                       */
                                                            /* Source 2: RTC_CLKIN                      */
                                                            /* Source 3: LPO 1kHz                       */
#define MKL_RTC_TSI     0x01                                /* Time Seconds Interrupt        时间秒中断           */
#define MKL_RTC_TAI     0x02                                /* Time Alarm Interrupt           时间提醒中断          */
#define MKL_RTC_TOI     0x04                                /* Time Overflow Interrupt       时间溢出中断           */
#define MKL_RTC_TII     0x08                                /* Time Invalid Interrupt            时间无效中断       */

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++);                              /* 等待时钟源稳定                   */
    }
}

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);
        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);                               /* 用户自己定义                     */
    }
}

这个rtcIntConfig(1,MKL_RTC_TAI);                                    /* RTC Alarm中断配置                */

、就是设置时间,配置为Time Alarm Interrupt     ,看RTC_IER寄存器配置就可以完成。
*********************************************************************************************************
void RTC_IRQHandler(void)
{
    if (RTC_SR & RTC_SR_TAF_MASK) {
        RTC_TAR = RTC_TAR + 1;
                         
       GPIO_TOGGLE(MKL_PORTB,18);
                         
    }
    if (RTC_SR & RTC_SR_TOF_MASK) {

    }
    if (RTC_SR & RTC_SR_TIF_MASK) {

    }
}
*********************************************************************************************************

这个里面添加你需要处理的事件,然后继续中断。
现在进行下载,就可以看到LED闪烁了。

回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-18 11:30:08 | 显示全部楼层
本帖最后由 FSL_TICS_ZJJ 于 2015-3-23 09:35 编辑

非常感谢你关于Kinetis的经验分享!
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13142
    最后登录
    2019-1-27
    发表于 2015-3-19 10:53:01 | 显示全部楼层
    支持楼主!
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    91

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    267
    最后登录
    2015-10-23
    发表于 2015-4-28 11:17:39 | 显示全部楼层
    学习了
    回复

    使用道具 举报

    该用户从未签到

    19

    主题

    317

    帖子

    0

    高级会员

    Rank: 4

    积分
    862
    最后登录
    1970-1-1
    发表于 2015-6-5 00:25:21 | 显示全部楼层
    感谢你的经验分享。。。。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-27 08:47 , Processed in 0.090103 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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