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
- ARM_Linux_NOTE_6
- jQuery中return false,e.preventDefault(),e.stopPropagation()的区别
- TODO-MVP源码解析
- cf gym101061H Robocon Club(简单计算几何 似乎卡精度)
- maven打war包到指定目录下和tomcat下
- Subsequence
- ARM_Linux_NOTE_6
- Codeforce Gym 100819P : 2015-2016 ACM-ICPC Pacific Northwest Regional Contest - P 仔细看题啊!
- 0058 连续子数组的最大和
- 我的安卓开发学习系列零:为什么选择安卓
- [狗尾续貂第三篇]Redis Sentinel
- json数据转换实例
- HDU 1374 The Circumference of the Circle 计算几何
- Java 标识符
- MATLAB 临时代码-1