board/timer0_beep.c
#include "stdio.h"
#include "s5pv210.h"
#define rTCNTB0 (*(volatile unsigned long *) 0xE250000C)
#define rTCMPB0 (*(volatile unsigned long *) 0xE2500010)
void t0_PortInit()
{
//GPD0CON[3:0] = 0010
rGPD0CON &=~(0x2<<0);
rGPD0CON |=(0x2<<0);
}
void t0_Init()
{
//TCFG0[7:0] = 99
rTCFG0 &=~(0xff<<0);
rTCFG0 |=(0x63<<0);
//TCFG1[3:0] = 0100
rTCFG1 &=~(0xf<<0);
rTCFG1 |=(0x4<<0);
//TCNTB0[] = 4125
rTCNTB0=41250;
//TCMPB0[] = TCNTB0/2
rTCMPB0=rTCNTB0/2;
//TCON[1] = 1;
rTCON |=(0x1<<1);
//TCON[1] = 0;
rTCON &=~(0x1<<1);
//TCON[3] = 1; //auto reload
rTCON |=(0x1<<3);
}
void timer0_onoff()
{
//TCON[0] = 1;
rTCON |=(0x1<<0);
}
int timer0_beep()
{
t0_PortInit();
t0_Init();
timer0_onoff();
return 0;
//while(1);
}
cpu/board.c
#include "stdio.h"
#include "api.h"
int start_armboot()
{
printf(">>>>> welcome to c <<<<<<<\n");
timer0_beep();
return 0;
}
cpu/start.S
.text
.extern uart_init
.extern printf
.extern start_armboot
.global _start
_start:
mov r5,lr
bl uart_init
ldr r0,=fmt
bl printf
bl start_armboot
mov lr,r5<pre name="code" class="plain">
makefile
<pre name="code" class="plain">CC = arm-linux-gcc
LD = arm-linux-ld
OBJCOPY = arm-linux-objcopy
INCLUDEDIR := $(shell pwd)/include/
CPPFLAGS := -nostdinc -nostdlib -I$(INCLUDEDIR)
CFLAGS := -fno-builtin -Wall -O2
export CC LD OBJCOPY CPPFLAGS CFLAGS
OBJS := cpu/start.o cpu/board.o board/timer0_beep.o lib/uart.o lib/libc.a
all:start.bin clean
start.bin:$(OBJS)
$(LD) -Ttext=0x40000000 $(OBJS) -o start.elf
$(OBJCOPY) -O binary -S start.elf $@
%.o:%.S
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
%.o:%.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
clean:
rm -rf ./start.elf
make clean -C cpu
make clean -C board
bx lr fmt:.asciz ">>>>> welcome to arm <<<<<<<\n".end 说明:
这里不需要用到中断,定时器0会有输出到蜂鸣器那控制。