用s3c2410设计一个秒表 实验代码
时间: 2024-03-13 19:45:59 浏览: 15
以下是一个使用s3c2410设计的简单秒表实验代码,它可以通过按键控制秒表的开始、暂停和复位功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <s3c2410.h>
#define LED_ON() GPBDAT &= ~(1 << 5)
#define LED_OFF() GPBDAT |= (1 << 5)
void timer_init(void)
{
// 设置定时器0分频系数为1,计数器初值为0
TCFG0 &= ~(0xFF << 8);
TCFG1 &= ~(0xF << 8);
TCNTB0 = 0xFFFFFFFF;
// 设置定时器0为自动重载模式,中断请求触发方式为定时器溢出
TCON &= ~(0xF << 0);
TCON |= (1 << 3) | (1 << 1) | (1 << 0);
// 使能定时器0中断
INTMSK &= ~(1 << 10);
}
void timer0_isr(void)
{
TINT_CSTAT |= (1 << 5); // 清除定时器0中断标志位
}
void key_init(void)
{
// 设置按键K1和K2为输入模式
GPFCON &= ~((3 << 0) | (3 << 2));
GPFCON |= ((0 << 0) | (0 << 2));
}
int key_get(void)
{
int val = 0;
// 检测按键K1和K2是否被按下
if (!(GPFDAT & (1 << 0)))
val |= (1 << 0);
if (!(GPFDAT & (1 << 2)))
val |= (1 << 1);
return val;
}
int main(int argc, char *argv[])
{
int fd;
void *base;
unsigned long start_time, curr_time, last_time = 0;
int state = 0;
// 映射寄存器地址
fd = open("/dev/mem", O_RDWR | O_SYNC);
base = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x56000000);
close(fd);
// 设置LED1为输出模式
GPBCON &= ~(3 << 10);
GPBCON |= (1 << 10);
GPBDAT |= (1 << 5);
// 初始化定时器和按键
timer_init();
key_init();
// 开始运行
while (1)
{
int key = key_get();
// 根据按键状态执行相应操作
switch (key)
{
case 0x01: // 按键K1按下
switch (state)
{
case 0: // 开始计时
start_time = TCNTO0;
state = 1;
break;
case 1: // 暂停计时
last_time = curr_time;
state = 2;
break;
case 2: // 恢复计时
start_time = TCNTO0 - last_time;
state = 1;
break;
}
break;
case 0x02: // 按键K2按下
// 复位计时器
last_time = 0;
state = 0;
break;
}
// 更新LED状态
if (state == 1)
{
curr_time = TCNTO0 - start_time;
if (curr_time % 1000 < 500)
LED_ON();
else
LED_OFF();
}
else
{
LED_OFF();
}
}
return 0;
}
```
在该代码中,首先使用mmap函数将寄存器地址空间映射到进程内存中,以便于直接访问寄存器。然后设置LED1为输出模式,并初始化定时器和按键。在主循环中,通过检测按键状态执行开始、暂停和复位计时器的操作,并根据计时器的状态更新LED的闪烁状态。需要注意的是,在使用定时器时,要根据实际需求设置好定时器的分频系数和初值,以确保定时器的精度和时延符合要求。