精华内容
下载资源
问答
  • DSP2812的定时器

    2009-05-18 10:27:31
    基于DSP2812的定时器的源代码,很多程序里都用的到。
  • DSP2812的定时器驱动程序 DSP2812的定时器驱动程序
  • dsp2812的定时器例子

    2009-08-19 10:06:52
    dsp2812的定时器例子,仔细看看可能对你有所帮助。
  • DSP2812定时器

    千次阅读 2018-10-21 10:16:47
    DSP TMS320F2812芯片内部有3个32位CPU定时器-Timer0、Timer1、Timer2,其中CPU定时器1,2被系统保留,定时器0供用户使用。 定时器工作原理说明 CPU定时器的工作原理如下图所示 所包含寄存器主要有预定标...

    DSP TMS320F2812芯片内部有3个32位的CPU定时器-Timer0、Timer1、Timer2,其中CPU定时器1,2被系统保留,定时器0供用户使用。

    定时器工作原理说明

    CPU定时器的工作原理如下图所示
    在这里插入图片描述
    所包含的寄存器主要有预定标寄存器TPR计数器寄存器TIM周期寄存器PRD控制寄存器TCR;前3个寄存器都是16位的,因此用2个寄存器来表示32位,表示为XXXH:XXX。其中TPR寄存器中又分为分频器TDDR和PSC,分别占据TPR的高8位和低8位。而TDDRH和PSCH分别占据TPRH的高8位和低8位。

    • 预定标计数器PSC:PSCH:PSC,采用两个8位表示16位,PSC为TPR寄存器的低8位,PSCH为TPRH寄存器的低8位。每隔一个SYSCLKOUT脉冲,预定标计数器PSC中的计数值减1,当PSC中的值减为0时,就会输出一个TIMCLK到TIMH:TIM,从而TIMH:TIM减1。
    • 分频器TDDR:TDDRH:TDDR,采用两个8位表示16位,TDDR为TPR寄存器的高8位,TDDRH为TPRH寄存器的高8位。PSC中的值减小到0或初始重装载时,将TDDR中的值重新装载到PSC,进行新一轮的递减。
    • 计数器寄存器TIM:当PSC输出一个TIMCLK到TIM时,TIM减1,当TIM减小到0后,便会产生一个中断信号。
    • 周期寄存器PRD:PRDH:PRD,采用两个16位的寄存器表示32位,该寄存器设置定时器的周期值,每当TIM减小到0或初始重装载时,将PRD寄存器中的值装载到TIM,开始新一轮的计数。

    因此,如果想用定时器来计量一段时间,需要设置的寄存器只有两个:一个是周期寄存器PRDH:PRD;一个是分频器TDDRH:TRRD。
    TDDR决定了发送一个TIMCLK的时间,假设系统时钟SYSCLKOUT的值为X(单位MHZ):
    TIMCLK=TDDRH:TDDR+1X106(s) TIMCLK= \frac{TDDRH:TDDR + 1}{X} *10^{-6} (单位s)
    CPU定时器一个周期计数了(PRDH:PRD+1)次,因此CPU定时器一个周期所计量时间为:
    T=PRDH:PRD+1TDDRH:TDDR+1X106(s) T= (PRDH:PRD + 1)* \frac{TDDRH:TDDR + 1}{X} *10^{-6} (单位s)
    通常的应用时,已知要定时的时间T和CPU的系统时钟X,且通常将TDDRH:TDDR寄存器的值设置为0,则要实现时间T,必须将PRDH:PRD寄存器的值设置为T*X,其中,T单位为us,X单位为MHZ。

    定时器代码实例

    InitCpuTimers();   // 初始化CPU定时器
    ConfigCpuTimer(&CpuTimer0, 150, 1000000);   //配置CPU定时器,系统时钟选择150MHZ,定时时间选择1S
    
    void InitCpuTimers(void)
    {
        // CPU Timer 0
    	// 将CPU Timer 0的寄存器地址赋值给CpuTimer0结构体:
    	CpuTimer0.RegsAddr = &CpuTimer0Regs;
    	// 初始化周期寄存器为32位的最大值:
    	CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;
    	// 初始化分频器PDDR为0,每一个TIMCLK时间为1/150 us:
    	CpuTimer0Regs.TPR.all  = 0;
    	CpuTimer0Regs.TPRH.all = 0;
    	// 确保定时器是停止状态:
    	CpuTimer0Regs.TCR.bit.TSS = 1;
    	// 重新把PRD加载到TIM,把TDDR加载到PSC:
    	CpuTimer0Regs.TCR.bit.TRB = 1;
    	// 重置中断计数:
    	CpuTimer0.InterruptCount = 0;
    }
    
    void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
    {
    	Uint32 	temp
    	// 初始化定时器计数值:
    	Timer->CPUFreqInMHz = Freq;               //CPU系统时间为150Mhz
    	Timer->PeriodInUSec = Period;             //定时器定时周期为1s,Period=1000000
    	temp = (long) (Freq * Period);
    	Timer->RegsAddr->PRD.all = temp;          //PRD周期寄存器值为Freq*Period,即150*1000000
    
    	// 初始化分频器PDDR为0,每一个TIMCLK时间为1/150 us,则总时间T=150 * 1000000 * 1 / (150 *1000000) = 1s
    	Timer->RegsAddr->TPR.all  = 0;
    	Timer->RegsAddr->TPRH.all  = 0;
    
    	// 初始化计时器控制寄存器:
    	Timer->RegsAddr->TCR.bit.TSS = 1;      // 1 = 停止计数器, 0 = 开始/重置计数器
    	Timer->RegsAddr->TCR.bit.TRB = 1;      // 1 = 重新装载TIM和PSC
    	Timer->RegsAddr->TCR.bit.SOFT = 0;     // 1 = 定时器在TIM递减到0后停止,0 = 在下一个TIM递减操作完成后停止(硬停止)
    	Timer->RegsAddr->TCR.bit.FREE = 0;     // 1 = 仿真中遇到断点,定时器继续运行,SOFT不起作用,0 = SOFT起作用
    	Timer->RegsAddr->TCR.bit.TIE = 1;      // 0 = 定时器中断不使能  1 = 定时器中断使能
    	// 重置中断计数器
    	Timer->InterruptCount = 0;
    }
    
    展开全文
  • 2812 dsp定时器

    2012-03-08 22:11:16
    详细介绍了dsp2812的定时器:包括时钟的倍频,分频,定时器结构等
  • DSP2812芯片的定时器

    2013-04-21 11:11:41
    DSP2812原理及应用部分关于定时器的详细程序及内容讲解
  • 关于DSP2812的Timer0定时器配置程序的质疑 个人觉得网上许多关于DSP的CPU定时器Timer 0的配置处有问题——程序中Timer->RegsAddr->PRD.all = temp;的temp应改为(temp-1)。 首先回顾一下定时器工作原理:大体...

    关于DSP2812的Timer0定时器配置程序的质疑

    个人觉得网上许多关于DSP的CPU定时器Timer 0的配置处有问题——程序中Timer->RegsAddr->PRD.all = temp;的temp应改为(temp-1)。

    首先回顾一下定时器工作原理:大体的原理可以看下这个网页DSP2812之定时器

    CPU频率到定时器Timer0的中断频率中间需经过2次分频,第一次由预分频器PSCH:PSC,其重载值为(TDDRH:TDDR);第二次由TIMH:TIM计数器,其重载值为(PRDH:PRD)。
    先说正确的工作流程。①预分频器先载入TDDRH:TDDR的值,再对CPU脉冲计数,每通过一个脉冲,分频器减1,当计数到0后,产生一个信号通知TIMH:TIM计数器减1,而自身会在下一个脉冲来临时,将TDDRH:TDDR重新载入其中。②TIMH:TIM最开始载入PRDH:PRD,当收到预分频器发来的信号后,它也会减1,直至减为0。此时它会产生一个中断信号,并会在收到下一个预分频器发来的信号后,重载PRDH:PRD。具体的时序图如下(假设PRDH:PRD = TDDRH:TDDR = 2):
    Timer0时序图
    从时序图可以得知,每产生1个中断信号,共经过了(PRDH:PRD+1)×(TDDRH:TDDR +1)个SYSCLKOUT(即CPU脉冲)。
    T=(PRDH:PRD+1)×TDDRH:TDDR+1150×106(s)T=(PRDH:PRD+1)\times \frac{TDDRH:TDDR+1}{150}\times {{10}^{-6}}(\text{s})

    如果要定时1s,则可令TDDRH:TDDR=0,PRDH:PRD=150×106-1。但在程序中ConfigCpuTimer(&CpuTimer0, 150, 1000000);//temp=150 000000.
    导致T=1+1/150000000s。虽然微乎其微,但如果换成其他设置方式就会有明显的误差。
    我之前怀疑上述对T的计算公式是错的,PRDH:PRD不应该再加1。为此我做了如下验证,令TDDRH:TDDR=50000-1,PRDH:PRD=1,如果有加1,则T=1/1500s,否则T=1/3000s.之后在Timer0的中断中,让SCIRA和SCITA的引脚每隔3000个中断变换一次电平。结果在示波器可以明显看出高低电平分别持续2s,说明PRDH:PRD应该加1。
    所以在常见的TDDRH:TDDR=0,ConfigCpuTimer(&CpuTimer0, 150, Y);的配置方式中, ConfigCpuTimer函数里的temp应减1,且计算公式变为
    T=(PRDH:PRD)×TDDRH:TDDR+1150×106(s)T=(PRDH:PRD)\times \frac{TDDRH:TDDR+1}{150}\times {{10}^{-6}}(\text{s})

    部分代码如下 完整工程文件下载地址

    ConfigCpuTimer(&CpuTimer0, 1,1);
    void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period){

    Timer->RegsAddr->TPR.all = 0x4f;
    Timer->RegsAddr->TPRH.all = 0xc3;

    }

    interrupt void TINT0_ISR(void) // CPU-Timer0中断函数
    {
    CpuTimer0.InterruptCount++;
    if(CpuTimer0.InterruptCount<=3000)
    {
    GpioDataRegs.GPFCLEAR.bit.GPIOF5=1;//低电平
    GpioDataRegs.GPFCLEAR.bit.GPIOF4=1;
    }
    if(CpuTimer0.InterruptCount>3000)
    {
    GpioDataRegs.GPFSET.bit.GPIOF5=1;//高电平
    GpioDataRegs.GPFSET.bit.GPIOF4=1;
    }
    if(CpuTimer0.InterruptCount==6000) CpuTimer0.InterruptCount=0;
    CpuTimer0Regs.TCR.bit.TIF=1; //清除定时器中断标志位
    PieCtrl.PIEACK.bit.ACK1=1; //响应同组其他中断
    EINT; //开全局中断
    }

    void InitGpio(void)
    {
    EALLOW;
    GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5=0;//SCIAR设为GPIO口
    GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4=0;//SCIAT设为GPIO口
    GpioMuxRegs.GPFDIR.bit.GPIOF5=1;//SCIAR设为输出口
    GpioMuxRegs.GPFDIR.bit.GPIOF4=1;
    GpioDataRegs.GPFCLEAR.bit.GPIOF5=1;//低电平
    GpioDataRegs.GPFCLEAR.bit.GPIOF4=1;
    EDIS;
    }

    展开全文
  • 本文对DSP2812的定时器模块进行了封装,通过类的继承来分别特化Timer0,Timer1,Timer2. 同时举例使用Timer中断来执行定时任务。

    2812中有三个定时器,结构都是一样的。

    一般的操作就是设置周期,使能中断,启动计时器。


    我们先定义定时器的基类,然后对每个定时器再分别定义各自的子类。


    一般地,我们都将特定芯片的类申明在一个命名空间内。

    namespace NF281x{
    
    class CTimer{
    	CTimer( const CTimer& );
    public:
    	CTimer( volatile unsigned long& tim,volatile unsigned long& prd,volatile unsigned int& tcr,volatile unsigned int& tpr,volatile unsigned int& tprh );
    

    protected:
    	volatile unsigned long& m_tim;
    	volatile unsigned long& m_prd;
    
    	volatile unsigned int& m_tcr;
    	volatile unsigned int& m_tpr;
    	volatile unsigned int& m_tprh;
    };

    为定时器添加方法:

    	inline const volatile unsigned long& getCounter()const{
    		return m_tim;
    	}
    
    	inline void setCounter( const unsigned long& count ){
    		m_tim = count;
    	}
    
    	inline const volatile unsigned long& getPeriod()const{
    		return m_prd;
    	}
    
    	inline void setPeriod( const unsigned long& prd ){
    		m_prd = prd;
    	}
    
    	/**
    	 * 定时器计时到0是否发生
    	 * @return
    	 */
    	inline bool isTimerZeroFlag()const{
    		return NDm::isBitSet<volatile unsigned int,15,unsigned int>(m_tcr);
    	}
    
    	inline void clrTimerZeroFlag(){
    		NDm::bitSet<volatile unsigned int,15,unsigned int>(m_tcr);
    	}
    
    	/**
    	 * 定时器中断是否使能
    	 * @return
    	 */
    	inline bool isInterruptEn()const{
    		return NDm::isBitSet<volatile unsigned int,14,unsigned int>(m_tcr);
    	}
    
    	inline void enInterrupt(){
    		NDm::bitSet<volatile unsigned int,14,unsigned int>(m_tcr);
    	}
    
    	inline void disInterrupt(){
    		NDm::bitClr<volatile unsigned int,14,unsigned int>(m_tcr);
    	}
    
    	/**
    	 * 定时器重新开始运行
    	 */
    	inline void restart(){
    		NDm::bitClr<volatile unsigned int,4,unsigned int>(m_tcr);
    	}
    
    	/**
    	 * 听事情停止
    	 */
    	inline void stop(){
    		NDm::bitSet<volatile unsigned int,4,unsigned int>(m_tcr);
    	}
    
    	/**
    	 * 定时器是否已经运行
    	 * @return
    	 */
    	inline bool isStarting()const{
    		return 0==NDm::getBit<volatile unsigned int,4,unsigned int>(m_tcr);
    	}
    
    	/**
    	 * 重新加载
    	 */
    	inline void reload(){
    		NDm::bitSet<volatile unsigned int,5,unsigned int>(m_tcr);
    	}
    
    	/**
    	 * 获取时钟周期
    	 * 没SysCycle个系统时钟周期,定时器计数减1
    	 * @return
    	 */
    	inline unsigned int getSysCycle()const{
    		return (m_tprh<<8)|(m_tpr&0x00FF);
    	}
    
    	/**
    	 * 设置时钟周期
    	 * @param cycle
    	 */
    	inline void setSysCycle( const unsigned int& cycle ){
    		m_tpr = (cycle&0x00FF);
    		m_tprh = (cycle>>8);
    	}

    下面添加一个对timer0子类的实现:

    namespace NF281x{
    
    /**
     * CPU定时器0
     * 使用中断INT1.7
     */
    class CTimer0:public CTimer{
    public:
    	CTimer0();
    };
    
    }

    下面举个例子来看看,定时器在代码中如何使用的。其中也使用了PIE模块的使用。

    这个例子是使用定时器,产生定时中断,来测试LED。

    首先定义中断函数:

    extern "C" interrupt void myTimer(){
    	CLed::ins().testOnce();
    
    	CPieCtl::ins().ack_tInt0();
    }

    其中CLed对LED的操作进行了封装。一般是使用GPIO控制的。

    CPIeCtl::ins()是CPie类的一个对象。

    在中断处理函数中一定要对Timer0中断进行ack。


    下面对定时器进行初始化操作

    void timerTaskInit(){
    	CTimer0 timer0;
    	timer0.stop();
    
    	CPieCtl& pie = CPieCtl::ins();
    	pie.setIrs_tInt0( myTimer );
    
    	timer0.setSysCycle(48000);
    	timer0.setPeriod(100);
    	timer0.enInterrupt();
    	timer0.reload();
    	timer0.clrTimerZeroFlag();
    	timer0.restart();
    }




    展开全文
  • DSP2812 例程

    2011-05-08 18:52:09
    这是DSP2812的例程,包括定时器,事件管理器,flash,外部中断,AD采样
  • DSP2812的程序

    2012-12-11 15:36:55
    包含了大量的TMS320F2812的例程,如GPIO、CPU定时器、中断系统、EV、ADC、SCI、SPI、ECAN等。
  • DSP2812实验例程

    2013-09-26 17:27:26
    dsp2812的实验例程。包括定时器实验,蜂鸣器实验,ecan模块的通信,sci,spi串口通信,事件管理器应用。C/C++编写。
  • dsp2812的全套开发例程

    2010-05-11 15:12:51
    dsp开发例程,有AD,定时器,串口等程序,希望给初学者练练手
  • DSP2812的事件管理器EV

    千次阅读 2012-09-25 15:29:31
    事件管理器具有2个16为通用定时器,3个比较单元,3个捕获单元,以及一个正交编码脉冲电路。 EV通用定时器都是16位,每个定时器能定时外,还可以单独产生一个独立PWM波形。 比较单元又称为全比较/PWM单元,...

    事件管理器具有2个16为的通用定时器,3个比较单元,3个捕获单元,以及一个正交编码脉冲电路。

    EV的通用定时器都是16位的,每个定时器能定时外,还可以单独产生一个独立的PWM波形。

    比较单元又称为全比较/PWM单元,每个比较单元可以产生一对(两路)互补的PWM波。3个比较单元生成的6路PWM波正好可以驱动一个三相全桥电路。

    捕获单元的功能是捕获外部输入脉冲的上升沿或下降沿,可以统计脉冲的间隔,也可以记录脉冲的个数。

    正交编码电路可以对输入的正交编码进行编码和计数,它与光电编码器相连可以获得旋转机械部件的位置和速率等信息,也多用于电机控制。

    正交脉冲是指,增量式编码器的a相,b相分别能输出矩形波脉冲信号,这两个信号之间的相位相差90度,故名正交脉冲。可以利用正交脉冲检测位置和分析。
    编码器是把角位移或直线位移转换成电信号的一种装置。
    
    增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。

    展开全文
  • DSP2812 TIMER0验证程序

    2019-04-28 11:12:29
    此博客资源https://blog.csdn.net/speedbluey/article/details/89633954 用于判断定时器的程序公式中PRDH:PRD是否加1 采用ccsv8编译
  • DSP学习总结——通用定时器

    千次阅读 2014-10-05 10:05:37
    DSP2812DE通用定时器的学习
  • 文章目录选用要求开发环节 选用要求 处理速度 功耗 存储空间(程序、数据) 片内资源(定时器、I/O口、DMA通道、中断) C2000系列 TMS 320F 2812 PGF A 合格产品 系列 C2000 ...硬件:仿真器、含有DSP的板子 ...
  • EALLOW; //访问带有protected地址时需要在前面加这一句 EvaRegs.GPTCONA.all = 0x0; /* 通用定时器全局控制寄存器 */ EvaRegs.T1PR =3750; //定时器1周期寄存器 开关频率20K...
  • EvbRegs.T3PR = 3750;...,((1/20KHz)/13.33333ns=3750 想要得到是20khz开关频率,按公式就是算出T3PR值 T3Period=EvbRegs.T3PR; //将定时器1周期值赋给 T1Period EvbRegs.T3CNT = 0x0000; ...
  • 因为项目中某一个芯片时钟和使能...1. 定时器计数是从0开始计数。所以要计10个数,则周期寄存器应设为0x09,而不是0x0A 2. 定时器2控制寄存器T2SWT1位置一。同时注意,在启动定时器之前,不能将两定时器控...
  • 2812SCI串口调试程序

    热门讨论 2010-04-29 16:16:08
    TMS320F2812的串口驱动程序,很实用,提供中断和查询两种方式!... [cputimer.rar] - DSP2812的定时器例程,现在2812的书好像非常少,希望对大家有帮助,^_^ [DSP281x_headers.rar] - Ti TMS320F2812C2000头文件
  • 介绍了快速傅里叶变换(FFT)算法的原理,利用DSP实现了FFT算法,利用TMS320F2812 DSP内部的ADC模块与事件管理器的定时器实现信号的实时采集。分析了DSP中数据采集ADC的功能。基于CCS调试软件显示了输入输出信号波形...
  • TMS320F2812是高精度的DSP,其运算速度快,工作时钟频率达150 MHz,指令周期可达6.67 ns以内,低功耗(核心电压1.8 V,I/O口电压3.3 V)。采用哈佛总线结构,具有强大操作能力、迅速中断响应和处理能力以及统一...
  • 2812 时间寄存器

    2018-03-05 19:45:32
    dsp2812定时器头文件描述文件,主要测试c语言编写,结构体形式
  • HELLO七:2812的IO口控制--LED点亮程序 51 HELLO八(一) 2812EV模块---通用定时器 52 2812---通用定时器1初始化程序(启动ADC)  59 HELLO八(二) 2812EV模块---PWM 62 DSP---PWM波形源码 68 HELLO九:2812--SCI模块 74...
  • TMS320F2812是TI公司一款用于控制高性能、多功能、高性价比32位定点DSP芯片。该芯片兼容TMS320LF2407指令系统最高可在150MHz主频下工作,并带有18k×16位0等待周期片上SRAM和...
  • 定时器基本操作

    2020-11-12 23:29:20
    图中的定时器选择SYSCLKOUT作为定时器时钟,工作频率也是150 MHz。一旦定时器被使能(TCR-Bit 4=0),定时器时钟经过预定标计数器(PSCH:PSC)递减计数,预定标计数器产生下溢后向定时器的32位计数器(TIMH:TIM...
  • 由于2812主要应用于工业控制场合,例如电机控制、变频器,逆变器等等,所以2812的事件管理器模块(EV)可谓是重点部分了,由于EV的内容非常丰富,我们在讲义中不能面面俱到,所以希望大家在学习的时候能将手头的书本...
  •  在F281O和F2812处理器中,定时器1和定时器2预留给实时操作系统使用,其中断分配给INT14和INT13。两个不可屏蔽中断RESET和NMI各自占用独立专用中断,同时NMI中断也可以选择同定时器1复用INT13。其余12个可屏蔽...

空空如也

空空如也

1 2 3
收藏数 46
精华内容 18
关键字:

dsp2812的定时器