通用定时器秒表实验报告三

更新时间:2024-04-05 15:50:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

嵌入式实验三.基于通用定时器秒表的实现

3.3基于通用定时器秒表的实现

一、实验目的

学会编写中断程序

学会应用LM3S9b92的通用定时器 比较通用定时器和systick的特性 二、实验设备

计算机、LM3S9B92开发板、USB A型公口转 Mini B型 5Pin 数据线1 条 三、实验原理

在Stellaris系列ARM内部通常集成有4个通用定时器模块(General-Purpose Timer Module,GPTM),分别称为Timer0、Timer1、Timer2和Timer3。它们的用法是相同的:每个Timer模块都可以配置为一个32位定时器或一个32位RTC定时器;也可以拆分为两个16位的定时/计数器TimerA和TimerB,它们可以被配置为独立运行的定时器、事件计数器或PWM等。 四、实验要求

参照systick设计秒表的思路,应用通用定时器进行计时,实现秒表功能。开发板上的按键SW1起秒表的起始和停止作用,按下SW1键,表示秒表的启动,开始计时,再按下SW1键,则表示秒表的停止。秒表时间的显示,可以采用LED1灯的闪烁方式,或者直接显示在液晶屏上。 五、实验步骤

1、 连接实验设备:使用USB mini B线缆的mini端与开发板ICDI口相连,另一端接到PC机

的USB插口上。

2、 根据实验要求编写、调试、运行程序。并要求在代码上附上相关的注释。 3、 书写实验报告,要求附上程序流程图。

实验代码:

#include \#include

// 定义 LED

#define LED_PERIPH SYSCTL_PERIPH_GPIOF

#define LED_PORT GPIO_PORTF_BASE #define LED_PIN GPIO_PIN_3

#define KEY_PERIPH SYSCTL_PERIPH_GPIOJ #define KEY_PORT GPIO_PORTJ_BASE #define KEY_PIN GPIO_PIN_7

unsigned char count=0; unsigned char flag=0;

void LED(unsigned int n) //根据n值控制LED闪烁次数 { while(n>0) {

GPIOPinWrite(LED_PORT, LED_PIN, 0xFF); // 点亮 LED SysCtlDelay(150 * (TheSysClock / 3000)); // 延时约 150ms GPIOPinWrite(LED_PORT, LED_PIN, 0x00); // 熄灭 LED SysCtlDelay(850 * (TheSysClock / 3000)); // 延时约 850ms n=n-1; } }

int main(void) {

//jtagWait( ); // 防止 JTAG 失效,重要! clockInit( ); // 时钟初始化:晶振, 6MHz

SysCtlPeriEnable(LED_PERIPH); // 使能 LED 所在的 GPIO 端口

GPIOPinTypeOut(LED_PORT, LED_PIN); // 设置 LED 所在的管脚为输出 SysCtlPeriEnable(KEY_PERIPH); // 使能 KEY 所在的 GPIO 端口

GPIOPinTypeIn(KEY_PORT, KEY_PIN); // 设置 KEY 所在管脚为输入

SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0); // 使能 Timer 模块

TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); // 配置 Timer 为 32 位周期定时器

// TimerPrescaleSet(TIMER0_BASE, TIMER_A, 199); // 预先进行 200 分频

TimerLoadSet(TIMER0_BASE, TIMER_A, 16000000); // 设置 Timer 初值,定时 1s

TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // 使能 Timer 超时中断 IntEnable(INT_TIMER0A); // 使能 Timer 中断

GPIOIntTypeSet(KEY_PORT, KEY_PIN, GPIO_LOW_LEVEL); // 设置 KEY 管脚的中断类型 GPIOPinIntEnable(KEY_PORT, KEY_PIN); // 使能 KEY 所在管脚的中断 IntEnable(INT_GPIOJ); // 使能 GPIOJ 端口中断

IntMasterEnable( ); // 使能处理器中断 for (;;) { } }

// SysTick 计数器的中断服务函数 void Timer0A_ISR(void) {

unsigned long ulStatus;

ulStatus = TimerIntStatus(TIMER0_BASE, true); // 读取中断状态 TimerIntClear(TIMER0_BASE, ulStatus); // 清除中断状态,重要! if (ulStatus & TIMER_TIMA_TIMEOUT) // 如果是 Timer 超时中断 {

count++; //计数器加1 return; } }

// GPIOJ 的中断服务函数 void GPIO_Port_J_ISR(void) {

unsigned char ucVal; unsigned long ulStatus;

// IntMasterDisable( ); //关闭中断

ulStatus = GPIOPinIntStatus(KEY_PORT, true); // 读取中断状态 GPIOPinIntClear(KEY_PORT, ulStatus); // 清除中断状态,重要 if (ulStatus & KEY_PIN) // 如果 KEY 的中断状态有效 { if(flag==0){ TimerEnable(TIMER0_BASE, TIMER_A); // 使能 Timer 计数 flag=1; SysCtlDelay(50 * (TheSysClock / 3000)); } else if(flag==1) { TimerDisable(TIMER0_BASE, TIMER_A); // 使能 Timer 计数 flag=0; LED(count); //闪烁LED count=0; //计数置零 SysCtlDelay(10 * (TheSysClock / 3000)); } }

// IntMasterEnable( ); //使能中断

}

流程图:

六、实验心得

通过本次试验,我学会了编写中断程序,学会应用LM3S9b92的通用定时器 ,比较通用定时器和systick的特性.

本文来源:https://www.bwwdw.com/article/bgxr.html

Top