返回列表 发帖

[原创经验] w90x900驱动之一TIMER设定

[原创经验] w90x900驱动之一TIMER设定

华邦9100-4timer
2 e% d$ i0 [& L$ i嵌入式开发联盟此函数负责timer的初始化:
0 d( v9 ?. `9 I; S) z) Bstatic void w90x900_timer_setup (void)
: A. N7 v2 O1 }9 R* Dmcuos.com{mcuos.com6 B3 X6 c6 D" {

0 ^6 R) u/ r# V9 u3 _# A, v/*----- disable timer -----*/
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习- X- g6 x, E7 U

# v9 a' x2 B$ b& Q7 w: W嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习__raw_writel(0, W90X900_TCSR0);/
/timer
的控制和状态寄存器,主要是为了清除[ce][ie]位的。Couter 使能和interrupt使能。

. J; O: w) g  m7 B本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
$ ~; [8 r5 }- x2 T3 d* G- 嵌入式底层驱动开发技术学习网站__raw_writel(0, W90X900_TCSR1);
- 嵌入式底层驱动开发技术学习网站$ L% b9 ?2 w  `8 L* P% I8 m

2 k* Z  A( `; [) W嵌入式开发联盟__raw_writel(0, W90X900_TCSR2);

# l/ e  B  E8 r嵌入式开发联盟嵌入式开发联盟8 _  f6 w) n0 r4 v" i
__raw_writel(0, W90X900_TCSR3);
- 嵌入式底层驱动开发技术学习网站9 D$ {0 _1 e. [: L3 a& H$ e) g& l
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习9 y3 v0 z' l1 Y# U4 n
__raw_writel(0, W90X900_TCSR4);
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。- a* B$ Y/ I7 }) @: q
       - 嵌入式底层驱动开发技术学习网站, W: `% c0 K  U6 f4 q# {' L% w
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习& q6 Y+ R& k  S
/*----- clear interrupt flag bit -----*/
mcuos.com# i2 j) S, h% K2 G* p- J6 @& A
- 嵌入式底层驱动开发技术学习网站( K# G/ ~$ u6 t# {8 N( P
__raw_writel(0x1F, W90X900_TISR); /
/
中断状态寄存器,这个寄存器是只读的但是可以通过写一清除。
mcuos.com- L3 W' F2 I" J+ ~( a2 W6 S
   
* B' e5 S  X  z( h本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
" ~) \3 ?. [3 t/ `( k- M  N嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习/*----- timer 0 : periodic mode, 100 tick/sec
3 D- _  S  s0 _  |# y& C+ l本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。-----*/
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。5 D8 ]8 Y+ y9 U" |

/ n+ A1 M) N9 @- 嵌入式底层驱动开发技术学习网站__raw_writel(sysclk/(100 * 100), W90X900_TICR0);
9 r2 N( D2 W1 o2 F( B! ^
mcuos.com/ O0 M; G; D8 q
// Sysclk=150000000
W90X900_TICR0timer初始化控制寄存器。填写counter的值。
- 嵌入式底层驱动开发技术学习网站- |& e/ s8 r0 H2 ]% I% r

8 \% @% g1 {4 a; a6 n5 e( U__raw_writel(0x68000063, W90X900_TCSR0);
//
设置周期模式,使能timer,使能中断。填写
PRESCALE
# ?* \& M+ z/ D* J本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。   本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。3 S" {' n# E* q$ x0 Q7 V/ j+ w$ x
}
) {2 h. t" i/ f/ @- z9 Y嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习w90x900_timer_interrupt()本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。5 L8 f& T& f7 m
{
: H; j$ {/ U# O4 ~$ e本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。__raw_writel(0x01, W90X900_TISR); //当开启timer和中断后,在中断处理函数里面要清除中断状态寄存器。否则中断不会来了。
3 N6 N2 {' f% v* R嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习}本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。9 {& R& o' \0 R. \" W
内核之定时器与时间管理
8 S4 F$ G& n! n( o6 A  x/ N3 E认识两个概念:
6 v; ]4 b+ |+ k% O: ~mcuos.comHZ:
+ y. R, p5 n- O7 [: v- 嵌入式底层驱动开发技术学习网站一秒内时钟中断产生的次数,这里是100次。
: {$ }. o0 T& s( Y嵌入式开发联盟jiffes:
8 I% p# r# H: `嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习系统启动以来,时钟中断产生的次数,一秒内增加HZ.
' Q& G* u" i$ v- 嵌入式底层驱动开发技术学习网站因为jiffes可能发生回饶,系统提供了几个接口:- 嵌入式底层驱动开发技术学习网站: \: i: o2 u, k) p* H  v
time_after(a,b), ab的后面 a>b ,小的永远是当前值
3 T, y0 B0 [1 M2 a5 R: n嵌入式开发联盟time_before(a,b) ab的前面 a<b 大的永远是要延时的值
- Q9 m  Q3 h" q8 @- 嵌入式底层驱动开发技术学习网站time_after_eq(a,b)
8 D% ]# j# ^6 U: U1 a, P/ B# M本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。time_before_eq(a,b)
8 j, ~" |6 r; O0 S- b# p例子:
, D; g6 d. e) S4 uunsigned long delay =jiffies+2*HZ    // 2
) Q3 f$ T) `0 F) @6 o/ _# a- 嵌入式底层驱动开发技术学习网站while (!(time_before(jiffies,delay)));2 D3 J& q) m1 k4 f( j' n" L7 w
执行时不要禁止中断
' ]% G, G# f1 `. i( R2 `嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习 嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习" I7 T' O( N" n" V6 |8 [
短延迟:
  d, H) u0 C# Y9 ^8 D  H0 T嵌入式开发联盟ndelay():纳秒嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习0 l$ H9 Q2 ?, Z- G6 O- j2 k
10e -9
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。) G( I1 E' I# g% G- @4 M  k
udelay():微秒
  P0 W" B. e2 O嵌入式开发联盟10e -6

/ A. y1 E. c& R! |mcuos.commdelay():毫秒 10e -3
7 P/ S; R. z) [7 z% [
9 B7 Y  P) [  c, a; a- x5 n3 }- B嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习内核定时器接口:
/ c8 u' ^9 Q. r, Z* L( p, t嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习定义:
3 q0 V' l5 q; h- f4 e+ [1 ]0 ~- 嵌入式底层驱动开发技术学习网站struct timer_list my_timer;- 嵌入式底层驱动开发技术学习网站* ^* w: T: V( q5 J4 Q
初始化 timer_list 内部结构:init_timer(&my_timer);  S4 g% A/ P! O! q
填充用户值:嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习& T: q! X" r5 r1 g' t
my_timer.expires=jiffies+delay;//jiffies单位
' U; ?/ N5 S( h+ w: H本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。my_timer.data=arg_data;//调用定时器处理函数传入的值嵌入式开发联盟; r1 h9 \. G8 u' \6 x
my_timer.function=my_timer_function//到期处理程序7 s- p; o) K8 _5 I" V
添加/激活它:add_timer(&my_timer);//添加并且激活定时器mcuos.com" q+ O$ s) [# n, V7 [
修改/删除:7 w1 q, D5 P$ ?7 f! P7 l2 K
mod_timer(&my_timer,jiffies+new_delay);
9 k- y& Y$ f# z0 U3 J- 嵌入式底层驱动开发技术学习网站del_timer((&my_timer)//不等待其他CPU(如果在运行这个定时)完成.
' J- h! S4 Y9 y. i  w8 t0 C' Ldel_timer_sync((&my_timer)//等待其他CPU(如果在运行这个定时器)完成.本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。8 r$ n0 s  p- t3 U* L; ~
通过软中断实现的
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

返回列表
网页右侧QQ悬浮滚动在线客服
网页右侧QQ悬浮滚动在线客服