ARM

    xiaoxiao2025-05-02  13

    ARM_Linux NOTE_6

    Vine Farer

    2016.08.14


    定时闹钟实验

    RTC设置初试时间,并设置闹钟时间

    Timer 3定时每隔1s打印一次RTC时钟时间

    alarm中断触发闹钟后,用Timer 0驱动Beep响铃

    Timer 2定时每两秒一次中断,启停Beep,实现间断响铃效果

    Key3按键中断,关闭Beep

    Timer 1定时20ms用于按键消抖

    功能函数(用head.h存放)

    #include "exynos_4412.h" // int flag_beep = 10; /**************************************************/ void beep_init(void) { GPD0.CON = (GPD0.CON & (~(0xf << 0))) | (0x2 << 0); flag_beep = 1; } void beep_pend(void) { GPD0.CON = (GPD0.CON & (~(0xf << 0))); flag_beep = 0; } /**************************************************/ void (*irq_handler[160])(void); void do_irq(void) { int irq_num; irq_num = CPU0.ICCIAR & 0x3ff; printf("%d\n",irq_num); (*irq_handler[irq_num])(); CPU0.ICCEOIR = (CPU0.ICCEOIR & (~(0x3ff))) | irq_num; } /**************************************************/ //driving beep void timer0_init(void) { PWM.TCFG0 = (PWM.TCFG0 & (~(0xff << 0))) | (99 << 0);// 100 / 100 = 1M PWM.TCFG1 = (PWM.TCFG1 & (~(0xf << 0))) | (0b0010 << 0);// 1 / 4 = 250k PWM.TCNTB0 = 250 - 1; // 1M / 100 = 1k PWM.TCNTO0 = 125; PWM.TCON = (PWM.TCON & (~(0xf << 0))) | (0b1010 << 0); PWM.TCON = (PWM.TCON & (~(0xf << 0))) | (0b1001 << 0); } /**************************************************/ void timer1_interrupt(void) { printf(">>>>>>>>>>>> timer1\n"); if (0 == (GPX1.DAT & (1 << 1))) printf(">>>>>>>>>>>> delay key2\n"); PWM.TCON &= ~(1 << 12);//close timer2_PWM for delaying beep // PWM.TCON = (PWM.TCON & (~(0xf << 12))) | (0b0000 << 12); PWM.TINT_CSTAT = (PWM.TINT_CSTAT & (~(0x1f << 5))) | (1 << 6); ICDICPR.ICDICPR2 |= (1 << 6); } //key2 filiter按键消抖 void timer1_init(int ms) { PWM.TCFG0 = (PWM.TCFG0 & (~(0xff << 0))) | (99 << 0);// 100 / 100 = 1M PWM.TCFG1 = (PWM.TCFG1 & (~(0xf << 4))) | (0 << 4);// 1 / 1 = 1M PWM.TCNTB1 = 1000 * ms; PWM.TCON = (PWM.TCON & (~(0xf << 8))) | (0b1010 << 8); PWM.TCON = (PWM.TCON & (~(0xf << 8))) | (0b0001 << 8); PWM.TINT_CSTAT |= (1 << 1);//Timer 3 interrupt enable /*38 70 ¨C TIMER1*/ irq_handler[70] = timer1_interrupt; ICDISR.ICDISR2 &= ~(1 << 6); ICDISER.ICDISER2 |= (1 << 6); ICDIPTR.ICDIPTR17 = (ICDIPTR.ICDIPTR17 & (~(0xff << 16))) | 1 << 16; } /**************************************************/ void timer2_interrupt(void) { printf(">>>>>>>>> timer2 change beep\n"); GPD0.CON ^= 1 << 1;//change status of beep // if(1 == flag_beep){ // printf("flag: %d ", flag_beep); // beep_pend(); // printf("flag: %d >>> now beep pend\n", flag_beep); // }else if(0 == flag_beep){ // printf("flag: %d ", flag_beep); // beep_init(); // printf("flag: %d >>> now beep init\n", flag_beep); // } PWM.TINT_CSTAT = (PWM.TINT_CSTAT & (~(0x1f << 5))) | (1 << 7); ICDICPR.ICDICPR2 |= (1 << 7); } //for delaying beep void timer2_init(void) { PWM.TCFG0 = (PWM.TCFG0 & (~(0xff << 8))) | (99 << 8);// 100 / 100 = 1M PWM.TCFG1 = (PWM.TCFG1 & (~(0xf << 8))) | (0 << 8);// 1 / 1 = 1M PWM.TCNTB2 = 2000000; // delay 2s PWM.TCON = (PWM.TCON & (~(0xf << 12))) | (0b1010 << 12); PWM.TCON = (PWM.TCON & (~(0xf << 12))) | (0b1001 << 12); PWM.TINT_CSTAT |= (1 << 2);//Timer 3 interrupt enable /* 39 71 - TIMER2*/ irq_handler[71] = timer2_interrupt; ICDISR.ICDISR2 &= ~(1 << 7); ICDISER.ICDISER2 |= (1 << 7); ICDIPTR.ICDIPTR17 = (ICDIPTR.ICDIPTR17 & (~(0xff << 24))) | 1 << 24; } /**************************************************/ void timer3_interrupt(void) { printf("2%03x-%02x-%02x week_%x %02x:%02x:%02x\n", RTC.BCDYEAR,RTC.BCDMON,RTC.BCDDAY,RTC.BCDWEEK, RTC.BCDHOUR,RTC.BCDMIN,RTC.BCDSEC); PWM.TINT_CSTAT = (PWM.TINT_CSTAT & (~(0x1f << 5))) | (1 << 8); ICDICPR.ICDICPR2 |= (1 << 8); } //for delay print BCD time void timer3_init(void) { PWM.TCFG0 = (PWM.TCFG0 & (~(0xff << 8))) | (99 << 8);// 100 / 100 = 1M PWM.TCFG1 = (PWM.TCFG1 & (~(0xf << 12))) | (0 << 12);// 1 / 1 = 1M PWM.TCNTB3 = 1000000; // 1M / 1M = 1 1s PWM.TCON = (PWM.TCON & (~(0xf << 16))) | (0b1010 << 16); PWM.TCON = (PWM.TCON & (~(0xf << 16))) | (0b1001 << 16); PWM.TINT_CSTAT |= (1 << 3);//Timer 3 interrupt enable /*40 72 ¨C TIMER3 */ irq_handler[72] = timer3_interrupt; ICDISR.ICDISR2 &= ~(1 << 8); ICDISER.ICDISER2 |= (1 << 8); ICDIPTR.ICDIPTR18 = (ICDIPTR.ICDIPTR18 & (~(0xff << 0))) | 1 << 0; } /**************************************************/ void alarm_interrupt(void) { beep_init(); timer0_init();//driving beep timer2_init();//for delaying beep printf(">>>>>>>>>>>>>>>>> alarm\n"); RTCINTP |= (1 << 1); ICDICPR.ICDICPR2 |= (1 << 12); } void RTC_init(void) { RTCCON = (RTCCON & (~(0xf << 0))) | (0b0001 << 0); RTC.BCDYEAR = 0x16; RTC.BCDMON = 0x08; RTC.BCDDAY = 0x13; RTC.BCDWEEK = 0x07; RTC.BCDHOUR = 0x20; RTC.BCDMIN = 0x30; RTC.BCDSEC = 0x45; RTCCON = RTCCON & (~(0xff << 0)); RTCALM.SEC = 0x00; RTCALM.ALM = 0b1000001; /*44 76 ¨C RTC_ALARM */ irq_handler[76] = alarm_interrupt; ICDISR.ICDISR2 &= ~(1 << 12); ICDISER.ICDISER2 |= (1 << 12); ICDIPTR.ICDIPTR19 = (ICDIPTR.ICDIPTR19 & (~(0xff << 0))) | 1 << 0; } /**************************************************/ void key2_interrupt(void) { printf(">>>>> key2\n"); PWM.TCON &= ~(1 << 0);//close timer0_PWM for beep timer1_init(20); // beep_pend(); EXT_INT41_PEND |= (1 << 1); ICDICPR.ICDICPR1 |= (1 << 25); } void key2_init(void) { GPX1.CON = (GPX1.CON & (~(0xf << 4))) | (0xf << 4); EXT_INT41_CON = (EXT_INT41_CON & (~(0xf << 4))) | (0x2 << 4); EXT_INT41_FLTCON0 = (EXT_INT41_FLTCON0 & (~(0xff << 8))) | (1 << 15) | (0 << 14); EXT_INT41_MASK &= ~(1 << 1); /*25 57 GPX1_1*/ irq_handler[57] = key2_interrupt; ICDISR.ICDISR1 &= ~(1 << 25); ICDISER.ICDISER1 |= (1 << 25); ICDIPTR.ICDIPTR14 = (ICDIPTR.ICDIPTR14 & (~(0xff << 8))) | 1 << 8; }

    main函数

    #include "exynos_4412.h" #include "head.h" int main(void) { RTC_init(); key2_init(); timer3_init(); ICDDCR = 1; CPU0.ICCICR = 1; while(1){ } return 0; // mov pc,lr bx lr }


    转载请注明原文地址: https://ju.6miu.com/read-1298674.html
    最新回复(0)