专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

TMS320F2812外设例程系列之Gpio

作者:佚名   来源:不详   点击数:  更新时间:2014年08月17日   【字体:

 

 
//#####################################################################
// 文件:  DSP281x_Gpio.c
// 说明:  DSP281x 通用I/O初始化函数
//#####################################################################
#include "DSP281x_Device.h"     
#include "DSP281x_Examples.h"  
// 初始化GPIO,该函数将GPIO初始化到已知状态
void InitGpio(void)
{
    //设置GPIO A 口引脚,AL(位7:0)(输入)-AH(位15:8))(输出) 
    //输入采样限定值=0,不限定
    EALLOW;
    GpioMuxRegs.GPAMUX.all = 0x0000;     
    GpioMuxRegs.GPADIR.all = 0xFF00;     //高字节输出,低字节输入 
    GpioMuxRegs.GPAQUAL.all = 0x0000; //输入采样限定关闭
    //设置GPIO B口引脚为EVB信号
    //输入采样限定值=0,不限定
    //将位写1配置为片内外设功能
    GpioMuxRegs.GPBMUX.all = 0xFFFF;   
    GpioMuxRegs.GPBQUAL.all = 0x0000; //输入采样限定关闭
    EDIS;
}
//#####################################################################
// 文件:  Example_281xGpioToggle.c
// 说明:  DSP281x 芯片GPIO 反转触发测试程序
//#####################################################################
#include "DSP281x_Device.h"     
#include "DSP281x_Examples.h"   
//选择被编译的例子,只有一个例子设为1,其他的设为0
#define EXAMPLE1  1   //使用DATA 寄存器触发I/O引脚
#define EXAMPLE2  0   //使用SET/CLEAR寄存器触发I/O引脚
#define EXAMPLE3  0   //使用 TOGGLE寄存器触发I/O引脚
//文件中定义的函数原型声明
void delay_loop(void);
void Gpio_select(void);
void Gpio_example1(void);
void Gpio_example2(void);
void Gpio_example3(void);
void main(void)
{
    //Step 1.系统初始化系统控制:PLL、看门狗、使能外部时钟
    InitSysCtrl();
    //Step 2. 初始化 GPIO
    //InitGpio();             //本例中采用下面的配置,跳过
    Gpio_select();  
    //Step 3.清除所有中断,初始化PIE向量表
    DINT;                     //关全局中断
    InitPieCtrl();
    IER = 0x0000;             //关CPU级中断
    IFR = 0x0000;             //清除所有CPU级中断标志位
    InitPieVectTable();
    //Step 4. 用户代码
    #if  EXAMPLE1             //本例使用DATA 寄存器触发I/O引脚
      Gpio_example1();
    #endif  // - EXAMPLE1
    #if  EXAMPLE2             //本例使用SET/CLEAR寄存器触发I/O引脚
      Gpio_example1();
    #endif
    #if  EXAMPLE3             //本例使用TOGGLE寄存器触发I/O引脚
      Gpio_example3();
    #endif
}
void delay_loop()
{
    short i;
    for (i = 0; i < 1000; i++) {}
}
void Gpio_example1(void)
    //用DATA寄存器触发I/O引脚。注意:当使用DATA寄存器输入值可能丢失,如果在
    //I/O口有输入数据,最好使用CLEAR/SET/TOGGLE寄存器代替
    while(1)
    {    
       GpioDataRegs.GPADAT.all = 0xAAAA;   
       GpioDataRegs.GPBDAT.all = 0xAAAA;     
       GpioDataRegs.GPDDAT.all = 0x0022;    
       GpioDataRegs.GPEDAT.all = 0x0002; 
       GpioDataRegs.GPFDAT.all = 0xAAAA;    
       GpioDataRegs.GPGDAT.all = 0x0020;    
       delay_loop();
       GpioDataRegs.GPADAT.all = 0x5555;    
       GpioDataRegs.GPBDAT.all = 0x5555;     
       GpioDataRegs.GPDDAT.all = 0x0041;     //仅有4个I/O引脚
       GpioDataRegs.GPEDAT.all = 0x0005;     //仅有3个I/O引脚
       GpioDataRegs.GPFDAT.all = 0x5555;    
       GpioDataRegs.GPGDAT.all = 0x0010;     //仅有2个I/O引脚
       delay_loop();
    }
}
void Gpio_example2(void)
    //用SET/CLEAR寄存器触发I/O引脚
    while(1)
    {    
       GpioDataRegs.GPASET.all = 0xAAAA;
       GpioDataRegs.GPACLEAR.all = 0x5555;  
       GpioDataRegs.GPBSET.all = 0xAAAA;
       GpioDataRegs.GPBCLEAR.all = 0x5555;     
       GpioDataRegs.GPDSET.all = 0x0022;
       GpioDataRegs.GPDCLEAR.all = 0x0041;     //仅有4个I/O引脚
       GpioDataRegs.GPESET.all = 0x0002;
       GpioDataRegs.GPECLEAR.all = 0x0005;     //仅有3个I/O引脚
       GpioDataRegs.GPFSET.all = 0xAAAA;
       GpioDataRegs.GPFCLEAR.all = 0x5555;    
       GpioDataRegs.GPGSET.all = 0x0020;
       GpioDataRegs.GPGCLEAR.all = 0x0010;     //仅有2个I/O引脚
       delay_loop();
       GpioDataRegs.GPACLEAR.all = 0xAAAA;
       GpioDataRegs.GPASET.all = 0x5555;       
       GpioDataRegs.GPBCLEAR.all = 0xAAAA;
       GpioDataRegs.GPBSET.all = 0x5555;     
       GpioDataRegs.GPDCLEAR.all = 0x0022;
       GpioDataRegs.GPDSET.all = 0x0041;       //仅有4个I/O引脚
       GpioDataRegs.GPECLEAR.all = 0x0002;
       GpioDataRegs.GPESET.all = 0x0005;       //仅有3个I/O引脚
       GpioDataRegs.GPFCLEAR.all = 0xAAAA;
       GpioDataRegs.GPFSET.all = 0x5555;    
       GpioDataRegs.GPGCLEAR.all = 0x0020;
       GpioDataRegs.GPGSET.all = 0x0010;       //仅有2个I/O引脚
       delay_loop();
    }
}
void Gpio_example3(void)
    //用TOGGLE寄存器触发I/O引脚,设置引脚为已知状态
    GpioDataRegs.GPASET.all = 0xAAAA;
    GpioDataRegs.GPACLEAR.all = 0x5555; 
    GpioDataRegs.GPBSET.all = 0xAAAA;
    GpioDataRegs.GPBCLEAR.all = 0x5555;     
    GpioDataRegs.GPDSET.all = 0x0022;
    GpioDataRegs.GPDCLEAR.all = 0x0041;     //仅有4个I/O引脚
    GpioDataRegs.GPESET.all = 0x0002;
    GpioDataRegs.GPECLEAR.all = 0x0005;     //仅有3个I/O引脚
    GpioDataRegs.GPFSET.all = 0xAAAA;
    GpioDataRegs.GPFCLEAR.all = 0x5555;    
    GpioDataRegs.GPGSET.all = 0x0020;
    GpioDataRegs.GPGCLEAR.all = 0x0010;     //仅有2个I/O引脚
    //用TOGGLE寄存器反转引脚状态,任何位写1反转,写0不反转
    while(1)
    {    
       GpioDataRegs.GPATOGGLE.all = 0xFFFF;
       GpioDataRegs.GPBTOGGLE.all = 0xFFFF;
       GpioDataRegs.GPDTOGGLE.all = 0xFFFF;
       GpioDataRegs.GPETOGGLE.all = 0xFFFF;
       GpioDataRegs.GPFTOGGLE.all = 0xFFFF;
       GpioDataRegs.GPGTOGGLE.all = 0xFFFF;
       delay_loop();
    }
}
void Gpio_select(void)
{
    Uint16 var1;
    Uint16 var2;
    Uint16 var3;
    var1= 0x0000;         //设置GPIO多路复用为I/O功能
    var2= 0xFFFF;               //设置GPIO方向为输出
    var3= 0x0000;         //设置输入采样限定值
    EALLOW;
    GpioMuxRegs.GPAMUX.all = var1;
    GpioMuxRegs.GPBMUX.all = var1;   
    GpioMuxRegs.GPDMUX.all = var1;
    GpioMuxRegs.GPFMUX.all = var1; 
    GpioMuxRegs.GPEMUX.all = var1; 
    GpioMuxRegs.GPGMUX.all = var1;
    GpioMuxRegs.GPADIR.all = var2; //GPIO 方向为输出
    GpioMuxRegs.GPBDIR.all = var2;   //GPIO 方向为输出
    GpioMuxRegs.GPDDIR.all = var2;
    GpioMuxRegs.GPEDIR.all = var2;
    GpioMuxRegs.GPFDIR.all = var2; 
    GpioMuxRegs.GPGDIR.all = var2;
    GpioMuxRegs.GPAQUAL.all = var3;     //设置输入采样限定值
    GpioMuxRegs.GPBQUAL.all = var3;   
    GpioMuxRegs.GPDQUAL.all = var3;
    GpioMuxRegs.GPEQUAL.all = var3;
    EDIS;
}     
 
关闭窗口