一、开发环境
硬件平台:FS2410
主机:Ubuntu 10.10
二、关于定时器的原理图:
三、PWM定时器寄存器的配置:
(1)定时器的输入频率的设置:
(2)设置定时器启动灯
(3)设置定时器初值
四、详细代码
timer.c:
#include "s3c2410.h" void delay(long long max) //延迟函数 { for(; max > 0; max--) ; return; } int main(void) { int i; GPFCON = GPFCON & (~(0xff) << 8) | (0x55 << 8); //设置GPF4-GPF7为输出 GPFDAT |= (~(0xf) << 4); //设置4个LED灯全部熄灭 GPBCON |= (2 << 0); //配置GPB0为TOUT0
//时钟频率 = PCLK / (prescaler value + 1) / (drivider value) TCFG0 = TCFG0 & ~(0xff) | 254; //设置prescaler value 为 254 TCFG1 = TCFG1 & ~(0xf); //设置 drivider value 为2 TCNTB0 = 10000; //设置定时器初值 TCMPB0 = 800; //设置比较寄存器 TCON |= 0xf; //设置定时器自动重载,翻转,手动更新,并启动定时器 TCON &= ~(1 << 1); //清除手动更新位 while(1) { GPFDAT &= (~(0xf) << 4); //点亮4个LED灯 for(i = 0; i <= 4; i++) { GPFDAT |= (0xf << i); //形成流水灯 delay(200000); } } return 0; }
程序的汇编启动代码:
start.S:.text .global _start _start: #define WATCHDOG 0x53000000 ldr r0, =WATCHDOG mov r1, #0 str r1, [r0] ldr sp, =1024*4 bl main loop: b loop
Makefile:timer.bin: start.S timer.c arm-none-linux-gnueabi-gcc -c start.S -o start.o arm-none-linux-gnueabi-gcc -c timer.c -o timer.o arm-none-linux-gnueabi-ld -Ttext 0x30008000 start.o timer.o -o timer arm-none-linux-gnueabi-objcopy -O binary -S timer timer.bin clean: rm -f *.o timer.bin
然后在开发板的uboot上输入以下命令:tftp 30008000 timer.bin
go 30008000
实验现象:
形成流水灯且蜂鸣器响起