S3C2440 开发板实战(5):定时器中断

查看手册定时器中断也是在外部中断模式 (irq)下的异常,所以在上一篇外部中断的现有程序上进行修改S3C2440 开发板实战(4):外部中断,重复部分不再赘述。

目录

一、定时器大体结构

二、定时器中断程序设计

I.初始化定时器中断

II. 中断入口函数

III. 设置定时器中断函数


正文:

一、定时器大体结构

查看芯片手册,可以找到以下定时器结构框图

从做到右看,对该图进行分析:(不考虑)

  1. Prescaler:定时器0和1共享一个8位分频器,而定时器2、3、4共享另一个8位分频器。分频器将输入的PCLK分频为:PCLK/(prescaler+1)。
  2. Clock divider & MUX:每个定时器有一个时钟分频器,它产生5个不同的分频信号(1/2,1/4,1/8,1/16,和TCLK)。每个定时器块从时钟分频器接收自己的时钟信号,时钟分频器从相应的8位分频器接收时钟。8位分频器是可编程的,根据加载值对PCLK进行划分,存储在TCFG0和TCFG1寄存器中。此时定时器的时钟频率为:Timer input clock Frequency = PCLK / (prescaler+1) / divider value。
  3. Control logic:计数缓冲区寄存器(TCNTBn)有一初始值,当计时器启用时,该初始值将加载到减计数器中。比较缓冲区寄存器(TCMPBn)有一初始值,它被加载到比较寄存器中,以便与减计数器的值进行比较。TCNTBn和TCMPBn的双缓冲特性使定时器在改变频率和占空比时产生稳定的输出。每个定时器有它自己的16位减计数器,由Timer input clock Frequency 进行计数。当减计数器达到0时,产生定时器中断请求,通知CPU定时器中断。当发生中断时,TCNTBn的值自动加载到下一个计数器中,继续下一个操作。其中可以通过在计时器运行模式期间通过清除计时器启用TCONn的位让计时器停止,TCNTBn的值将不会重新加载到计数器中。
  4. TOUTn & Dead Zone Generator:S3C2440有五个16位定时器。定时器0、1、2、3有脉冲宽度调制(PWM)功能。定时器4只有一个没有输出引脚的内部定时器。定时器0有一个死区发生器。

*PS: 

  • 比较缓冲区寄存器(TCMPBn)用于PWM发生使用
  • 计时器重新加载操作是自动发生的,减计数器达到0。
  • prescaler value = 0~255 ;divider value = 2, 4, 8, 16 
  • 关于死区的内容在之后的博文中讲到(挖坑)

二、定时器中断程序设计

I.初始化定时器中断

这个可以类比外部中断操作(因为同样为irq模式),所以重复寄存器的具体作用在上一篇博客S3C2440 开发板实战(4):外部中断中有提到。

在这里,我们设定终极目标是间隔0.5秒执行一次定时器中断函数。

Setp 1: 打开CPSR中 中断总开关 

mrs    r0,    cpsr

bic    r0,    r0,    #0xf    //将模式设置为user模式
bic    r0,    r0,    (1<<7)  //外部中断IRQ打开

msr    cpsr,  r0             //user模式
ldr    sp,    =0x33f00000    //设置user的栈(没啥用只是和以后的中断地址做比较)

Step 2: INTERRUPT MASK (INTMSK) REGISTER 

void init_EINT(void)
{
    INTMSK &= ~(1<<10);
    // 按键对应的中断: TIMER  ->对应的位为:10
}

Step 3: 配置定时器中断参数

这里以PCLK=50Mhz为例,对于2440来说时钟的配置很简单,具体的时钟设置请看S3C2440 开发板实战(2):start.S初认识 + SDRAM配置 + 重定位的第二部分。

按照公式:Timer input clock Frequency = PCLK / (prescaler+1) / divider value。我们设置prescaler = 99;divider value = 16。可以计算得到定时器时钟的频率为31250hz。所以若要定时1s,计数器装在初值要为31250。按照这个参数配置,设置定时器寄存器如下:

1. TIMER CONFIGURATION REGISTER0 (TCFG0) 

作用:配置两个8位 prescaler,配置死区长度

Do:将 prescaler0 置为99

2. TIMER CONFIGURATION REGISTER1 (TCFG1) 

作用:5-MUX & DMA模式选择

Do: 将Timer对应的Clock divider配置为16分频

3. TIMER 0 COUNT BUFFER REGISTER(TCNTB0)

作用:设置减计数器的初值

Do: 由终极目标可以看出设定的初值为31250 / 2 =15625

4. TIMER CONTROL (TCON) REGISTER 

作用: 更新减计数器的初值、设置为自动装载、启动、输出逆变器

Do: 先手动更新减计数器的初值,然后设置为自动装载并且启动

* 其中 manual update 这位需要在使用之后清0(下一次写入前清0)

综上可得。定时器初始化配置函数如下所示:

void init_timer(void)
{                       //TCLK = PCLK/(99+1)/16 = 31250
    TCFG0 = 0x63;    //prescaler = 99
    TCFG1 &= ~(0xf<<0);
    TCFG1 |= (3<<0);  //1/16 divider
    TCNTB0 = 15625;   // count 15625 (0.5s)

    TCON |= (1<<1);   // updata TCNTB0 to coutor
    TCON &= ~(1<<1);  // CLEAR
    TCON |= ((1<<0) | (1<<3)); // AUTO RELOAD & START
}

II. 中断入口函数

和上一篇中相同,直接上代码!

do_irq:
    /* 执行到这里之前:
     * 1. lr_und保存有被中断模式中的下一条即将执行的指令的地址
     * 2. SPSR_irq保存有被中断模式的CPSR
     * 3. CPSR中的M4-M0被设置为10010, 进入到irq模式
     * 4. 跳到0x18的地方执行程序 
     */

    // 1.保护现场
    ldr sp, =0x33d00000
    /* 在irq异常处理函数中有可能会修改r0-r12, 所以先保存 */
    /*  lr-4  是异常处理完后的返回地址, 也要保存 */
    sub lr, lr, #4
    stmdb sp!, {r0-r12, lr}  

    // 2.处理中断函数
    bl Find_interrupt_source

    /* 3.恢复现场 */
    ldmia sp!, {r0-r12, pc}^  /* ^会把spsr的值恢复到cpsr里 */

III. 设置定时器中断函数

在上一篇中我们设计了一个外部中断的函数模板,所以在这里引用进行延展,所以定时器中断函数

void Find_interrupt_source(void)
{
    puts("begin_interrupt\n\r");
    int bit = INTOFFSET;
    if(bit == 10)
        timer_interrupt_fun();
    /* 清中断 : 从源头开始清 */
    SRCPND = (1<<bit);
    INTPND = (1<<bit);
}

void timer_interrupt_fun(void)
{
    led_control_NOT(4); 
}

void led_control_NOT(int val)
{
    unsigned int val_DATF = GPFDAT;
    if(val_DATF & (1 << val))
        GPFDAT &= ~(1 << val);
    else
        GPFDAT |= (1 << val);
}

运行完就能看见有一个灯在闪烁了,这是我第一次手撸代码解完bug直接实现目标哈哈哈。虽然有了外部中断的程序上修改但是自己动手难道不是兴奋的事情?

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
s3c2440是一款由三星公司开发的嵌入式处理器,广泛应用于嵌入式系统和开发板中。以下是s3c2440开发板的一些主要功能和特点: 1. 处理器:s3c2440采用ARM920T核心,工作频率可达到400MHz。它具有较高的计算性能和低功耗特性,适合嵌入式应用。 2. 存储器:s3c2440开发板通常具有内置的Flash存储器和SDRAM,用于存储操作系统、应用程序和数据。Flash存储器可用于存储启动加载程序和操作系统映像。 3. 外设接口:s3c2440开发板提供了多种外设接口,以支持各种外部设备的连接和扩展。这些接口包括UART(串口)、USB、SPI、I2C、GPIO等,可用于连接显示器、键盘、鼠标、传感器等外部设备。 4. 显示控制器:s3c2440具有强大的显示控制功能,支持LCD显示屏的驱动。它可以输出彩色图像和视频,适用于嵌入式显示应用。 5. 多媒体支持:s3c2440内置了音频编解码器和摄像头接口,可用于实现音频播放、录制和视频捕捉功能。 6. 网络连接:s3c2440开发板通常具有以太网接口,可用于实现网络连接和数据传输。 7. 操作系统支持:s3c2440开发板可以运行各种操作系统,如Linux、Windows CE等。这使得开发者可以使用标准的开发工具和软件库进行应用程序开发。 请注意,s3c2440开发板的具体功能和特点可能因不同的厂商和型号而有所差异。建议您参考所使用的具体开发板的官方文档以获取更详细的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值