S3C2440定时器中断程序详解及源码分析

版权申诉
0 下载量 2 浏览量 更新于2024-10-12 收藏 29KB ZIP 举报
资源摘要信息:"s3c2440定时器中断程序,源码,包括每个寄存器的作用解释" 知识点: 1. s3c2440定时器中断程序介绍 s3c2440是三星公司生产的一款基于ARM920T内核的32位RISC处理器,广泛应用于嵌入式系统。定时器中断是其重要的功能之一,它可以在预设的时间到达时产生中断信号,从而触发中断处理程序的执行。在本资源中,我们将会看到s3c2440定时器中断程序的源码,包括每个寄存器的作用解释。 2. s3c2440定时器中断程序源码解析 在资源压缩包中的timer.c文件中,我们可以看到s3c2440定时器中断程序的源码。程序中包含了定时器的初始化、启动、停止以及中断服务函数等内容。 3. s3c2440定时器寄存器解析 s3c2440定时器模块包括多个寄存器,每个寄存器都有其特定的作用。在timer.c文件中,我们可以看到对这些寄存器的具体操作和解释。例如,TCON寄存器用于控制定时器的启动和停止,TCNTB寄存器用于设置定时器的计数值,TCNTO寄存器用于保存定时器溢出的时间等。 4. s3c2440定时器中断的使用 在main.c文件中,我们可以看到如何使用定时器中断。首先,需要对定时器进行初始化,然后在需要的时候启动定时器。当定时器到达预设的时间后,会产生中断信号,此时会调用中断服务函数进行处理。 5. s3c2440定时器中断程序的应用 在led.c、uart.c、test.c等文件中,我们可以看到s3c2440定时器中断程序的具体应用。例如,在led.c文件中,定时器中断用于控制LED灯的闪烁;在uart.c文件中,定时器中断用于实现串口通信;在test.c文件中,定时器中断用于测试程序的功能等。 6. s3c2440定时器中断程序的编译和运行 在main.dis文件中,我们可以看到s3c2440定时器中断程序的反汇编结果,这可以帮助我们理解程序的执行流程。而main.bin文件则包含了可执行的二进制代码,我们可以将其烧写到s3c2440处理器中进行运行。 总结: 以上就是s3c2440定时器中断程序的主要知识点。通过学习这些知识点,我们可以更好地理解和使用s3c2440的定时器中断功能,从而提高我们对嵌入式系统的开发能力。
2023-02-18 上传

重写下面代码;timer_handle_t itcs_timer_init(timer_handle_t handle, timer_event_cb_t cb_event) { timer_priv_t *timer_priv = handle; if (timer_priv->idx < 0 || timer_priv->idx >= CONFIG_TIMER_NUM) { return NULL; } set_clock_type("cpu-pclk"); // printf("enter timer init fun in driver\n"); uint32_t tempreg = 0; switch (timer_priv->idx) { case 0: timer_priv->base = ITCS_TIMER0_BASE; break; case 1: timer_priv->base = ITCS_TIMER1_BASE; break; default: break; } // printf("unit %d ,timeridx %d, base addr // %08x\n",timer_priv->idx,timer_priv->timeridx,timer_priv->base); switch (timer_priv->timeridx) { case 1: tempreg = readl(timer_priv->base + TIMER_CCR_CONTROL_C1); tempreg |= CCR_RST_ENABLE; writel(tempreg, timer_priv->base + TIMER_CCR_CONTROL_C1); tempreg = readl(timer_priv->base + TIMER_IER_C1); tempreg &= ~(IER_EVNT_ENABLE | IER_ITRV_ENABLE | IER_M1_ENABLE | IER_M2_ENABLE | IER_M3_ENABLE); writel(tempreg, timer_priv->base + TIMER_IER_C1); if (timer_priv->idx == 0) { timer_priv->irq = TTC0_TIMER1_IRQn; request_irq(TTC0_TIMER1_IRQn, itcs_timer_irq, "itcs_timer_irq01", timer_priv); } else { timer_priv->irq = TTC1_TIMER1_IRQn; request_irq(TTC1_TIMER1_IRQn, itcs_timer_irq, "itcs_timer_irq11", timer_priv); } break; case 2: tempreg = readl(timer_priv->base + TIMER_CCR_CONTROL_C2); tempreg |= CCR_RST_ENABLE; writel(tempreg, timer_priv->base + TIMER_CCR_CONTROL_C2); tempreg = readl(timer_priv->base + TIMER_IER_C2); tempreg &= ~(IER_EVNT_ENABLE | IER_ITRV_ENABLE | IER_M1_ENABLE | IER_M2_ENABLE | IER_M3_ENABLE); writel(tempreg, timer_priv->base + TIMER_IER_C2); if (timer_priv->idx == 0) { timer_priv->irq = TTC0_TIMER2_IRQn; request_irq(TTC0_TIMER2_IRQn, itcs_timer_irq, "itcs_timer_irq02", timer_priv); } else { timer_priv->irq = TTC1_TIMER2_IRQn; request_irq(TTC1_TIMER2_IRQn, itcs_timer_irq, "itcs_timer_irq12", timer_priv); } break; case 3: tempreg = readl(timer_priv->base + TIMER_CCR_CONTROL_C3); tempreg |= CCR_RST_ENABLE; writel(tempreg, timer_priv->base + TIMER_CCR_CONTROL_C3); tempreg = readl(timer_priv->base + TIMER_IER_C3); tempreg &= ~(IER_EVNT_ENABLE | IER_ITRV_ENABLE | IER_M1_ENABLE | IER_M2_ENABLE | IER_M3_ENABLE); writel(tempreg, timer_priv->base + TIMER_IER_C3); if (timer_priv->idx == 0) { timer_priv->irq = TTC0_TIMER3_IRQn; request_irq(TTC0_TIMER3_IRQn, itcs_timer_irq, "itcs_timer_irq03", timer_priv); // printf("unit timer1 ret=%08x , request irq3 success!\n",ret); } else { timer_priv->irq = TTC1_TIMER3_IRQn; request_irq(TTC1_TIMER3_IRQn, itcs_timer_irq, "itcs_timer_irq13", timer_priv); // printf("unit timer1 ret=%08x , request irq3 success!\n",ret); } break; default: return NULL; } timer_priv->cb_event = cb_event; // printf("init status irq id num:%d\n",timer_priv->irq); // printf("INIT TIMER %d Timer Count No %d SUCCESS\n", timer_priv->idx, // timer_priv->timeridx); return (timer_handle_t)timer_priv; }

2023-02-17 上传