|
- #include "exynos_4412.h"
- void mydelay_ms(int ms);
- #define S_CLK 125000
- //125KHz
- unsigned int sound[15] = {
- 0x00,
- 478,426,379,358,319,284,253,
- 235,213,190,179,159,142,127
- };
- //音符0~14
- //半音符15~29 -> 0~14音頻不變,音長變?yōu)槎种?br />
- //連音符30
- unsigned char dis[] = {
- 5,
- 1+7,30,15+1+7,1+7,3+7,
- 2+7,30,15+1+7,2+7,3+7,
- 1+7,30,15+1+7,3+7,5+7,
- 6+7,30,30,6+7,
- 5+7,30,15+3+7,3+7,1+7,
- 2+7,30,15+1+7,2+7,3+7,
- 1+7,30,15+6,6,5,
- 1+7,30,30,
- 0xff
- };
- unsigned char dis3[] = {
- 7+1,7+1,
- 7+5,7+5,
- 7+6,7+6,
- 7+5,30,
- 7+4,7+4,
- 7+3,7+3,
- 7+2,7+2,
- 7+1,30,
- 7+5,7+5,
- 7+4,7+4,
- 7+3,7+3,
- 7+2,30,
- 7+5,7+5,
- 7+4,7+4,
- 7+3,7+3,
- 7+2,30,
- 7+1,7+1,
- 7+5,7+5,
- 7+6,7+6,
- 7+5,30,
- 7+4,7+4,
- 7+3,7+3,
- 7+2,7+2,
- 7+1,30,
- 0xff
- };
- void yin1()
- {
- unsigned int i;
- for(i=0;dis[i] != 0xff;i++)
- {
- if(dis[i] != 30)
- {
- if(dis[i] < 15)
- {
- PWM.TCON = 0;
- mydelay_ms(50);
- PWM.TCNTB0 = sound[dis[i]];
- PWM.TCMPB0 = sound[dis[i]] / 2;
- //手動(dòng)裝載TCNTB0和TCMPB0
- PWM.TCON = 2; //0010
- //自動(dòng)裝載模式,啟動(dòng)定時(shí)器0
- PWM.TCON = 9; //1001
- mydelay_ms(450);
- }
- else
- {
- PWM.TCON = 0;
- mydelay_ms(50);
- PWM.TCNTB0 = sound[dis[i] - 15];
- PWM.TCMPB0 = sound[dis[i] - 15] / 2;
- //手動(dòng)裝載TCNTB0和TCMPB0
- PWM.TCON = 2; //0010
- //自動(dòng)裝載模式,啟動(dòng)定時(shí)器0
- PWM.TCON = 9; //1001
- mydelay_ms(200);
- }
- }
- else
- {
- mydelay_ms(500);
- }
- }
- }
- void yin2()
- {
- unsigned int i;
- for(i=0;dis3[i] != 0xff;i++)
- {
- if(dis3[i] != 30)
- {
- if(dis3[i] < 15)
- {
- PWM.TCON = 0;
- mydelay_ms(100);
- PWM.TCNTB0 = sound[dis3[i]];
- PWM.TCMPB0 = sound[dis3[i]] / 2;
- //手動(dòng)裝載TCNTB0和TCMPB0
- PWM.TCON = 2; //0010
- //自動(dòng)裝載模式,啟動(dòng)定時(shí)器0
- PWM.TCON = 9; //1001
- mydelay_ms(900);
- }
- else
- {
- PWM.TCON = 0;
- mydelay_ms(100);
- PWM.TCNTB0 = sound[dis3[i] - 15];
- PWM.TCMPB0 = sound[dis3[i] - 15] / 2;
- //手動(dòng)裝載TCNTB0和TCMPB0
- PWM.TCON = 2; //0010
- //自動(dòng)裝載模式,啟動(dòng)定時(shí)器0
- PWM.TCON = 9; //1001
- mydelay_ms(400);
- }
- }
- else
- {
- mydelay_ms(1000);
- }
- }
- }
- void do_irq()
- {
- // 獲取中斷號(hào)
- unsigned int irq_num = CPU0.ICCIAR & 0x3ff;
- switch(irq_num)
- {
- case 57:
- GPX2.DAT = GPX2.DAT | (1 << 7);
- printf("This interrupt id is %d\n", irq_num);
- yin1();
- PWM.TCON = 0x8; // 自動(dòng)重裝
- GPX2.DAT = GPX2.DAT & ~(1 << 7);
- // PWM.TCON ^= 0x1;
- // WDT.WTCON=WDT.WTCON|0x1<<0;
- // WDT.WTCON=WDT.WTCON|0x1<<5;
- //PWM.TCON = 0x2; // 手動(dòng)裝載
- //PWM.TCON = 0x8; // 自動(dòng)重裝
- EXT_INT41_PEND = 0x1 << 1; // 清pend(置1清0)
- ICDICPR.ICDICPR1 = 0x1 << 25; // 清gic
- break;
- case 58:
- GPF3.DAT = GPF3.DAT | (1 << 4);
- printf("This interrupt id is %d\n", irq_num);
- // GPX2.DAT = GPX2.DAT ^ (0x1 << 7);
- yin2();
- PWM.TCON = 0x8; // 自動(dòng)重裝
- GPF3.DAT = GPF3.DAT & ~(1 << 4);
- EXT_INT41_PEND = 0x1 << 2; // 清pend(置1清0)
- ICDICPR.ICDICPR1 = 0x1 << 26; // 清gic
- break;
- default:
- printf("error!\n");
- break;
- }
- // 把處理器中處理完的中斷號(hào)返回給gic
- // 告訴gic該中斷處理結(jié)束,可以送入下一個(gè)pending進(jìn)入
- CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x3ff)) | irq_num;
- }
- void peripheral_init()
- {
- GPX1.CON = 0xff << 4; // 配置GPIO為外部中斷
- EXT_INT41_CON = 0x22 << 4; // 下降沿觸發(fā)中斷
- EXT_INT41_MASK = 0x0; // 使能相應(yīng)外設(shè)
- }
- void gic_init()
- {
- ICDISER.ICDISER1 = 0x3 << 25; // 使能按鍵中斷號(hào)
- ICDIPTR.ICDIPTR14 = 0x0101 << 8; // 選擇cpu接口
- ICDDCR = 0x1; // 使能中斷到分配器
- CPU0.ICCICR = 0x1; // 把中斷從cpu接口送入處理器
- // 屏蔽中斷優(yōu)先級(jí),255表示所有中斷都允許通過
- CPU0.ICCPMR = 0xff;
- }
- void mydelay_ms(int ms)
- {
- int i, j;
- while(ms--)
- {
- for (i = 0; i < 5; i++)
- for (j = 0; j < 500; j++);
- }
- }
- void wdt_init(){
- WDT.WTCON=WDT.WTCON&(~(0xff<<8))|(249<<8);
- WDT.WTCON=WDT.WTCON&(~(0x3<<3))|(3<<3);
- WDT.WTDAT=10000;
- WDT.WTCNT=10000;
- }
- void pwm_init()
- {
- GPD0.CON = 0x2; // GPIO配置為TOUT_0
- PWM.TCNTB0 = 1000;
- PWM.TCMPB0 = 500;
- PWM.TCFG0 = 0x63; // 預(yù)分頻值為99 -> 100
- PWM.TCFG1 = 0x3; // 二級(jí)分頻為1/8
- PWM.TCON = 0x2; // 手動(dòng)裝載
- PWM.TCON = 0x8; // 自動(dòng)重裝
- }
- void led_init()
- {
- GPX2.CON = GPX2.CON & ~(0xf << 28) | (0x1 << 28);
- GPF3.CON = GPF3.CON & ~(0xf << 16) | (0x1 << 16);
- GPX2.DAT = GPX2.DAT & ~(1 << 7);
- GPF3.DAT = GPF3.DAT & ~(1 << 4);
- }
- int main()
- {
- peripheral_init();
- gic_init();
- pwm_init();
- led_init();
- int i = 0;
- while(1)
- {
- mydelay_ms(800);
- //WDT.WTCNT=30000;
- }
- return 0;
- }
復(fù)制代碼 |
|