|
但是我的外部晶振是12Mhz的。
关键是我做的这个定时器的定时时间是程序可调的,如果提供定时器控制寄存器的写法,那我就可以根据不同需要调整定时时间。
主要用到的寄存器是
MPLLCON,TCFG1,TCFG0,TCNTB0,TCMPB0,TCON(在s3c2410.h定义)
我曾经试过这样写(在asm-arm/io.h定义outl(),inl())
- void init_timer()
- { int bb;
- //8239.746Hz
- //powermanagement MPLL M=0x52,P=2,S=3
- outl(0x00052023,MPLLCON);
- //mux=11, 16分频
- outl(0x00000003,TCFG1);
- //prescalor=256,
- outl(0x000000FF,TCFG0);
- //
- outl(0x202F,TCNTB0);//8239
- outl(0x202F/2,TCMPB0);
- bb=inl(TCON);
- outl(bb|0x2,TCON);//set the manual update bit
- bb=inl(TCON);
- outl(bb|0x4,TCON);//set the inverter bit
- //start timer0
- bb=(bb&0xD)|0x9;//reset manual update bit,set the start bit and reload bit
- outl(bb,TCON);
- }
复制代码
但是inl(),outl()用的是虚拟地址,上面写法不行。
改成
...
outl(0x00052023,io_p2v(MPLLCON));
...
也不行。以上两种写法都在insmod时出错:
Unable to handle kernel paging request at virtual address a005c040
再改成
...
MPLLCON=0x00052023;
...
insmod时没报错,但时却死机了。 |
|