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; //存放頻率 單位MHZfloat 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 TimerTimer->RegsAddr->TCR.bit.TRB = 1; // 1 = reload timerTimer->RegsAddr->TCR.bit.SOFT = 1;Timer->RegsAddr->TCR.bit.FREE = 1; // Timer Free RunTimer->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閃爍
?
轉載于:https://www.cnblogs.com/hjxzjp/p/11126120.html
總結
以上是生活随笔為你收集整理的TMS320F28335——IO控制/定时计操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 链表!比数组更适合做增删操作的数据结构
- 下一篇: Day47 Django基础部分、路由配