[Linux]定时器中断

[Linux]定时器中断

INTRODUCTION

接触多了,难的不是写代码而是看手册,搞明白

TIMER0

timer001.png

上面这张图就说明了定时器总体工作原理,自己看的也就这样。不明不白hhh

timer002.png

定时器配置寄存器,上面的截图说的很明白,这里用prescaler 0 用99

timer003.pngtimer004.png

这个地方就是定时器用什么模式。

timer005.png

计数器和比较的一个寄存器

timer006.png

上面这个就是我最不明白了,mux为何用1/16

CODE PROGRAM

 1void timer_init(void)
 2{
 3	/* 设置TIMER0的时钟 */
 4	/* Timer clk = PCLK / {prescaler value+1} / {divider value} 
 5	             = 50000000/(99+1)/16
 6	             = 31250
 7	 */
 8	TCFG0 = 99;  /* Prescaler 0 = 99, 用于timer0,1 */
 9	TCFG1 &= ~0xf;
10	TCFG1 |= 3;  /* MUX0 : 1/16 */
11
12	/* 设置TIMER0的初值 */
13	TCNTB0 = 15625;  /* 0.5s中断一次 */
14
15	/* 加载初值, 启动timer0 */
16	TCON |= (1<<1);   /* Update from TCNTB0 & TCMPB0 */
17
18	/* 设置为自动加载并启动 */
19	TCON &= ~(1<<1);
20	TCON |= (1<<0) | (1<<3);  /* bit0: start, bit3: auto reload */
21
22	/* 设置中断 */
23	register_irq(10, timer_irq);
24}

这就是配置寄存器代码

CODE TECHNIQUE

喜欢c的最大理由就在这

1
2typedef void(*irq_func)(int);
3irq_func irq_array[32];
4

这样用很方便,节省了代码量,程序就是不易读hhhh


    


公众号'艾恩凝'
个人公众号
个人微信
个人微信
    吾心信其可行,
          则移山填海之难,
                  终有成功之日!
                                  ——孙文
    评论
    0 评论
avatar

取消