TMS320F28335——IO控制/定時計操作


一、實現GPIO控制

1.硬件連接

   

從電路原理圖上看來,LED燈是接在GPIO34 上的。

2.IO設置

  2.1設置功能

  GPXMUX1/2:功能選擇寄存器  

  GPXMUX1/2    每組 IO 一般有 32 個 IO 口可以配置。GPXMUX1 對應每組的低 16 個 IO 口,GPXMUX2 對應高 16 個 IO 口 。

  這里設置的是GPIO34   所以在 GPBMUX1中 

  所以向  GPBMUX1 的bit5:4  寫入0設置為普通IO。(默認設置 )

  2.2:設置IO方向

  方向控制寄存器 GPXDIR:如果對應的位為 1 則配置為輸出,否則則配置為輸入。

 

  代碼如下:

  

   EALLOW;
   GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
   GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
   EDIS;

  關於  EALLOW、EDIS說明:

  DSP由於在上電復位之后,狀態寄存器基本上都是清零,而這樣的狀態下正是上述特殊寄存器禁止改寫的狀態。為了能夠對這些特殊寄存器進行初始化,所以在對上述特殊寄存器進行改寫之前,一定要執行匯編指令asm(“EALLOW”)或者宏定義EALLOW來設置狀態寄存器1的C6位,在設置完寄存器之后,一定要注意執行匯編指令asm(“EDIS”)或者宏定義EDIS來清除狀態寄存器1的C6位,來防止雜散代碼或指針破壞寄存器內容。
  到此關於GPIO的配置就完成了。

3.控制IO輸出電平

  置位寄存器:置位寄存器 GPXSET:如果對應的位為 1 則將對應的 IO 口拉高(輸出高電平)。     GpioDataRegs.GPBSET.bit.GPIO34 = 1;//設置PGIO34 輸出高電平

  清零寄存器:強制拉低管腳 GPXCLEAR:如果對應的位為 1 則將對應的 IO 口拉低(輸出低電平)。 GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;//設置GPIO34輸出高平

  輸出翻轉寄存器:輸出狀態翻轉寄存器 GPXTOGGLE:如果 GPXTOGGLE 的某位為 1 則將相應的 IO 口輸出狀態進行翻轉。                                                                GpioDataRegs.GPBTOGGLE.bit.GPIO34= 1;//設置PGIO34輸出翻轉電平

 二、使用定時器實現閃爍LED

   1.定時器設置

    關於定時器的設置  主要是設置CPUTIMER_VARS  結構體中的參數:

    

struct CPUTIMER_VARS {
   volatile struct  CPUTIMER_REGS  *RegsAddr;//定時器 相關寄存器
   Uint32    InterruptCount;    //用作定時器中斷次數統計
   float   CPUFreqInMHz;       //存放頻率 單位MHZ
   float   PeriodInUSec;      //中斷的計數值 ,到了產生中斷。
};
struct CPUTIMER_REGS {
   union TIM_GROUP TIM;   // Timer counter register  定時器計數寄存器
   union PRD_GROUP PRD;   // Period register         定時器周期寄存器  
   union TCR_REG   TCR;   // Timer control register  定時器控制寄存器
   Uint16          rsvd1; // reserved                保留
   union TPR_REG   TPR;   // Timer pre-scale low         
   union TPRH_REG  TPRH;  // Timer pre-scale high
};

關於定時器配置源碼如下:

  

void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{
    Uint32  temp;

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

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

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

    // Reset interrupt counter:
    Timer->InterruptCount = 0;
}

    用戶設置:

   

  ConfigCpuTimer(&CpuTimer0, 150, 1000000);//使用定時器0  ,時鍾頻率為150MHZ,計數值 到1M  。也就是說這樣設置是產生一個一秒的中斷

    定時器中斷處理函數設置:PIE_VECT_TABLE 中斷向量表。在DSP2833x_PieVect.h中定義

    

PieVectTable.TINT0 = &cpu_timer0_isr;//往中斷矢量表中填寫一個指針。當定時時間到了就跳轉到 ,當前指針指向的函數去執行代碼。

  定時器0中斷在中斷向量表中的組1

 2.在定時器中使用GPIO翻轉寄存器GPXTOGGLE  實現LED閃爍

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM