watdog(3)

把watdog一直开着,当来一个watdog 中断,打印一句话,当灯亮/灯灭。

*********************************************************************************

watdog.h:

//interrupt

#define VIC0INTENABLE (*(volatile unsigned long *)0x71200010

#define VIC0INTSELECT (*(volatile unsigned long *)0x7120000C)

//模拟watdog
#define VIC0SOFTINT (*(volatile unsigned long *)0x71200018)
#define VIC0SOFTINTCLAR (*(volatile unsigned long *)0x7120001C)
//watdog
#define WTCON    (*(volatile unsigned long *)0x7E004000) 
#define WTDAT    (*(volatile unsigned long *)0x7E004004) 
#define WTCNT    (*(volatile unsigned long *)0x7E004008) 
#define WTCLRINT (*(volatile unsigned long *)0x7E00400C)
//led
#define GPMCON (*(volatile unsigned long *)0x7F008820)
#define GPMDAT (*(volatile unsigned long *)0x7F008824)

*****************************************************************************

test.c:

#include "watdog.h"
void hander_irq();
int (*printf)(char *,...) = (void *)0x57e11d4c;
int tmp=0;
int main()
{
*(volatile unsigned long *)0x56000000 = hander_irq;
//cpsr
__asm__ __volatile__(


"mrs r0,cpsr\n"
"bic r0,r0,#0x80\n"
"msr cpsr,r0\n"
:
:
:"r0","memory"
);
//enable
VIC0INTENABLE |=(1<<26);
//select
VIC0INTSELECT &=~(1<<26);
  //softirq
// VIC0SOFTINT |=(1<<26);


//watdog
WTCON = (1<<2)|(0<<3)|(1<<5)|(255<<8);

//如果WTCON=(1<<0)|(1<<2)|(0<<3)|(1<<5)|(255<<8);中断来的时候就是重启
WTCNT = 0x8000;
WTDAT = 0x8000;
//led
GPMCON = (1<<0)|(1<<4)|(1<<8)|(1<<12);
}
void hander_irq()
{
WTCLRINT = 0;//清楚watdog,wadcnt减完了又会来一次中断,watdat又填充watcnt
printf("this is wat_dong:wang wang\n");
if(tmp == 0)
{
GPMDAT = 0;
tmp = 1;
}
else
{
GPMDAT = 0xf;
tmp = 0;
}
}

*********************************************************************************

vector.s

b reset
b und
b swi
b pre_abt
b data_abt
.word 0x0
b irq
b firq
reset:
und:
mov sp,#0x56000000
mov ip,sp
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4

ldr r0,=string_und
ldr r1,printf
blx r1

mov sp,#0x56000000
ldmdb sp,{fp,sp,pc}^
swi:
mov sp,#0x56000000
mov ip,sp
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4

ldr r0,=string_swi
ldr r1,printf
blx r1

mov sp,#0x56000000
ldmdb sp,{fp,sp,pc}^
pre_abt:
data_abt:
mov sp,#0x56000000
mov ip,sp
sub lr,lr,#4
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4

ldr r0,=string_pre_abt
ldr r1,printf
blx r1

mov sp,#0x56000000
ldmdb sp,{fp,sp,pc}^
irq:
mov sp,#0x56000000
mov ip,sp
sub lr,lr,#4
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4
# 调用函数
mov r0,#0x56000000
ldr r1,[r0]
blx r1

mov sp,#0x56000000
ldmdb sp,{fp,sp,pc}^
firq:
printf:
.word 0x57e11d4c
string_und:
.asciz "hello undefine \n"
.align 2
string_swi:
.asciz "hello swi\n"
.align 2
string_pre_abt:
.asciz "hell data_abt\n"
.align 2
string_irq:
.asciz "hello irq ,wang wang wang  \n"
.align 2

*******************************************************************


makefile同以前。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值