14401|6

12

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

TMS320F28335项目开发记录8_28335之GPIO引脚 [复制链接]

GPIO(General-Purpose Input/Output)——通用输入/输出口;

      DSP28335 GPIO模块分为三类IO口:PORTA(0-31),PORTB(32-63),PORTC(64-87)
对GPIO模块的设置主要通过三类寄存器来完成,分别是:控制寄存器数据寄存器中断寄存器


1、控制寄存器
  GPxCTRL;    // GPIO x Control Register (GPIO0 to 31)
              //设置采样窗周期T=2*GPXCTRL*Tsysclk;

  GPxQSEL1;   // GPIO x Qualifier Select 1 Register (GPIO0 to 15)(32-47)            
  GPxQSEL2;   // GPIO x Qualifier Select 2 Register (GPIO16 to 31)(48-63)
              //每两位控制一个引脚,确定是3周期采样还是6周期采样或者不用采样

  GPxMUX1;    // GPIO x Mux 1 Register (GPIO0 to 15)(32-47)(64-79)
  GPxMUX2;    // GPIO x Mux 2 Register (GPIO16 to 31)(48-63)(80-95)
              //配置各个引脚的功能,0:I/O功能,1:外设功能。

  GPxDIR;     // GPIO x Direction Register (GPIO0 to 31)(32-63)(64-95)
              //配置每个引脚是输入还是输出,0:数字量输入;1:数字量输出。
  GPxPUD;     // GPIO x Pull Up Disable Register (GPIO0 to 31)(32-63)(64-95)
              //使能或禁止内部上拉 0:开启上拉,1:禁止上拉
2、数据寄存器

  GPxDAT;     // GPIO Data Register (GPIO0 to 31)(32-63)(64-95)


  GPxSET;     // GPIO Data Set Register (GPIO0 to 31)(32-63)(64-95)——置位
  GPxCLEAR;   // GPIO Data Clear Register (GPIO0 to 31)(32-63)(64-95)
  GPxTOGGLE;  // GPIO Data Toggle Register (GPIO0 to 31)(32-63)(64-95)—反转
3、中断寄存器

   GPIOXINT1SEL; // XINT1 GPIO Input Selection


   GPIOXINT2SEL; // XINT2 GPIO Input Selection
   GPIOXNMISEL;  // XNMI_Xint13 GPIO Input Selection
   GPIOXINT3SEL; // XINT3 GPIO Input Selection
   GPIOXINT4SEL; // XINT4 GPIO Input Selection
   GPIOXINT5SEL; // XINT5 GPIO Input Selection
   GPIOXINT6SEL; // XINT6 GPIO Input Selection
   GPIOXINT7SEL; // XINT7 GPIO Input Selection
   GPIOLPMSEL;   // Low power modes GP I/O input select
   可以对GPIO0-63进行外部中断设置;

具体定义在DSP28335Gpio.h中,如下:
  1. struct GPIO_CTRL_REGS {  
  2.    union  GPACTRL_REG  GPACTRL;   // GPIO A Control Register (GPIO0 to 31)  
  3.    union  GPA1_REG     GPAQSEL1;  // GPIO A Qualifier Select 1 Register (GPIO0 to 15)  
  4.    union  GPA2_REG     GPAQSEL2;  // GPIO A Qualifier Select 2 Register (GPIO16 to 31)  
  5.    union  GPA1_REG     GPAMUX1;   // GPIO A Mux 1 Register (GPIO0 to 15)  
  6.    union  GPA2_REG     GPAMUX2;   // GPIO A Mux 2 Register (GPIO16 to 31)  
  7.    union  GPADAT_REG   GPADIR;    // GPIO A Direction Register (GPIO0 to 31)  
  8.    union  GPADAT_REG   GPAPUD;    // GPIO A Pull Up Disable Register (GPIO0 to 31)  
  9.    Uint32              rsvd1;  
  10.    union  GPBCTRL_REG  GPBCTRL;   // GPIO B Control Register (GPIO32 to 63)  
  11.    union  GPB1_REG     GPBQSEL1;  // GPIO B Qualifier Select 1 Register (GPIO32 to 47)  
  12.    union  GPB2_REG     GPBQSEL2;  // GPIO B Qualifier Select 2 Register (GPIO48 to 63)  
  13.    union  GPB1_REG     GPBMUX1;   // GPIO B Mux 1 Register (GPIO32 to 47)  
  14.    union  GPB2_REG     GPBMUX2;   // GPIO B Mux 2 Register (GPIO48 to 63)  
  15.    union  GPBDAT_REG   GPBDIR;    // GPIO B Direction Register (GPIO32 to 63)  
  16.    union  GPBDAT_REG   GPBPUD;    // GPIO B Pull Up Disable Register (GPIO32 to 63)  
  17.    Uint16              rsvd2[8];  
  18.    union  GPC1_REG     GPCMUX1;   // GPIO C Mux 1 Register (GPIO64 to 79)  
  19.    union  GPC2_REG     GPCMUX2;   // GPIO C Mux 2 Register (GPIO80 to 95)  
  20.    union  GPCDAT_REG   GPCDIR;    // GPIO C Direction Register (GPIO64 to 95)  
  21.    union  GPCDAT_REG   GPCPUD;    // GPIO C Pull Up Disable Register (GPIO64 to 95)  
  22. };  
  23.   
  24. struct GPIO_DATA_REGS {  
  25.    union  GPADAT_REG       GPADAT;       // GPIO Data Register (GPIO0 to 31)  
  26.    union  GPADAT_REG       GPASET;       // GPIO Data Set Register (GPIO0 to 31)  
  27.    union  GPADAT_REG       GPACLEAR;     // GPIO Data Clear Register (GPIO0 to 31)  
  28.    union  GPADAT_REG       GPATOGGLE;    // GPIO Data Toggle Register (GPIO0 to 31)   
  29.    union  GPBDAT_REG       GPBDAT;       // GPIO Data Register (GPIO32 to 63)  
  30.    union  GPBDAT_REG       GPBSET;       // GPIO Data Set Register (GPIO32 to 63)  
  31.    union  GPBDAT_REG       GPBCLEAR;     // GPIO Data Clear Register (GPIO32 to 63)  
  32.    union  GPBDAT_REG       GPBTOGGLE;    // GPIO Data Toggle Register (GPIO32 to 63)  
  33.    union  GPCDAT_REG       GPCDAT;       // GPIO Data Register (GPIO64 to 95)  
  34.    union  GPCDAT_REG       GPCSET;       // GPIO Data Set Register (GPIO64 to 95)  
  35.    union  GPCDAT_REG       GPCCLEAR;     // GPIO Data Clear Register (GPIO64 to 95)  
  36.    union  GPCDAT_REG       GPCTOGGLE;    // GPIO Data Toggle Register (GPIO64 to 95)  
  37.    Uint16                  rsvd1[8];  
  38. };  
  39.   
  40. struct GPIO_INT_REGS {  
  41.    union  GPIOXINT_REG     GPIOXINT1SEL; // XINT1 GPIO Input Selection  
  42.    union  GPIOXINT_REG     GPIOXINT2SEL; // XINT2 GPIO Input Selection  
  43.    union  GPIOXINT_REG     GPIOXNMISEL;  // XNMI_Xint13 GPIO Input Selection  
  44.    union  GPIOXINT_REG     GPIOXINT3SEL; // XINT3 GPIO Input Selection  
  45.    union  GPIOXINT_REG     GPIOXINT4SEL; // XINT4 GPIO Input Selection  
  46.    union  GPIOXINT_REG     GPIOXINT5SEL; // XINT5 GPIO Input Selection  
  47.    union  GPIOXINT_REG     GPIOXINT6SEL; // XINT6 GPIO Input Selection  
  48.    union  GPIOXINT_REG     GPIOXINT7SEL; // XINT7 GPIO Input Selection  
  49.    union  GPADAT_REG       GPIOLPMSEL;   // Low power modes GP I/O input select  
  50. };  
复制代码
注意:GPIO相关寄存器介绍

1、GPxMUX寄存器(功能选择寄存器)

每个I/O口都有一个功能选择寄存器,功能选择寄存器主要用于选择I/O工作在特殊功能还是通用数组I/O模式。在复位时,所有GPIO配置成通用数字模式。

1)如果GPxMUX.bit = 0,配置成通用数字I/O功能;

2)如果GPxMUX.bit = 1,配置成特殊外设功能口(如SCI、CAN);

I/O的输入功能和外设的输入通道总是被使能的,输出通道是通用数组I/O和特殊外设复用的。如果引脚配置成通用数组I/O功能,相应的外设功能将被禁止。

2、GPxDIR(方向控制寄存器)

每个I/O口都有数据方向控制寄存器,数据方向控制寄存器用于设置通用数字I/O为输入还是输出口,在复位时,引脚的默认状态为输入状态。

1)如果GPxDIR.bit = 0,引脚设置为通用数字量输入;

2)如果GPxDIR.bit = 1,引脚设置为通用数字量输出;

复位时,GPxMUX和GPxDIR默认值都为0,所以在复位时,引脚的默认状态为数字I/O输入。

3、GPxDAT寄存器(数据寄存器)

每个I/O口都有一个数据寄存器,数据寄存器是可读可写寄存器。

1)I/O设置为输出功能时,如果GPxDAT.bit = 0,那么操作将会使相应的引脚拉低;

2)I/O口设置为输入功能时,如果GPxDAT.bit = 0,反映相应的引脚状态为低电平;

3)I/O口设置为输出功能时,如果GPxDAT.bit = 1,那么操作将会使相应的引脚拉高;

4)I/O口设置为输入功能时,如果GPxDAT.bit = 1,反映相应的引脚状态为高电平。

需要说明的是,当用户试图改变一个数字I/O的状态时,不要改变另一个I/O的引脚状态。

4、GOxSET寄存器(置位寄存器)

每个I/O口都有一个置位寄存器,置位寄存器是只写寄存器,任何读操作都返回0,如果相应的引脚配置成数据量输出,写1后相应的引脚会置高,写0时没有反映。

1)如果GPxSET.bit = 0,没有影响;

2)引脚设置为输出时,如果GPxSET.bit = 1,那么操作将会使引脚置高。

5、GPxCLEAR寄存器(清除寄存器)

每个I/O口都有一个清除寄存器,清除寄存器是只写寄存器,任何读操作都返回0。

1)如果GPxCLEAR.bit = 0,没有影响;

2)引脚设置为输出时,如果GPxCLEAR.bit = 1,将相应的引脚置成低电平。

6、GPxTOGGLE寄存器(取反触发寄存器)

每个I/O口都有一个取反触发寄存器,该寄存器是只写寄存器,任何读操作都返回0。

1)如果GPxTOGGLE.bit = 0,没有影响;

2)引脚设置为输出时,如果GPxTOGGLE.bit = 1,那么操作将使相应的引脚取反。


4.GPIO实例——点亮发光二极管电路原理图如下所示:


代码:
  1. #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File  
  2. #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File  
  3.   
  4. #define   LED1  GpioDataRegs.GPBDAT.bit.GPIO60  
  5. #define   LED2  GpioDataRegs.GPBDAT.bit.GPIO61  
  6.   
  7. interrupt void ISRTimer0(void);  
  8. void configtestled(void);  
  9. Uint16  i;  
  10.   
  11. void main(void)  
  12. {  
  13.    InitSysCtrl();  
  14.   
  15.    InitXintf16Gpio();  
  16.    DINT;  
  17.   
  18.    InitPieCtrl();  
  19.   
  20. // Disable CPU interrupts and clear all CPU interrupt flags:  
  21.    IER = 0x0000;  
  22.    IFR = 0x0000;  
  23.    InitPieVectTable();  
  24.   
  25.    EALLOW;  // This is needed to write to EALLOW protected registers  
  26.    PieVectTable.TINT0 = &ISRTimer0;            //配置中断函数地址  
  27.    //PieVectTable.XINT13 = &cpu_timer1_isr;  
  28.    //PieVectTable.TINT2 = &cpu_timer2_isr;  
  29.    EDIS;    // This is needed to disable write to EALLOW protected registers  
  30.   
  31.    InitCpuTimers();   // For this example, only initialize the Cpu Timers  
  32.   
  33.    // Configure CPU-Timer 0, 1, and 2 to interrupt every second:  
  34.    // 150MHz CPU Freq, 1 second Period (in uSeconds)  
  35.    ConfigCpuTimer(&CpuTimer0, 150, 1000000);   //配置定时时间  1s  
  36.    //ConfigCpuTimer(&CpuTimer1, 150, 1000000);  
  37.    //ConfigCpuTimer(&CpuTimer2, 150, 1000000);  
  38.     StartCpuTimer0();                         //定时器计数  
  39.   
  40. // Enable CPU int1 which is connected to CPU-Timer 0, CPU int13  
  41. // which is connected to CPU-Timer 1, and CPU int 14, which is connected  
  42. // to CPU-Timer 2:  
  43.     IER |= M_INT1;  
  44.    //IER |= M_INT13;  
  45.    //IER |= M_INT14;  
  46.   
  47. // Enable TINT0 in the PIE: Group 1 interrupt 7  
  48.     PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能PIE中断  
  49.       
  50. // Enable global Interrupts and higher priority real-time debug events:  
  51.     EINT;   // Enable Global interrupt INTM  
  52.     ERTM;   // Enable Global realtime interrupt DBGM  
  53.     configtestled();  
  54.     LED1 = 0;  
  55.     LED2 = 0;  
  56.     i = 0;  
  57.     for(; ;)  
  58.     {     
  59.     }  
  60.   
  61. }  
  62.   
  63. interrupt void ISRTimer0(void)  
  64. {  
  65.     CpuTimer0.InterruptCount++;  
  66.   
  67.    // Acknowledge this interrupt to receive more interrupts from group 1  
  68.     PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//PIEACK清0  
  69.     CpuTimer0Regs.TCR.bit.TIF=1;           //外设中断标志位清0  
  70.     CpuTimer0Regs.TCR.bit.TRB=1;           //重新装载  
  71.   
  72.     LED1=~LED1;  
  73.     LED2=~LED2;  
  74. }  
  75.   
  76. void configtestled(void)  
  77. {  
  78.    EALLOW;  
  79.    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0; // GPIO60 = GPIO60配置为普通数字IO  
  80.    GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1;  // 方向为输出  
  81.    GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0; // GPIO61 = GPIO61  
  82.    GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1;  
  83.    EDIS;  
  84. }  
  85.   
  86. //===========================================================================  
  87. // No more.  
  88. //===========================================================================  
复制代码
烧写程序后会发现LED1和LED2周期性交替闪烁!


最新回复

楼主师兄,你好,我刚刚学DSP28335,用的时候看一些程序,里面有些地方使用GPIO口的时候要使能内部上拉,有时候要禁止内部上拉,请问内部上拉有什么作用?没有使能或禁止内部上拉,引脚会出现什么问题?  详情 回复 发表于 2016-5-30 21:07
 
点赞 关注(3)
个人签名路漫漫其修远兮,吾将上下而求索!(今天,你努力了吗?还记得你的目标吗?)

回复
举报

7

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
总结的不错,我最近才开始学习28335,看了很有帮助,谢谢楼主
 
 

回复

56

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
请问楼主,关于28335这些寄存器的数据手册是在哪里找到的哦,我没搜到- -

点评

用户手册。去ti官网下载下。  详情 回复 发表于 2015-9-17 12:47
 
 
 

回复

667

帖子

3

TA的资源

版主

4
 
无知的萝卜 发表于 2015-9-17 11:18
请问楼主,关于28335这些寄存器的数据手册是在哪里找到的哦,我没搜到- -

用户手册。去ti官网下载下。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(中级)

5
 
nemo1991 发表于 2015-9-17 12:47
用户手册。去ti官网下载下。

嗯,我就是去官网照的,只找到这个 但是里面没有讲28335的寄存器这些

点评

reference manual.  详情 回复 发表于 2015-9-17 21:00
 
 
 

回复

667

帖子

3

TA的资源

版主

6
 
无知的萝卜 发表于 2015-9-17 13:30
嗯,我就是去官网照的,只找到这个但是里面没有讲28335的寄存器这些

reference manual.
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼主师兄,你好,我刚刚学DSP28335,用的时候看一些程序,里面有些地方使用GPIO口的时候要使能内部上拉,有时候要禁止内部上拉,请问内部上拉有什么作用?没有使能或禁止内部上拉,引脚会出现什么问题?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表