《单片机小白转嵌入式Linux学习记录,基于S3C2440----目录》
定时器中断搞定后就可以像单片一样写一个前后台框架撸代码了。
关于中断的一些开关寄存器请看上一章
中断异常--外部中断配置
定时器时钟框图 看手册 P313
定时器0的相关的寄存器 更详细说明请阅读手册
TCFG0[7:0]->Prescaler 0 : 定时器0和1 的预分频器 0-255
TCFG1[3:0]->MUX 0 : 选择分频的线
TCNTB0[15:0] 装载计数值
TCON 定时器控制寄存器
TCON[1] -> Timer 0 manual update : 手动装计数值,启动自动装载之前要先手动装载一次。并且自动装载之前要把它清除。
TCON[0] -> Timer 0 start/stop :启动/停止 定时器
TCON[3] -> Timer 0 auto reload on/off :自动装载模式
中断开关
INTMSK[10] -> INT_TIMER0 : 打开中断
-------------------------------------------------
代码
typedef void(*irq_func)(int);
irq_func irq_array[32]; //函数指针数组
/* 注册函数 */
void register_irq(int irq, irq_func fp)
{
irq_array[irq] = fp;//注册函数
INTMSK &= ~(1<<irq);//使能中断
}
void handle_irq(void)
{
/* 分辨中断源 */
int bit = INTOFFSET;
/* 调用对应的处理函数 */
irq_array[bit](bit);
/* 清中断 : 从源头开始清 */
SRCPND = (1<<bit);
INTPND = (1<<bit);
}
void timer_irq(void)
{
/* 中断处理函数 */
}
/* 定时器0初始化 */
void timer_init(void)
{
/* 设置TIMER0的时钟 */
/* Timer clk = PCLK / {prescaler value+1} / {divider value}
= 50000000/(99+1)/16
= 31250
*/
TCFG0 = 99; /* Prescaler 0 = 99, 用于timer0,1 */
TCFG1 &= ~0xf;
TCFG1 |= 3; /* MUX0 : 1/16 */
/* 设置TIMER0的初值 */
TCNTB0 = 15625; /* 0.5s中断一次 */
/* 加载初值, 启动timer0 */
TCON |= (1<<1); /* Update from TCNTB0 & TCMPB0 */
/* 设置为自动加载并启动 */
TCON &= ~(1<<1);
TCON |= (1<<0) | (1<<3); /* bit0: start, bit3: auto reload */
/* 设置中断 */
register_irq(10, timer_irq);
}
离线
S3C2440已经不适合做产品了, BOM成本太高。
等你这个系列做完, 希望来一波 《新唐的ARM9(NUC972, N32926)的从入门到放弃》.
新唐的裸奔例程非常丰富, Keil的工程。
晕哥,我真有这个想法!s3c2440 作为入门,下一个准备撸新唐的这款芯片。
离线