1. 程式人生 > >CCS5.4+Proteus8的F28027實踐課一、延時函式控制LED流水燈

CCS5.4+Proteus8的F28027實踐課一、延時函式控制LED流水燈

又是十二點了,但是很興奮,因為從這節課開始,我們將會進行F28027一系列的動手實踐練習,深入瞭解一門技術的唯一辦法就是多動手實踐,多總結反思。
來來來,不扯了,直接開始了。
在正式開始寫程式前,我們還有一個問題要解決,那就是CCS5.4預設輸出的是.out檔案,而我們DSP Proteus模擬需要的是cof檔案,所以我們還需要繼續設定下CCS工程的屬性。
我們在第一節課的時候,已經教大家如何建立一個空的工程,我們直接在那個工程的基礎上進行修改。
1、生成hex檔案
右鍵工程名,選擇Properties,進去之後,在Build裡面,有個Steps-Apply Predefined Step,在下拉框裡面選擇hex檔案
HEX


2、生成cof檔案
右鍵工程名,選擇Properties,進去之後,在Build-C2000 Linker-Basic Options裡面,out file nameg改成”${ProjName}.cof”
COF
好了,實踐之前的準備工作已經都完成了,現在正式開始實踐課程。
實踐課程主要分為兩部分:模擬環境搭建和軟體程式碼編寫。
對於模擬環境搭建,我們只說一遍,因為這個東西只要環境搭建好了,後續的實踐課稍微調整下電路就行了,沒太大的必要每節課都說。
硬體環境搭建
1、新建工程
工程建立
新建工程,如圖所示,不停的下一步下一步,建一個空的工程。
2、新建Schematic Capture檔案
直接點選工具欄的ISIS藍色底紋的圖示即可
ISIS

3、在模擬庫中挑選所需要的器件
選擇器件
選擇器件的順序如圖裡面的圈圈序號所示,在本次實踐課中,我們需要F28027晶片、LED。
4、畫模擬圖
畫圖
畫好的模擬圖如上所示。
5、指定模擬所需要的cof可執行檔案
指定檔案
如圖圈圈所示,圈圈裡面有個資料夾圖示,點進去選擇到我們最開始設定的那個空工程的cof檔案。
硬體模擬環境已經設定完成,由於cof檔案我們也選好了,後續完成軟體編寫編譯後,直接點選左下角的開始鍵進行系統模擬功能模擬。
硬體環境已經OK,現在重點說軟體程式設計部分了。
要開始動手寫之前,我們要先理清楚F28027程式的開發流程:
程式設計流程
前面部分,包括F2802x_CodeStartBranch.asm檔案,已經都有了,而且我們在前面的課程中,也基本都把這些東西給講到了,至於CMD檔案,TI已經提供了非常標準的連結檔案,也是不用我們再另外去寫,直接使用就行了,我們只要理解裡面的程式碼含義,然後借用,做最高效的開發。我們唯一要做的就是用到什麼檔案或者功能,就修改對應的檔案,其他的全部保持不變就行了。
既然我們這節課是LED流水燈,那肯定要用GPIO埠去輸出高低電平去控制,所以需要GPIO控制檔案F2802x_Gpio.c,把C:\ti\controlSUITE\device_support\f2802x\v200\f2802x_common\source路徑下的F2802x_Gpio.c檔案拷貝到
D:\study\day001\project\src路徑下。
從上面的硬體環境中可以看到,我們要把GPIO0-GPIO7設定為GPIO輸出埠,當輸出低電平時,LED亮,輸出高電平時,LED滅。
目的很明確了,那我們就去GPIO.c檔案裡面進行相應的設定操作:
1、選擇GPIO0-GPIO7為普通GPIO引腳;
2、設定引腳為輸出引腳;
3、輸入鑑定濾波與SYSCLKOUT同步;
4、使能上拉電阻;
程式碼如下:

void InitGpio(void)
{
   EALLOW;

   // Each GPIO pin can be:
   // a) a GPIO input/output
   // b) peripheral function 1
   // c) peripheral function 2
   // d) peripheral function 3
   // By default, all are GPIO Inputs
   GpioCtrlRegs.GPAMUX1.all = 0x0000;     // GPIO functionality GPIO0-GPIO15
   GpioCtrlRegs.GPAMUX2.all = 0x0000;     // GPIO functionality GPIO16-GPIO31
   GpioCtrlRegs.GPBMUX1.all = 0x0000;     // GPIO functionality GPIO32-GPIO34
   GpioCtrlRegs.AIOMUX1.all = 0x0000;     // Dig.IO funct. applies to AIO2,4,6,10,12,14

   GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF;      // GPIO0-GPIO31 are GP outputs
   GpioCtrlRegs.GPBDIR.all = 0x0000;      // GPIO32-GPIO34 are inputs
   GpioCtrlRegs.AIODIR.all = 0x0000;      // AIO2,4,6,19,12,14 are digital inputs

   // Each input can have different qualification
   // a) input synchronized to SYSCLKOUT
   // b) input qualified by a sampling window
   // c) input sent asynchronously (valid for peripheral inputs only)
   GpioCtrlRegs.GPAQSEL1.all = 0x0000;    // GPIO0-GPIO15 Synch to SYSCLKOUT
   GpioCtrlRegs.GPAQSEL2.all = 0x0000;    // GPIO16-GPIO31 Synch to SYSCLKOUT
   GpioCtrlRegs.GPBQSEL1.all = 0x0000;    // GPIO32-GPIO34 Synch to SYSCLKOUT

   // Pull-ups can be enabled or disabled.
   GpioCtrlRegs.GPAPUD.all = 0x0000;      // Pullup's enabled GPIO0-GPIO31
   GpioCtrlRegs.GPBPUD.all = 0x0000;      // Pullup's enabled GPIO32-GPIO34
   //GpioCtrlRegs.GPAPUD.all = 0xFFFF;    // Pullup's disabled GPIO0-GPIO31
   //GpioCtrlRegs.GPBPUD.all = 0xFFFF;    // Pullup's disabled GPIO32-GPIO34

   EDIS;

}

GPIO.c檔案設定完之後,去main.c主函式裡面,給GPIO0-GPIO7一個初始值,然後用翻轉暫存器進行GPADAT值的變換,程式碼如下:

void main(void)
{

// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2802x_SysCtrl.c file.
   InitSysCtrl();

// Step 2. Initalize GPIO:
// This example function is found in the DSP2802x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
   InitGpio();

// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2802x_PieCtrl.c file.
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP2802x_DefaultIsr.c.
// This function is found in DSP2802x_PieVect.c.
   InitPieVectTable();


// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2802x_InitPeripherals.c
// InitPeripherals(); // Not required for this example

// Step 5. User specific code:

   GpioDataRegs.GPADAT.all = 0x00000000;  //GPIO0-GPIO31 initial value are 0
   while(1)
   {
       GpioDataRegs.GPATOGGLE.all=0x000000ff;
       DELAY_US(1000);
   }
}

寫完之後進行編譯,生成cof檔案,在模擬環境裡面點選執行
效果圖
可以看到流水燈以1ms的頻率進行閃爍,達到本次課程的預期效果,真高興,看來前面幾節課的基礎確實很重要,只要把思路理清楚了,程式還是比較簡單的,現在一點半了,明天希望可以搞到12864那裡,呵呵,現在洗洗睡了,最近幾天白天狀態都不怎麼好,示例程式我會傳到CSDN下載庫和qq群裡面。
菜鳥交流qq群107691092