前言
2023-6-6 16:25:44
以下内容源自《【嵌入式系统】》
仅供学习交流使用
推荐
定时中断实验
定时器控制LED按节奏闪烁,要求一个定时器控制三个LED分别以0.1S、0.5S及1S时长闪烁(10分)
实验结果
第一个灯以0.1s闪烁
第二个灯以0.5s闪烁
第三个灯以1s闪烁
5个一闪1个二
2个二闪1个三
嵌入式中断实验
main
//宏定义 #include "lpc213x.h" #include "TypeDef.h" #include "IrqFiqCtrl.h" extern void IRQEnable(void); extern void IRQDisable(void); extern void FIQEnable(void); extern void FIQDisable(void); #define KET1 1<<16 #define KEY2 1<<17 #define KEY3 1<<18 #define KEY4 1<<19 #define KEY5 1<<20 #define KEY6 1<<21 #define KEYS 0x3f<<16 volatile uint8 count =0; uint8 key_value; volatile uint32 Vkey=0; #define BEEP 1 << 7 /* P0.7控制BEEP,低电平蜂鸣 */ //#define Fpclk 11059200 // system clock freq for ADS #define Fosc 11059200 // 开发板外时钟频率 #define Fcclk (5*Fosc) // Keil 默认的CPU时钟设置 #define Fpclk (Fcclk/4) // Keil 默认的DEV时钟设置 int time_100ms_flag=0; int time_500ms_flag=0; int time_1000ms_flag=0; int time_2000ms_flag=0; const uint32 LED1 = (1 << 18); // P1.18对应LED1 const uint32 LED2 = (1 << 19); const uint32 LED3 = (1 << 20); const uint32 LED4 = (1 << 21); const uint32 LED5 = (1 << 22); //const uint32 LED6 = (1 << 23); //const uint32 LED7 = (1 << 24); //const uint32 LED8 = (1 << 25); const uint32 LEDS8 = (0xFF << 18); //P1[25:18] LED8~LED1 #define HC595_CS (1 << 29) //定时器中断部分 void __irq IRQ_Timer0 (void) { count = count+1; time_100ms_flag=1; /*0.1S标志*/ if ((count %5)==0) time_500ms_flag =1; /*0.5S标志*/ if ((count %10)==0) time_1000ms_flag =1; /*1S标志*/ /*if ((coumnt %20)==0) time_2000ms_fiag =1; 2S标志*/ T0IR=0x01; //清除中断标志 VICVectAddr=0x00;//通知VIC中断处理结束 } //主程序初始化 int main (void) { PINSEL0 = 0x00000000; // 设置管脚 P0[15:0] 连接 GPIO PINSEL1 = 0x00; PINSEL2 &=(~0x08);//P1[25:16] GPIO IO1DIR |=LEDS8;//设置P1[25:16 (LED1)输出 IRQEnable();// IRQ中断使能 /* 定时器0初始化 */ T0TC = 0; // 定时器设置为0 T0PR = 0; // 时钟不分频 T0MCR = 0x03; // 设置T0MR0匹配后复位T0TC,并产生中断标志 T0MR0 = Fpclk/10 ; // 1秒钟定时 --- 匹配目标值 T0TCR = 0x01; // 启动定时器 /*设置定时器0初始化IRQ*/ VICIntSelect =0x00;//所有中断通道读孟为IQ中新 VICVectCntl0= 0x20|0x04;//投置定时器0中断通道分配到VIC_slot_0 VICVectAddr0= (uint32)IRQ_Timer0;//设置中断服务程序地址 VICIntEnable = 1 << 0x04;//使能定时器0中断 IO0DIR = 0x00000000; IO0DIR|=BEEP; IO0SET =BEEP; while (1) { Vkey = (IO0PIN&KEYS); if(Vkey ==KEYS) IO0SET = BEEP; else IO0CLR = BEEP; key_value =0; if(time_100ms_flag ==1) { time_100ms_flag =0; if((IO1SET & LED1) == 0) IO1SET = LED1;//关闭LED1 else IO1CLR = LED1;//点亮LED1 } if(time_500ms_flag == 1) {time_500ms_flag =0; if ((IO1SET & LED2) == 0) IO1SET = LED2;//关闭LED2 else IO1CLR = LED2;//点亮LED2 } if(time_1000ms_flag ==1) {time_1000ms_flag =0; if((IO1SET & LED3) == 0) IO1SET = LED3;//关闭LED3 else IO1CLR = LED3; //点亮LED3 } } }
注意
记得ReBuild一下
最后
2023-6-6 16:27:42
你对我百般注视,
并不能构成万分之一的我,
却是一览无余的你。
祝大家逢考必过
点赞收藏关注哦