中科昊芯 DSP
直播中

阳阳阳阳阳阳阳阳

3年用户 42经验值
私信 关注

Haawking DSC28027实例程序开发教程——CpuTimer

本帖最后由 阳阳阳阳阳阳阳阳 于 2021-8-24 14:00 编辑

/******************************************************************
  译 器:Haawking IDE V0.5.0
D  S  P:dsc28027勇士板
置:Windows10 专业版; 64 位操作系统
仿  真 器:HX100V2
使  用 库:无
      用:GPIO输入输出例程
     明:D401来自定时器0中断服务函数
              D400亮由Cputimer1控制,灭由CpuTimer2控制
      本:V0.0.1
******************************************************************/

1. HaawkingIDE新建工程
1.png
CpuTimer.png
3.png
2. 初始化LED:
/******************************************************************
            函数名:void InitLED()
                    数:无
            返回值:无
                    用:初始化LED
                    明:
            ******************************************************************/
  1. void InitLED()
  2.             {
  3.                     EALLOW;
  4.                     GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0;   //D400MUX = 0;
  5.                     GpioCtrlRegs.GPADIR.bit.GPIO7  = 1;   //D400DIR = 1;
  6.                     GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;   //D401MUX = 0;
  7.                     GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;    //D401DIR = 1;
  8.                     EDIS;
  9.             }
初始化定时器0
/******************************************************************
函数名:Timer0_init()
        数:无
返回值:无
        用:定时器0初始化-1ms 周期
        明:
******************************************************************/
  1. void Timer0_init()
  2. {
  3.         InitCpuTimers();

  4. //中断配置步骤-----1,开启模块中断使能,位于 Timer->RegsAddr->TCR.bit.TIE = 1;
  5.         ConfigCpuTimer(&CpuTimer0, 120, 60000); //12MHz,1000us ,即为 1ms中断周期
  6.         CpuTimer0Regs.TPR.bit.TDDR = 10000;
  7.         CpuTimer0Regs.TCR.bit.TIE = 1;         //使能中断
  8.         CpuTimer0Regs.TCR.bit.TSS = 0;         // To start or restart the CPU-timer, set TSS to 0

  9.         //中断配置步骤-----2,重映射中断服务函数
  10.         // Interrupts that are used in this example are re-mapped to
  11.         // ISR functions found within this file.
  12.         EALLOW;
  13.         PieVectTable.TINT0 = &cpu_timer0_isr;
  14.         EDIS;
  15.         //中断配置步骤-----3,连接CPU中断Y
  16.         IER_ENABLE(M_INT1);
  17.         //中断配置步骤-----4,连接Y中断里的第几位
  18.         PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
  19. }
定时器1/2初始化:
  1. void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
  2. {
  3.         Uint32         temp;

  4.         // Initialize timer period:
  5.         Timer->CPUFreqInMHz = Freq;
  6.         Timer->PeriodInUSec = Period;
  7.         temp = (long) (Freq * Period);
  8.         Timer->RegsAddr->PRD.all = temp;

  9.         // Set pre-scale counter to divide by 1 (SYSCLKOUT):
  10.         Timer->RegsAddr->TPR.all  = 0;


  11.         // Initialize timer control register:
  12.         Timer->RegsAddr->TCR.bit.TSS = 1;      // 1 = Stop timer, 0 = Start/Restart Timer
  13.         Timer->RegsAddr->TCR.bit.TRB = 1;      // 1 = reload timer
  14.         Timer->RegsAddr->TCR.bit.SOFT = 0;
  15.         Timer->RegsAddr->TCR.bit.FREE = 0;     // Timer Free Run Disabled
  16.         Timer->RegsAddr->TCR.bit.TIE = 1;      // 0 = Disable/ 1 = Enable Timer Interrupt

  17.         // Reset interrupt counter:
  18.         Timer->InterruptCount = 0;
  19. }
定时器1/2配置如下:
  1. ConfigCpuTimer(&CpuTimer1, 12, 500000);//定时器1配置,第二个参数为CPU SYSCLK = 12M, 第三个参数为设定的周期,us单位
  2.         CpuTimer1Regs.TCR.bit.TSS = 0;         // To start or restart the CPU-timer, set TSS to 0

  3.         ConfigCpuTimer(&CpuTimer2, 12, 250000);//定时器2配置,第二个参数为CPU SYSCLK = 12M, 第三个参数为设定的周期,us单位
  4.         CpuTimer2Regs.TCR.bit.TSS = 0;         // To start or restart the CPU-timer, set TSS to 0
CpuTimer0 作为1ms周期,使D401闪烁;CpuTimer1 作为500ms周期,采用查询方式,控制D400亮;CpuTimer2 作为250ms周期,采用查询方式,控制D400灭:
  1. while(1)
  2.     {

  3.             if(timer0Base.msCounter>1000)                 //0.1s
  4.                             {
  5.                                     timer0Base.msCounter=0;
  6.                                     GpioDataRegs.GPATOGGLE.bit.GPIO6 = 1;  //D401闪烁,指示定时器0中断周期
  7.                             }

  8.                             if(CpuTimer1Regs.TCR.bit.TIF == 1)         //定时器1查询周期
  9.                             {
  10.                                     CpuTimer1Regs.TCR.bit.TIF = 1;      //标志位写1清0 clear flag
  11.                                     CpuTimer2Regs.TCR.bit.TSS = 0;         //启动定时器2
  12.                                     GpioDataRegs.GPACLEAR.bit.GPIO7 =1;    //D400亮
  13.                             }

  14.                             if(CpuTimer2Regs.TCR.bit.TIF == 1)         //定时器2查询周期
  15.                             {
  16.                                     CpuTimer2Regs.TCR.bit.TIF = 1;       //标志位写1清0 clear flag
  17.                                     CpuTimer2Regs.TCR.bit.TSS = 1;      //关闭定时器2
  18.                                     GpioDataRegs.GPASET.bit.GPIO7 =1;   //D400灭
  19.                             }
  20.                 }
点击编译、编译完成后点击下载:
4.png
实验现象
程序全速运行后,LED灯D400和D401保持闪烁。
图片15.png
5.png

回帖(1)

槐鬼鬼

2021-5-31 20:44:40
本帖最后由 槐鬼鬼 于 2021-6-3 08:30 编辑

我觉得我需要先能看懂才可以去复盘。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分