浙江工业大学 嵌入式系统原理 实验7
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统实验7
7.1
#include "Config.h"
#include "Target.h"
#define LED (1 << 7) /* P0.7引脚控制LED,低电平点亮*/
/****************************************************************************
* 函数名称:main()
* 函数功能:通过查询定时器0中断标志位控制LED点亮
****************************************************************************/
int main(void)
{
PINSEL0 = 0x00000000; // 设置管脚连接GPIO
IO0DIR = LED; // 设置LED控制口输出
T0TC = 0; // 定时器0初始化
T0PR = 99; // 设置定时器0分频为100分频,得120000Hz
T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC
T0MR0 = 60024; // 比较值(0.5s定时值)
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
while (1)
{
while ((T0IR & 0x01) == 0); // 等待定时时间到
T0IR = 0x01; // 清除中断标志
if ((IO0SET & LED) == 0) // 取反LED状态
IO0SET = LED;
else
IO0CLR = LED;
}
}
7.2
#include "Config.h"
#include "Target.h"
#define LED2 (1 << 7) /* P0.7引脚控制LED2,低电平点亮*/
/************************************************************************************* ** 函数名称:IRQ_Timer0()
** 函数功能:定时器0中断服务程序,取反LED2控制口。
************************************************************************************** void __irq IRQ_Timer0 (void)
{
uint32 i;
i=IO0PIN;
if ((i & LED2) == 0)
IO0SET = LED2; /* 关闭LED2*/
else
IO0CLR = LED2;
T0IR = 0x01; /* 清除中断标志*/
VICVectAddr = 0x00; /* 通知VIC中断处理结束
*/
}
/************************************************************************************* ** 函数名称:Time0Init()
** 函数功能:定时器0初始化。
************************************************************************************** void Time0Init(void)
{
T0TC = 0; // 定时器T0初始化
T0PR = 99; // 设置定时器0分频为100分频,得120000Hz T0MCR = 0x03; // 匹配通道MR0匹配中断并复位TC
T0MR0 = 30012; // MR0比较值(0.5秒定时值)
T0EMR = 0x30; // 设置定时器0的MR0匹配输出,输出方式为翻转T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
T0IR = 0x01;
/* 设置定时器0中断IRQ */
VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
VICVectCntl0 = 0x20 | 0x04; // 分配定时器0中断到通道0(最高优先级)
VICVectAddr0 = (uint32)IRQ_Timer0; // 设置中断服务程序地址向量
VICIntEnable = (1<<4); // 使能定时器0中断
IRQEnable(); // 使能IRQ中断
}
/****************************************************************************
* 名称:main()
* 功能:控制LED2闪烁
****************************************************************************/
int main(void)
{
PINSEL0 = 0x00000080; // 设置管脚P0.3为MAT0.0匹配输出,管脚P0.7为GPIO
IO0DIR = LED2; // 设置LED2控制口输出
Time0Init(); // 定时器0初始化
IO0CLR = LED2; // 等待中断
while(1);
}
#include "Config.h"
#include "Target.h"
#define LED1 (1 << 3) /* P0.3引脚控制LED1,低电平点亮*/
#define LED2 (1 << 15)
#define LED3 (1 << 12)
/************************************************************************************* ** 函数名称:IRQ_Timer1()
** 函数功能:定时器1中断服务程序,取反LED2控制口。
************************************************************************************** void __irq IRQ_Timer1 (void)
{
uint32 i;
i=IO0SET;
if ((i & LED2) == 0)
IO0SET = LED2; /* 关闭LED2*/
else
IO0CLR = LED2;
T1IR = 0x01; /* 清除中断标志*/
VICVectAddr = 0x00; /* 通知VIC中断处理结束*/
}
/************************************************************************************* ** 函数名称:Time0Init()
** 函数功能:定时器0初始化。
************************************************************************************** void Time0Init(void)
{
T0TC = 0; // 定时器T0初始化
T0PR = 99; // 设置定时器0分频为100分频,得120000Hz T0MCR = 0x03; // 匹配通道MR0匹配中断并复位TC
T0MR0 = 30012; // MR0比较值(0.5秒定时值)
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
T0IR = 0x01;
}
/************************************************************************************* ** 函数名称:Time1Init()
** 函数功能:定时器1初始化。
************************************************************************************** void Time1Init(void)
{
T1TC = 0; // 定时器T1初始化
T1PR = 99; // 设置定时器1分频为100分频,得120000Hz T1MCR = 0x03; // 匹配通道MR0匹配中断并复位TC
T1MR0 = 60024; // MR0比较值(0.5秒定时值)
T1EMR = 0x30; // 设置定时器0的MR0匹配输出,输出方式为翻转T1TCR = 0x03; // 启动并复位T0TC
T1TCR = 0x01;
T1IR = 0x01;
/* 设置定时器1中断IRQ */
VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
VICVectCntl0 = 0x20 | 0x05; // 分配定时器1中断到通道0(最高优先级) VICVectAddr0 = (uint32)IRQ_Timer1; // 设置中断服务程序地址向量
VICIntEnable = (1<<5); // 使能定时器1中断
IRQEnable(); // 使能IRQ中断
}
/****************************************************************************
* 名称:main()
* 功能:控制LED1,LED2,LED3闪烁
****************************************************************************/
int main(void)
{
PINSEL0 = 0x02000000; // 设置管脚P0.12为定时器1匹配输出,其他为GPIO
IO0DIR = 0x8008; // 设置LED1,LED2控制口输出
Time0Init(); // 定时器0初始化
Time1Init(); // 定时器1初始化
IO0CLR = LED2; // 等待中断
IO0CLR = LED1;
while(1)
{
while ((T0IR & 0x01) == 0); // 等待定时时间到
T0IR = 0x01; // 清除中断标志
if ((IO0SET & LED1) == 0) // 取反LED1状态
IO0SET = LED1;
else
IO0CLR = LED1;
}
}。