打印
[DSP编程]

关于2812的一个编程问题,希望大家帮忙看一下,谢谢!

[复制链接]
3019|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
raoxianbin|  楼主 | 2013-10-11 16:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 raoxianbin 于 2013-10-11 16:07 编辑

在CCS编程环境中,关于用CPU定时器0的周期中断实现LED灯的闪烁,在这个例子中我存在几个疑问,希望大家解答一下
void InitCpuTimers(void)
{
        CpuTimer0.RegsAddr = &CpuTimer0Regs; //使得CpuTimer0.RegsAddr 指向定时器寄存器
        
        CpuTimer0Regs.PRD.all  = 0xFFFFFFFF; //初始化CpuTimer0的周期寄存器

        CpuTimer0Regs.TPR.all  = 0;          //初始化定时器预定标计数器
        CpuTimer0Regs.TPRH.all = 0;
        
        CpuTimer0Regs.TCR.bit.TSS = 1;       //停止定时器      

        CpuTimer0Regs.TCR.bit.TRB = 1;       //将周期寄存器PRD中的值装入计数器寄存器TIM中           
        
        CpuTimer0.InterruptCount = 0;        //初始化定时器中断计数器
}        
        
/****************************************************************************
*
*名    称:ConfigCpuTimer()
*
*功    能:此函数将使用Freq和Period两个参数来对CPU定时器进行配置。Freq以MHz
*          为单位,Period以us作为单位。
*
*入口参数:*Timer(指定的定时器),Freq,Period
*
*出口参数:无
*
****************************************************************************/

void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{
        Uint32         temp;
        
        Timer->CPUFreqInMHz = Freq;
        Timer->PeriodInUSec = Period;
        temp = (long) (Freq * Period);
        Timer->RegsAddr->PRD.all = temp;  //给定时器周期寄存器赋值

        Timer->RegsAddr->TPR.all  = 0;    //给定时器预定标寄存器赋值
        Timer->RegsAddr->TPRH.all  = 0;
        
        // 初始化定时器控制寄存器:
        Timer->RegsAddr->TCR.bit.TIF=1;   //清除中断标志位
        Timer->RegsAddr->TCR.bit.TSS = 1; //停止定时器
        Timer->RegsAddr->TCR.bit.TRB = 1; //定时器重装,将定时器周期寄存器的值装入定时器计数器寄存器
        Timer->RegsAddr->TCR.bit.SOFT = 1;
        Timer->RegsAddr->TCR.bit.FREE = 1;     
        Timer->RegsAddr->TCR.bit.TIE = 1; //使能定时器中断
        
        Timer->InterruptCount = 0;        //初始化定时器中断计数器
}

这是对CPU定时器0的一个初始化函数

void main(void)
{
    InitSysCtrl();  //初始化系统函数

        DINT;
        IER = 0x0000;   //禁止CPU中断
        IFR = 0x0000;   //清除CPU中断标志
        
        InitPieCtrl();  //初始化PIE控制寄存器

        InitPieVectTable(); //初始化PIE中断向量表         
        
        InitPeripherals(); //初始化Cpu定时器模块
        
        InitGpio(); //初始化GPIO

        PieCtrl.PIEIER1.bit.INTx7 =1; //使能PIE模块中的Cpu定时器0的中断
   
    IER|=M_INT1;  //开CPU中断
   
    EINT;  //使能全局中断
    ERTM;  //使能实时中断
   
    ConfigCpuTimer(&CpuTimer0, 150, 1000000);        //Cpu定时器0的周期为1s
        StartCpuTimer0(); //启动Cpu定时器0
        
        for(;;)
        {
           
        }

}
这是主函数,我的疑问是
1.在初始化函数中没用对CPU定时器使能,即缺少CpuTimer0Regs.TCR.bit.TIE =1这条语句,这样还会向PIE控制器提出中断请求吗?
2.主函数也没调用CPU的初始化函数,难道不影响吗?

这是一个例子,但是能正常实现,但是我还是存在以上的疑问,希望各位解答一下,谢谢!

相关帖子

沙发
nikiski| | 2013-10-11 16:18 | 只看该作者
缺少CpuTimer0Regs.TCR.bit.TIE =1这条语句不会引发中断,这个你可以在自己的板子上试一下。你的主函数中调用了ConfigCpuTimer(&CpuTimer0, 150, 1000000)这个子函数,子函数中有CpuTimer0Regs.TCR.bit.TIE =1这条语句,所以能够引发中断。

使用特权

评论回复
板凳
raoxianbin|  楼主 | 2013-10-11 16:32 | 只看该作者
本帖最后由 raoxianbin 于 2013-10-11 16:46 编辑

恩   刚也发现了  谢谢了..   但是是不是最好还是在主函数中对CPU定时器调用一下初始化函数啊,还是因为这个取地址符,这个函数就等于调用了一下初始化函数啊,C语言学的不好。。。。

使用特权

评论回复
地板
nikiski| | 2013-10-11 17:08 | 只看该作者
这个取地址符取的是结构体变量CpuTimer0的内存地址,因为ConfigCpuTimer函数定义中指定第一个参数是指针,通过指向结构体的指针来改变定时器的各种参数。初始化函数void InitCpuTimers(void)和这个&没有关系。调不调用出事化函数和你最终实现的功能有关,但是要引发中断CpuTimer0Regs.TCR.bit.TIE =1语句不能少。ConfigCpuTimer函数中的Timer->RegsAddr->TCR.bit.TIE = 1和CpuTimer0Regs.TCR.bit.TIE =1的效果是一样的。

使用特权

评论回复
5
raoxianbin|  楼主 | 2013-10-11 17:15 | 只看该作者
nikiski 发表于 2013-10-11 17:08
这个取地址符取的是结构体变量CpuTimer0的内存地址,因为ConfigCpuTimer函数定义中指定第一个参数是指针, ...

学习了  谢了!

使用特权

评论回复
6
zhangmangui| | 2013-10-11 18:51 | 只看该作者
nikiski 发表于 2013-10-11 17:08
这个取地址符取的是结构体变量CpuTimer0的内存地址,因为ConfigCpuTimer函数定义中指定第一个参数是指针, ...

讲解的很清楚  谢谢啦  

使用特权

评论回复
7
raoxianbin|  楼主 | 2013-10-11 18:55 | 只看该作者
恩 都清楚了   这个程序对CPU定时器是有初始化的。。

使用特权

评论回复
8
zhangmangui| | 2013-10-11 22:47 | 只看该作者
raoxianbin 发表于 2013-10-11 18:55
恩 都清楚了   这个程序对CPU定时器是有初始化的。。

再加些讲解  就当做给大家分享了吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

244

帖子

1

粉丝