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"
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;
}
void timer0_init(
void)
{
PWM.TCFG0 = (PWM.TCFG0 & (~(
0xff <<
0))) | (
99 <<
0);
PWM.TCFG1 = (PWM.TCFG1 & (~(
0xf <<
0))) | (
0b0010 <<
0);
PWM.TCNTB0 =
250 -
1;
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);
PWM.TINT_CSTAT = (PWM.TINT_CSTAT & (~(
0x1f <<
5))) | (
1 <<
6);
ICDICPR.ICDICPR2 |= (
1 <<
6);
}
void timer1_init(
int ms)
{
PWM.TCFG0 = (PWM.TCFG0 & (~(
0xff <<
0))) | (
99 <<
0);
PWM.TCFG1 = (PWM.TCFG1 & (~(
0xf <<
4))) | (
0 <<
4);
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);
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;
PWM.TINT_CSTAT = (PWM.TINT_CSTAT & (~(
0x1f <<
5))) | (
1 <<
7);
ICDICPR.ICDICPR2 |= (
1 <<
7);
}
void timer2_init(
void)
{
PWM.TCFG0 = (PWM.TCFG0 & (~(
0xff <<
8))) | (
99 <<
8);
PWM.TCFG1 = (PWM.TCFG1 & (~(
0xf <<
8))) | (
0 <<
8);
PWM.TCNTB2 =
2000000;
PWM.TCON = (PWM.TCON & (~(
0xf <<
12))) | (
0b1010 <<
12);
PWM.TCON = (PWM.TCON & (~(
0xf <<
12))) | (
0b1001 <<
12);
PWM.TINT_CSTAT |= (
1 <<
2);
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);
}
void timer3_init(
void)
{
PWM.TCFG0 = (PWM.TCFG0 & (~(
0xff <<
8))) | (
99 <<
8);
PWM.TCFG1 = (PWM.TCFG1 & (~(
0xf <<
12))) | (
0 <<
12);
PWM.TCNTB3 =
1000000;
PWM.TCON = (PWM.TCON & (~(
0xf <<
16))) | (
0b1010 <<
16);
PWM.TCON = (PWM.TCON & (~(
0xf <<
16))) | (
0b1001 <<
16);
PWM.TINT_CSTAT |= (
1 <<
3);
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();
timer2_init();
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;
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);
timer1_init(
20);
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);
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;
}
转载请注明原文地址: https://ju.6miu.com/read-1298674.html