您尚未登录。

楼主 #1 2018-05-23 09:12:11

xinxiaoci
会员
注册时间: 2018-04-18
已发帖子: 71
积分: 71

中断异常--定时器中断

《单片机小白转嵌入式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); 
}

离线

楼主 #3 2018-05-23 12:41:58

xinxiaoci
会员
注册时间: 2018-04-18
已发帖子: 71
积分: 71

Re: 中断异常--定时器中断

晕哥 说:

S3C2440已经不适合做产品了, BOM成本太高。

等你这个系列做完, 希望来一波 《新唐的ARM9(NUC972, N32926)的从入门到放弃》.

新唐的裸奔例程非常丰富, Keil的工程。

晕哥,我真有这个想法!s3c2440 作为入门,下一个准备撸新唐的这款芯片。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn