DSP_GPIO

 

 

 

Digital I/O Unit

GPIO英語:General-purpose input/output),通用型之輸入輸出的簡稱,其接腳可以供使用者由程式控制自由使用,PIN腳依現實考量可作為通用輸入(GPI)或通用輸出(GPO)或通用輸入與輸出(GPIO),如當clk generator, chip select等。

既然一個引腳可以用於輸入、輸出或其他特殊功能,那麼一定有暫存器用來選擇這些功能。對於輸入,一定可以通過讀取某個暫存器來確定引腳電位的高低;對於輸出,一定可以通過寫入某個暫存器來讓這個引腳輸出高電位或者低電位;對於其他特殊功能,則有另外的暫存器來控制它們。

 

 

  • 寄存器組“GPxPUD”可用於禁止內部上拉電阻,使電壓電平保持懸空或高阻態。
  • 當選擇數字I / O功能時,寄存器組GPxDIR定義I / O的方向。將位清零將該行配置為輸入,將位位置為1將該行配置為輸出。
  • 當從輸入去讀取的數據是通過一組GPxDAT寄存器執行的。
  • 寫入輸出時的數據也可以通過寄存器GPxDAT來執行。另外,還有3組寄存器:
  1. GPxSET
  2. GPxCLEAR
  3. GPxTOGGLE

 這些寄存器的目的是使用掩碼技術來設置,清除或切換這些輸出值時,這些輸出行對應於正在使用的掩碼中設置為1的位。例如,要將GPIO5清零,可以使用以下指令:

GpioDataRegs.GPACLEAR.bit.GPIO5 = 1;

 

 

 

 F2833x Pin Assignment(分配)

接下來的五張幻燈片顯示了所有88個I / O線的複用分配:

 

 Lab 5_1: Digital Output at 4 LEDs

 

//
//      Lab5_1: TMS320F28335
//      (c) Frank Bormann
//
//###########################################################################
//
// FILE:    Lab5_1.c
// 
// TITLE:    DSP28335ControlCARD; Digital Output
//            4 - bit - counter at 4 LEDs LD1(GPIO9), LD2(GPIO11), LD3(GPIO34)
//            and LD4 (GPIO49) 
//            software delay loop; watchdog disabled
//            template file for Lab5_1
//###########################################################################
//  Ver | dd mmm yyyy | Who  | Description of changes
// =====|=============|======|===============================================
//  3.0 | 02 May 2008 | F.B. | Lab5_1 for F28335; 
//  3.1 | 06 Nov 2009 | F.B  | Lab5_1 for F28335 and PE revision5
//###########################################################################
#include "DSP2833x_Device.h"

// Prototype statements for functions found within this file.
void Gpio_select(void);
void InitSystem(void);
void delay_loop(long);

//###########################################################################
//                        main code                                    
//###########################################################################
void main(void)
{
    int counter=0;        // binary counter for digital output

    InitSystem();         // Basic Core Initialization

    DINT;                // Disable all interrupts
    
    Gpio_select();        // GPIO9,GPIO11,GPIO34 and GPIO49 as output (LEDs @ peripheral explorer)

    while(1)
    {    
              counter++;
            // place your code to analyze counter here 
            // if bit 0 of counter = 1, set GPIO9 to 1
            // if bit 1 of counter = 1, set GPIO11 to 1 
            // if bit 2 of counter = 1, set GPIO34 to 1
            // if bit 3 of counter = 1, set GPIO49 to 1 
            if(counter&1) GpioDataRegs.GPASET.bit.GPIO9 = 1;
                else GpioDataRegs.GPACLEAR.bit.GPIO9 = 1;
            if(counter&2) GpioDataRegs.GPASET.bit.GPIO11 = 1;
                else GpioDataRegs.GPACLEAR.bit.GPIO11 = 1;
            if(counter&4) GpioDataRegs.GPBSET.bit.GPIO34 = 1;
                else GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
            if(counter&8) GpioDataRegs.GPBSET.bit.GPIO49 = 1;
                else GpioDataRegs.GPBCLEAR.bit.GPIO49 = 1;

            delay_loop(1000000);       //值*10^-7   =  Delay time
    }
} 

void delay_loop(long end)
{
    long i;
    for (i = 0; i < end; i++)
    {
        asm(" NOP");
//        EALLOW;
//        SysCtrlRegs.WDKEY = 0x55;
//        SysCtrlRegs.WDKEY = 0xAA;
//        EDIS;
    }
}    

void Gpio_select(void)
{
    EALLOW;
    GpioCtrlRegs.GPAMUX1.all = 0;       // GPIO15 ... GPIO0 = General Puropse I/O
    GpioCtrlRegs.GPAMUX2.all = 0;       // GPIO31 ... GPIO16 = General Purpose I/O
    GpioCtrlRegs.GPBMUX1.all = 0;       // GPIO47 ... GPIO32 = General Purpose I/O
    GpioCtrlRegs.GPBMUX2.all = 0;       // GPIO63 ... GPIO48 = General Purpose I/O
    GpioCtrlRegs.GPCMUX1.all = 0;       // GPIO79 ... GPIO64 = General Purpose I/O
    GpioCtrlRegs.GPCMUX2.all = 0;       // GPIO87 ... GPIO80 = General Purpose I/O

    GpioCtrlRegs.GPADIR.all = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;  // peripheral explorer: LED LD1 at GPIO9
    GpioCtrlRegs.GPADIR.bit.GPIO11 = 1; // peripheral explorer: LED LD2 at GPIO11

    GpioCtrlRegs.GPBDIR.all = 0;        // GPIO63-32 as inputs
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // peripheral explorer: LED LD3 at GPIO34
    GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1; // peripheral explorer: LED LD4 at GPIO49
    GpioCtrlRegs.GPCDIR.all = 0;        // GPIO87-64 as inputs
    EDIS;
    EDIS;
}   

void InitSystem(void)
{
    EALLOW;
//    SysCtrlRegs.WDCR = 0x0028;          // Watchdog enabled, 4.3 milliseconds
//    SysCtrlRegs.SCSR = 0x0000;          // Watchdog will cause a reset
    SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;
    SysCtrlRegs.PLLCR.bit.DIV = 10;     // 30MHz * 10 / 2 = 150 MHz SYSCLK
    SysCtrlRegs.HISPCP.all = 0x0001;    // SYSCLK / 2
    SysCtrlRegs.LOSPCP.all = 0x0002;    // SYSCLK / 4
    SysCtrlRegs.PCLKCR0.all = 0x0000;
    SysCtrlRegs.PCLKCR1.all = 0x0000;
    SysCtrlRegs.PCLKCR3.all = 0x0000;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;
    EDIS;
}
//===========================================================================
// End of SourceCode.
//===========================================================================

 

posted @ 2018-04-20 13:19  CiAn_H  阅读(278)  评论(0)    收藏  举报