TMS320F28027之GPIO

輸入限制:

       輸入限制電路設計的十分靈活,你可以通過配置GPxQSELn寄存器來選擇輸入限制的類型。在GPIO的輸入模式中,可以配置爲與SYSCLKOUT同步或者採樣窗口限制。對於外設的輸入,還可以配置成異步模式。

       不同步(異步輸入):此模式用於不要求同步或者本身就要異步的外設中,比如SCI,SPI和I2C。或者獨立於SYSCLKOUT的ePWM觸發。通用數字接口不能用此模式。

        採樣窗口限制:在此模式中,輸入信號首先與SYSCLKOUT同步,然後用一定的週期來確定採樣信號。用3個或者6個,如果連續3個或者6個採樣週期都採樣到一樣的電平,這認爲是有效信號。採樣週期通過GPACTRL寄存器設置。

 


採樣週期:


能採樣到的最短信號電平寬度:

 


 

 

配置步驟(參考文檔SPRUFN3C):

1.     總體規劃IO口。

2.     使能或者除能上拉電阻(GPxPUD)。

ePWM模式默認除能,其他功能默認使能。模擬IO沒有上拉電阻。

3.     輸入採樣設置(GPxCTRL、 GPxQSELn)。

4.     選擇引腳功能(GPxMUXn or AIOMUXn)。

5.     如果是數字IO的話,選擇方向(GPxDIR or AIODIR)。

6.     選擇低功耗模式下的喚醒輸入引腳(GPIOLPMSEL)。

7.     選擇中斷源(GPIOxINTnSEL),極性(xINTnCR)。

 

 

程序設計:

       實現板上的LED的驅動程序, LED相關IO的初始化都用同一個函數,分別提供了兩種種方法改變LED的狀態,一,通過一個函數實現。二、通過宏定義實現。第一種效率不高,佔用程序存儲空間較多,需要裝載參數和調用指令,子函數裏還有switch造成的跳轉表等,但是可以用過同一個函數設置LED的狀態,第二種效率高,通過三個調用設置三種狀態,只是一個複製語句,相當於三條彙編指令。建議使用第二種,通過條件編譯,保留第一種,但不編譯。最後,寫成兩個LED.c和LED.h文件,供日後使用。

 

 

程序:

/*********************************************
    標題:LED_test.c
    軟件平臺:CCS v5.2
    硬件平臺:C2000 LaunchPad
    主頻:60M

      描述:練習gpio,測試led

      基於2802x C/C++ Header Files V1.26


    author:小船
    data:2012-09-23

    As supplied, this project is configured for "boot to SARAM"
    operation.  The 2802x Boot Mode table is shown below.

    $Boot_Table
    While an emulator is connected to your device, the TRSTn pin = 1,
    which sets the device into EMU_BOOT boot mode. In this mode, the
    peripheral boot modes are as follows:

      Boot Mode:   EMU_KEY        EMU_BMODE
                   (0xD00)	     (0xD01)
      ---------------------------------------
      Wait		 !=0x55AA           X
      I/O		   0x55AA	         0x0000
      SCI		   0x55AA	         0x0001
      Wait 	       0x55AA	         0x0002
      Get_Mode	   0x55AA	         0x0003
      SPI		   0x55AA	         0x0004
      I2C		   0x55AA	         0x0005
      OTP		   0x55AA	         0x0006
      Wait		   0x55AA	         0x0007
      Wait		   0x55AA	         0x0008
      SARAM		   0x55AA	         0x000A	  <-- "Boot to SARAM"
      Flash		   0x55AA	         0x000B
	  Wait		   0x55AA            Other

   Write EMU_KEY to 0xD00 and EMU_BMODE to 0xD01 via the debugger
   according to the Boot Mode Table above. Build/Load project,
   Reset the device, and Run example

   $End_Boot_Table
**********************************************/

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

#define LED0 0x00000001
#define LED1 0x00000002
#define LED2 0x00000004
#define LED3 0x00000008

#define LED_on(LED_num)           GpioDataRegs.GPACLEAR.all = LED_num
#define LED_off(LED_num)          GpioDataRegs.GPASET.all = LED_num
#define LED_toggle(LED_num)       GpioDataRegs.GPATOGGLE.all = LED_num

#define config_leds_by_funtion


#ifdef config_leds_by_funtion
enum LED_action {on, off, toggle};
void LEDs(Uint32 LED_num, enum LED_action action);
#endif

// Prototype statements for functions found within this file.
void Gpio_select(void);
void LEDs_init();


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();  // Skipped for this example

// For this example use the following configuration:
   Gpio_select();

// 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:

   LEDs_init();

   while(1)
   {
	   LEDs(LED0|LED1|LED2|LED3, off);
	   DELAY_US(1000000);
	   LEDs(LED1, on);
	   DELAY_US(1000000);
	   LEDs(LED2, toggle);
	   DELAY_US(1000000);
	   LED_toggle(LED1);
	   DELAY_US(1000000);
   }
}

void LEDs_init()
{
	EALLOW;
	//使能上拉電阻
	GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;
	GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;
	GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;
	GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;

	//選擇GPIO功能
	GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0x0;
	GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0x0;
	GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0x0;
	GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0x0;

	//方向
	GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
	GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
	GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
	GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;

	EDIS;
}

#ifdef config_leds_by_funtion
void LEDs(Uint32 LED_num, enum LED_action action)
{
	switch (action)
	{
		case on:{
			GpioDataRegs.GPACLEAR.all = LED_num;
			break;
		}

		case off:{
			GpioDataRegs.GPASET.all = LED_num;
			break;
		}

		case toggle:{
			GpioDataRegs.GPATOGGLE.all = LED_num;
			break;
		}
	}
}
#endif

void Gpio_select(void)
{

    EALLOW;
	GpioCtrlRegs.GPAMUX1.all = 0x00000000;  // All GPIO
	GpioCtrlRegs.GPAMUX2.all = 0x00000000;  // All GPIO
	GpioCtrlRegs.GPBMUX1.all = 0x00000000;  // All GPIO
    GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF;   // All outputs
    GpioCtrlRegs.GPBDIR.all = 0x0000000F;   // All outputs
    EDIS;

}
//===========================================================================
// No more.
//===========================================================================




/************************************
    標題:LEDs.h
    軟件平臺:CCS v5.2
    硬件平臺:C2000 LaunchPad
    主頻:60M

    author:小船
    data:2012-09-23
*************************************/
#ifndef LEDS_H_
#define LEDS_H_

#include "DSP28x_Project.h"

#define no_config_leds_by_funtion

#define LED0 0x00000001
#define LED1 0x00000002
#define LED2 0x00000004
#define LED3 0x00000008

#define LED_on(LED_num)           GpioDataRegs.GPACLEAR.all = LED_num
#define LED_off(LED_num)          GpioDataRegs.GPASET.all = LED_num
#define LED_toggle(LED_num)       GpioDataRegs.GPATOGGLE.all = LED_num


#ifdef config_leds_by_funtion
enum LED_action {on, off, toggle};
void LEDs(Uint32 LED_num, enum LED_action action);
#endif

void LEDs_init();

#endif /* LEDS_H_ */




/************************************
    標題:LEDs.c
    軟件平臺:CCS v5.2
    硬件平臺:C2000 LaunchPad
    主頻:60M

    author:小船
    data:2012-09-23
*************************************/
#include "LEDs.h"

void LEDs_init()
{
	EALLOW;
	//使能上拉電阻
	GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;
	GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;
	GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;
	GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;

	//選擇GPIO功能
	GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0x0;
	GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0x0;
	GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0x0;
	GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0x0;

	//方向
	GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
	GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
	GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
	GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;

	EDIS;
}

#ifdef config_leds_by_funtion
void LEDs(Uint32 LED_num, enum LED_action action)
{
	switch (action)
	{
		case on:{
			GpioDataRegs.GPACLEAR.all = LED_num;
			break;
		}

		case off:{
			GpioDataRegs.GPASET.all = LED_num;
			break;
		}

		case toggle:{
			GpioDataRegs.GPATOGGLE.all = LED_num;
			break;
		}
	}
}
#endif



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章