TMS320F28335-GPIO

上级目录TMS320F28335使用教程

介绍

F28335 DSP有88个GPIO口,对应着芯片引出的88个引脚,88个引脚多数都是功能复用的,可以灵活配置为输入引脚,也可以灵活配置为输出引脚,即可以作为通用I/O引脚,也可以作为特殊功能口(如SCI、SPI、ECAN等),根据需要,可以通过GPIO MUX(输入输出多路选择器,复用开关)寄存器来进行相关配置,下边介绍GPIO的工作原理及其配置过程。
F28335 DSP将这88个GPIO口分成了A、B、C三大组,A组包括GPIO0至GPIO31,B组包括GPIO32至GPIO63,C组包括GPIO64至GPIO87,每个引脚都复用了多个功能,同一时刻,每个引脚只能用该引脚的一个功能。究竟工作在哪个模式下,可以通过GPIO Mux(复用开关)寄存器配置每个引脚的具体功能(通用数字量I/O或者外设专用功能)。如果将这些引脚选择数字量I/O模式,可以通过方向寄存器GPxDIR配置数字量I/O的方向,即是作为输入引脚还是作为输出引脚;还可以通过量化寄存器GPxQUAL对输入信号进行量化限制,从而可以消除数字量I/O引脚的噪声干扰。此外,有下面4种方式对GPIO引脚进行读写操作:

1、可以通过GPxDAT寄存器独立读/写I/O信号;

2、利用GPxSET寄存器写1(写0无效)对I/O口进行置位

3、利用GPxCLEAR寄存器写1(写0无效)对I/O口进行清零;

4、利用GPxTOOGLE寄存器置1后(写0无效)来将I/O输出电平翻转,原来高电平变成低电平,原来低电平则变成高电平。
在这里插入图片描述

点亮led(输出模式)

最重要的一步来了
从上面示意图可以看出,GPAMUX寄存器决定了IO是哪种模式(普通IO、外设1、外设2、外设3),GPADIR决定了是否输出,GPADAT决定了输出电平高低。开发板电路
现在根据官方手册来写程序在这里插入图片描述
根据开发板电路图和上面的官方手册给出的GPIO配置步骤,程序如下:

   EALLOW;//受保护的寄存器,要先关保护才能写进寄存器值
   GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO0复用为GPIO功能
   GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;  // GPIO0设置为输出
   GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;  //GPIO0关闭内部上拉
   EDIS;//开保护

寄存器是否受保护可以参考技术手册,受保护的寄存器下会有说明,如下图在这里插入图片描述

led闪烁代码实现


   while(1)
    {
       GpioDataRegs.GPADAT.bit.GPIO0 =~GpioDataRegs.GPADAT.bit.GPIO0 ;   //LED灯状态取反
       DELAY_US(1000000);//延时
    }

实验现象:
在这里插入图片描述
好了,会了点灯就会了流水灯、继电器等这种开关控制的东西了,第一小步已经完成

按键输入(GPIO输入)

使用按键1控制1位数码管,按一次数字加1,一直按数字一直加,0-9循环
电路参考如下:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
独立按键接在GPIO21与GPIO26上,且两端都接了上拉电阻
数码管使用BIT3位,GPIO61控制位选,GPIO72-GPIO79控制显示内容

//数码管编码0-9
unsigned char const table[]=
{
0xfc,0x60,0xda,0xf2,     //0~3
0x66,0xb6,0xbe,0xe0,    //4~7
0xfe,0xf6
}; // 共阴极
//GPIO配置
void configio(void)  //数码管GPIO的配置
{
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 0;  // GPIO复用为GPIO功能
    GpioCtrlRegs.GPADIR.bit.GPIO21 = 0;   // 输入模式
    GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 0;  // GPIO复用为GPIO功能
    GpioCtrlRegs.GPADIR.bit.GPIO26 = 1;   // 输出模式
    GpioDataRegs.GPADAT.bit.GPIO26 = 0;   // GPIO26输出低电平
    
    GpioCtrlRegs.GPCMUX1.bit.GPIO72 = 0;  // XD7 数码管总线的配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO73 = 0;  // XD6 数码管总线的配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO74 = 0;  // XD5 数码管总线的配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO75 = 0;  // XD4 数码管总线的配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO76 = 0;  // XD3 数码管总线的配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO77 = 0;  // XD2 数码管总线的配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO78 = 0;  // XD1 数码管总线的配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO79 = 0;  // XD0 数码管总线的配置
	GpioCtrlRegs.GPCDIR.all |= 0x0000FF00;// GPIO72~79配置为输出
	
    GpioCtrlRegs.GPBMUX2.bit.GPIO61= 0;   // GPIO复用为GPIO功能
    GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1;   // GPIO设置为输出
    GpioDataRegs.GPBDAT.all = 0x1C000000; // GPBDAT控制GPIO32-63,GPIO63置零显示 00011100 00000000 00000000 00000000
    EDIS;
}
//数码管显示函数
void SEG_DATA(uchar d)
{
   Uint32 b=0;
   b=d;
   b<<=8;//GPIO64-87受GPCDAT控制,数码管使用的为GPIO72-79,所以需要左移8位
   GpioDataRegs.GPCDAT.all = b;
}
//函数主体
    configio();
    int i=0;
    SEG_DATA(table[i]);    //右边第一个显示0
    while(1)
    {
        while(GpioDataRegs.GPADAT.bit.GPIO21==1);
        if(GpioDataRegs.GPADAT.bit.GPIO21==0)
        {
            DELAY_US(10000);//软件消抖
            if(GpioDataRegs.GPADAT.bit.GPIO21==0)
            {
                i++;
                i=i%10;//显示范围0~9
            }
        }
        SEG_DATA(table[i]);    //
        DELAY_US(100000);//防止按一次数码管示数加1太快
	}

实验现象如下:
在这里插入图片描述

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值