ARM_Linux_NOTE_6

来源:互联网 发布:淘宝打折软件怎么用 编辑:程序博客网 时间:2024/06/03 19:08

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 beepvoid 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 beepvoid 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 timevoid 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}



0 0
原创粉丝点击