定时中断实验【嵌入式系统】
- 前言
- 推荐
- 定时中断实验
- 实验结果
- main
- 注意
- 最后
前言
2023-6-6 16:25:44
以下内容源自《【嵌入式系统】》
仅供学习交流使用
推荐
GPIO实验【嵌入式系统】
定时中断实验
定时器控制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
你对我百般注视,
并不能构成万分之一的我,
却是一览无余的你。
祝大家逢考必过
点赞收藏关注哦