定时中断实验【嵌入式系统】

简介: 定时中断实验【嵌入式系统】

前言

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

你对我百般注视,

并不能构成万分之一的我,

却是一览无余的你。

祝大家逢考必过

点赞收藏关注哦

相关文章
|
7月前
|
数据采集 调度 C语言
嵌入式系统中的定时器中断与任务调度
嵌入式系统中的定时器中断与任务调度
403 0
|
芯片 开发者 SoC
E906的中断系统|学习笔记
快速学习 E906的中断系统
551 0
E906的中断系统|学习笔记
|
3月前
|
负载均衡 Linux 调度
NO_HZ: 降低调度时钟中断 【ChatGPT】
NO_HZ: 降低调度时钟中断 【ChatGPT】
|
7月前
|
传感器 存储 安全
基于单片机的定时温控系统的设计_kaic
基于单片机的定时温控系统的设计_kaic
|
5月前
|
监控
LabVIEW与串口通讯在运行一段时间后出现数据接收中断的问题
LabVIEW与串口通讯在运行一段时间后出现数据接收中断的问题
180 0
|
7月前
|
安全 API 异构计算
LabVIEW CompactRIO 开发指南10 确保可靠性与看门狗定时器
LabVIEW CompactRIO 开发指南10 确保可靠性与看门狗定时器
62 1
【单片机】延迟程序&延迟子程序的设计(入门)
【单片机】延迟程序&延迟子程序的设计(入门)
|
存储 前端开发 Linux
操作系统实验一:时钟中断程序设计
操作系统实验一:时钟中断程序设计
200 0
Linux驱动中断与时间篇——高精度定时器hrtimer
Linux驱动中断与时间篇——高精度定时器hrtimer
【C51单片机】中断系统之单一外中断应用
【C51单片机】中断系统之单一外中断应用