#include \"s5pc100.h\"
//发送1个字符
void put_char(const char data)
{
while( !(UART0.UTRSTAT0 & 0x2) );
UART0.UTXH0 = data;
if(data == '\\n')
put_char('\\r');
}
//接收1个字符
char get_char()
{
while( !(UART0.UTRSTAT0 & 0x1) )
return UART0.URXH0;
}
//发送1个字符串
void put_string(const char *pstr)
{
while(*pstr != '\\0')
put_char(*pstr++);
}
//软件延时
void soft_delay( unsigned int mloop )
{
while( --mloop>0 );
}
//串口的初始化
void uart_init()
{
//GPA0.GPA0CON = 0x22; //设置UART接口引脚
//TX FIFO TRIGER | RX FIFO TRIGER | TX FIFO RESET | RX FIFO RESET | FIFO EN
// [7:6] [5:4] [2] [1] [0]
UART0.UFCON0 = 0X00; //FIFO设置寄存器, 禁止使用FIFO
//
UART0.UMCON0 = 0X00; //MODEM设置寄存器,禁止使用AFC
//INFRARED MODE | PARITY MODE | STOP BIT | WORD LEN
//[6] [5:3] [2] [1:0]
UART0.ULCON0 = 0x03; //UART LINE CONTROL,设置数据位格式8 n 1
UART0.UCON0 = (1<<9) | (1<<8) | (1<<2) | (1<<0);
//波特率由 UBRDIV 与 UDIVSLOT0共同决定
//660000000/(16*115200) - 1 = 0x22
UART0.UBRDIV0 = 0X22; //设置波特率115200 bps
UART0.UDIVSLOT0 = 0xdfdd; //
put_string(\"open uart device ok !\\n\");
}
//alarm初始化函数
void alarm_init(void)
{
RTCCON = 0X01;
RTCBCD.BCDSEC = 0x0; //秒
RTCBCD.BCDMIN = 0x59; //分
RTCBCD.BCDHOUR = 0x12; //小时
RTCBCD.BCDDATE = 0x15; //日期
RTCBCD.BCDMON = 0x03; //月
RTCBCD.BCDYEAR = 0x12; //年
RTALM.ALMYEAR = RTCBCD.BCDYEAR ;
RTALM.ALMMON = RTCBCD.BCDMON ;
RTALM.ALMDATE = RTCBCD.BCDDATE ;
RTALM.ALMHOUR = RTCBCD.BCDHOUR ;
RTALM.ALMMIN = RTCBCD.BCDMIN ;
RTALM.ALMSEC = RTCBCD.BCDSEC + 0x20; //系统启动20s后进入alarm中断
RTALM.RTCALM = 0x7f;
RTCCON = 0;
}
//alarm初始化函数
void rtc_tick_init(void)
{
RTCCON = 0X01;
RTALM.RTCALM = 0x7f;
RTCCON = 0;
}
//RTC中断处理函数
void rtcalarm_irq_handler( void )
{
RTCINTP = (1<<1);
VIC0ADDRESS = 0;
put_string(\"clock alarm \");
}
#define VIC0VECTADDR28 ( *( (volatile unsigned int *)0xe4000170 ) )
//主函数
int main()
{
uart_init();
VIC0VECTADDR28 = (unsigned int)rtcalarm_irq_handler; //注册rtc_alarm中断处理函数
alarm_init();
INTERRUPT.VIC0INTENABLE = INTERRUPT.VIC0INTENABLE | (1<<28);
while(1);
return 0;
}
.TEXT
.global _start
_start:
mov r0, #0xfffffff
mcr p15, 0, r0, c1, c0, 2 @使用户模式可以访问所有的协处理器
ldr r5, =0xffffffff
mcr p15, 0, r5, c3, c0, 0 @加上此语句能够在调试时查看到寄存器的值
@初始化所有常用的模式堆栈
ldr r0,stacktop /*get stack top pointer*/
/********svc mode stack********/
mov sp,r0
sub r0,#128*4 //512 byte for irq mode of stack
/****irq mode stack**/
msr cpsr,#0xd2
mov sp,r0
sub r0,#128*4 //512 byte for irq mode of stack
/***fiq mode stack***/
msr cpsr,#0xd1
mov sp,r0
sub r0,#0
/***abort mode stack***/
msr cpsr,#0xd7
mov sp,r0
sub r0,#0
/***undefine mode stack***/
msr cpsr,#0xdb
mov sp,r0
sub r0,#0
/*** sys mode and usr mode stack ***/
msr cpsr,#0x10
mov sp,r0
b main
stop:
b stop
stacktop:
.word stack+4*512
.data
stack: .space 4*512
.end