CCS5.4+Proteus8的F28027實踐課一、延時函式控制LED流水燈
阿新 • • 發佈:2019-02-12
又是十二點了,但是很興奮,因為從這節課開始,我們將會進行F28027一系列的動手實踐練習,深入瞭解一門技術的唯一辦法就是多動手實踐,多總結反思。
來來來,不扯了,直接開始了。
在正式開始寫程式前,我們還有一個問題要解決,那就是CCS5.4預設輸出的是.out檔案,而我們DSP Proteus模擬需要的是cof檔案,所以我們還需要繼續設定下CCS工程的屬性。
我們在第一節課的時候,已經教大家如何建立一個空的工程,我們直接在那個工程的基礎上進行修改。
1、生成hex檔案
右鍵工程名,選擇Properties,進去之後,在Build裡面,有個Steps-Apply Predefined Step,在下拉框裡面選擇hex檔案
2、生成cof檔案
右鍵工程名,選擇Properties,進去之後,在Build-C2000 Linker-Basic Options裡面,out file nameg改成”${ProjName}.cof”
好了,實踐之前的準備工作已經都完成了,現在正式開始實踐課程。
實踐課程主要分為兩部分:模擬環境搭建和軟體程式碼編寫。
對於模擬環境搭建,我們只說一遍,因為這個東西只要環境搭建好了,後續的實踐課稍微調整下電路就行了,沒太大的必要每節課都說。
硬體環境搭建
1、新建工程
新建工程,如圖所示,不停的下一步下一步,建一個空的工程。
2、新建Schematic Capture檔案
直接點選工具欄的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