s3c2410定时器实验代码
时间: 2024-04-22 15:26:03 浏览: 10
以下是一个使用s3c2410定时器的简单实验代码,它实现了定时器0溢出时在LED1上闪烁一次,定时器1溢出时在LED2上闪烁一次的功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <s3c2410.h>
#define LED1_ON() GPBDAT &= ~(1 << 5)
#define LED1_OFF() GPBDAT |= (1 << 5)
#define LED2_ON() GPBDAT &= ~(1 << 6)
#define LED2_OFF() GPBDAT |= (1 << 6)
void timer_init(void)
{
// 定时器0初始化
TCFG0 |= (99 << 8); // 设置分频系数为100
TCFG1 &= ~(0xF << 8); // 设置定时器0时钟源为PCLK
TCNTB0 = 100000; // 设置定时器0初值为1ms
TCON &= ~(0xF << 0); // 停止定时器0
TCON |= (1 << 3) | (1 << 1); // 设置为自动重载模式,并启动定时器0
INTMSK &= ~(1 << 10); // 使能定时器0中断
// 定时器1初始化
TCFG0 |= (99 << 12); // 设置分频系数为100
TCFG1 &= ~(0xF << 12); // 设置定时器1时钟源为PCLK
TCNTB1 = 1000000; // 设置定时器1初值为1s
TCON &= ~(0xF << 4); // 停止定时器1
TCON |= (1 << 11) | (1 << 9); // 设置为自动重载模式,并启动定时器1
INTMSK &= ~(1 << 13); // 使能定时器1中断
}
void timer0_isr(void)
{
LED1_ON();
usleep(500000);
LED1_OFF();
TINT_CSTAT |= (1 << 5); // 清除定时器0中断标志位
}
void timer1_isr(void)
{
LED2_ON();
usleep(500000);
LED2_OFF();
TINT_CSTAT |= (1 << 9); // 清除定时器1中断标志位
}
int main(int argc, char *argv[])
{
int fd;
void *base;
// 映射寄存器地址
fd = open("/dev/mem", O_RDWR | O_SYNC);
base = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x56000000);
close(fd);
// 设置LED1和LED2为输出模式
GPBCON &= ~((3 << 10) | (3 << 12));
GPBCON |= ((1 << 10) | (1 << 12));
GPBDAT |= ((1 << 5) | (1 << 6));
// 初始化定时器
timer_init();
// 开始运行
while (1)
{
// ...
}
return 0;
}
```
在该代码中,首先使用mmap函数将寄存器地址空间映射到进程内存中,以便于直接访问寄存器。然后设置LED1和LED2为输出模式,并初始化定时器0和定时器1。在定时器0和定时器1的中断服务程序中,分别控制LED1和LED2的闪烁,并在最后清除相应的中断标志位。最后,进入主循环等待中断触发。需要注意的是,在使用定时器时,要根据实际需求设置好定时器的分频系数和初值,以确保定时器的精度和时延符合要求。