DSP TMS320F2803x、TMS320F2806x CPU Timer定时器开发笔记(代码基于TMS320F28069 详解)

本文提供了关于DSPF28069芯片中32位CPUTimer0和1的初始化及中断处理的代码实现。代码详细设置了定时器的时钟源、周期、中断使能和仿真模式等参数,并在中断服务函数中处理了LED灯翻转和串口通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详解DSP F28069的 CPU Timer定时器模块,及代码讲解

32-Bit CPU Timers 0/1/2

在这里插入图片描述
在这里插入图片描述

代码讲解

  • timer.h
/*
 * Timer.h
 *
 *  Created on: 2022年6月15日
 *      Author: chends
 */

#ifndef TIMER_H_
#define TIMER_H_

#include "DSP28x_Project.h"

void CpuTimer0_Init(Uint32 Freq, Uint32 Period);
interrupt void dasen_TIM0IRQn(void);

void CpuTimer1_Init(Uint32 Freq, Uint32 Period);
interrupt void dasen_TIM1IRQn(void);

#endif /* TIMER_H_ */
  • timer.c
/*
 * Timer.c
 *
 *  Created on: 2022年6月15日
 *      Author: chends
 */
#include "Timer.h"
#include "Usart.h"

//系统时钟90MHz
//定时器频率f = 90MHz/((TDDR+1)*Period)
void CpuTimer0_Init(Uint32 TDDR, Uint32 Period)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK=1;   //开定时器0时钟
    PieVectTable.TINT0= &dasen_TIM0IRQn;//自定义中断服务函数
    EDIS;

    // CPU Timer 0

    CpuTimer0Regs.TIM.all=0; // Timer counter register
    CpuTimer0Regs.PRD.all=Period;// Period register
    CpuTimer0Regs.TCR.bit.TIF=1;//CPU-Timer溢出标志,当cpu定时器递减到0时,该标志将被设置。对该位写入1将清除标志。
    CpuTimer0Regs.TCR.bit.TIE=1;//CPU-Timer中断使能。如果计时器递减到零,并且TIE被设置,计时器产生断言它的中断请求。

    /*cpu定时器仿真模式
     * 这些位是特殊的模拟位,用于在高级语言调试器中遇到断点时确定计时器的状态。
     * 如果FREE位被设置为1,那么在软件断点时,计时器将继续运行(即自由运行)。
     * FREE=0 & SOFT=0 -> 在TIMH:TIM的下一次递减后停止(硬停止)
     */
    CpuTimer0Regs.TCR.bit.FREE=0;
    CpuTimer0Regs.TCR.bit.SOFT=0;

    //CPU-Timer重载位。0-TRB位总是读取为零。0的写操作将被忽略。
    //1-当你写一个1到TRB时,TIMH:TIM被装入PRDH:PRD中的值,而预标器计数器(PSCH:PSC)被装入定时器分割寄存器(TDDRH:TDDR)中的值。
    CpuTimer0Regs.TCR.bit.TRB=1;

    /*
     * cpu -定时器停止状态位。TSS是一个1位标志,用于停止或启动cpu计时器。
     * 0-读取0表示CPU-timer正在运行。若要启动或重启CPU-timer,可将TSS设置为0。在重置时,TSS被清除为0cpu定时器立即启动。
     * 1-读取1表示CPU-timer停止。如果需要停止cpu定时器,可将TSS设置为1。
     */CpuTimer0Regs.TCR.bit.TSS=0;

     //CpuTimer0Regs.TPR.bit.PSC:cpu定时器预分频计数器,只读。通过TDDR装载进PSC
     /*
      * 每(TDDRH:TDDR + 1)个定时器时钟源周期,对定时器计数器进行寄存器(TIMH:TIM)减1。
        复位时,TDDRH:TDDR位清除为0。
        要将整个计时器计数增加一个整数因子,请将这个因子减去1写入TDDRH:TDDR位。
        当预分频计数器(PSCH:PSC)值为0时,一个定时器时钟源周期后,TDDRH:TDDR中的内容重新加载PSCH:PSC, TIMH:TIM减1。
        TDDRH:TDDR也重新加载PSCH:PSC当定时器重新加载位(TRB)是由软件设置。
      */
     CpuTimer0Regs.TPR.bit.TDDR=(TDDR & 0XFF);
     CpuTimer0Regs.TPRH.bit.TDDRH=(TDDR >> 8);

    //开启CPU 第一组中断并使能第一组中断的第7 个小中断,即定时器0
    IER |= M_INT1;
    PieCtrlRegs.PIEIER1.bit.INTx7=1;

    //使能总中断
    EINT;
    ERTM;
}

void CpuTimer1_Init(Uint32 TDDR, Uint32 Period)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK=1;   //开定时器0时钟
    PieVectTable.TINT1= &dasen_TIM1IRQn;
    EDIS;

    // CPU Timer 0

    CpuTimer1Regs.TIM.all=0; // Timer counter register
    CpuTimer1Regs.PRD.all=Period;// Period register
    CpuTimer1Regs.TCR.bit.TIF=1;//CPU-Timer溢出标志,当cpu定时器递减到0时,该标志将被设置。对该位写入1将清除标志。
    CpuTimer1Regs.TCR.bit.TIE=1;//CPU-Timer中断使能。如果计时器递减到零,并且TIE被设置,计时器产生断言它的中断请求。

    /*cpu定时器仿真模式
     * 这些位是特殊的模拟位,用于在高级语言调试器中遇到断点时确定计时器的状态。
     * 如果FREE位被设置为1,那么在软件断点时,计时器将继续运行(即自由运行)。
     * FREE=0 & SOFT=0 -> 在TIMH:TIM的下一次递减后停止(硬停止)
     */
    CpuTimer1Regs.TCR.bit.FREE=0;
    CpuTimer1Regs.TCR.bit.SOFT=0;

    //CPU-Timer重载位。0-TRB位总是读取为零。0的写操作将被忽略。
    //1-当你写一个1到TRB时,TIMH:TIM被装入PRDH:PRD中的值,而预标器计数器(PSCH:PSC)被装入定时器分割寄存器(TDDRH:TDDR)中的值。
    CpuTimer1Regs.TCR.bit.TRB=1;

    /*
     * cpu -定时器停止状态位。TSS是一个1位标志,用于停止或启动cpu计时器。
     * 0-读取0表示CPU-timer正在运行。若要启动或重启CPU-timer,可将TSS设置为0。在重置时,TSS被清除为0cpu定时器立即启动。
     * 1-读取1表示CPU-timer停止。如果需要停止cpu定时器,可将TSS设置为1。
     */CpuTimer1Regs.TCR.bit.TSS=0;

     //CpuTimer0Regs.TPR.bit.PSC:cpu定时器预分频计数器,只读。通过TDDR装载进PSC
     /*
      * 每(TDDRH:TDDR + 1)个定时器时钟源周期,对定时器计数器进行寄存器(TIMH:TIM)减1。
        复位时,TDDRH:TDDR位清除为0。
        要将整个计时器计数增加一个整数因子,请将这个因子减去1写入TDDRH:TDDR位。
        当预分频计数器(PSCH:PSC)值为0时,一个定时器时钟源周期后,TDDRH:TDDR中的内容重新加载PSCH:PSC, TIMH:TIM减1。
        TDDRH:TDDR也重新加载PSCH:PSC当定时器重新加载位(TRB)是由软件设置。
      */
     CpuTimer1Regs.TPR.bit.TDDR=(TDDR & 0XFF);
     CpuTimer1Regs.TPRH.bit.TDDRH=(TDDR >> 8);

    //开启INT13的中断,它不在PIE中
    IER |= M_INT13;


    //使能总中断
    EINT;
    ERTM;
}


interrupt void dasen_TIM0IRQn(void)
{

     //LED灯翻转
    GpioDataRegs.GPBTOGGLE.bit.GPIO39=1;
    UARTa_SendString("TIMER 0.\r\n");

    CpuTimer0Regs.TCR.bit.TIF=1;//写1清除定时器溢出标志
    CpuTimer0Regs.TCR.bit.TRB=1;//CPU-Timer重载
    PieCtrlRegs.PIEACK.bit.ACK1=1;//清除相应组的中断应答位

}

interrupt void dasen_TIM1IRQn(void)
{

    //LED灯翻转
    GpioDataRegs.GPBTOGGLE.bit.GPIO39=1;
    UARTa_SendString("TIMER 1.\r\n");

    CpuTimer1Regs.TCR.bit.TIF=1;//写1清除定时器溢出标志
    CpuTimer1Regs.TCR.bit.TRB=1;//CPU-Timer重载
	//INT0~12才需要清除相应组的中断应答位,因为它们在PIE模块中。timer1为INT13它是直连CPU的
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木龠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值