zoukankan      html  css  js  c++  java
  • DSP28335 GPIO学习

    根据网络资料以及以下两篇博客整理

    http://blog.sina.com.cn/s/blog_86a6035301017rr7.html

    http://blog.csdn.net/hmf1235789/article/details/51883714

      

      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引脚的噪声干扰。

      对GPIO模块的设置主要通过三类寄存器来完成,分别是:控制寄存器、数据寄存器、中断寄存器。

    1、控制寄存器

     1 GPxCTRL;    // GPIO x Control Register (GPIO0 to 31)
     2               //设置采样窗周期T=2*GPXCTRL*Tsysclk;
     3   GPxQSEL1;   // GPIO x Qualifier Select 1 Register (GPIO0 to 15)(32-47)
     4              
     5   GPxQSEL2;   // GPIO x Qualifier Select 2 Register (GPIO16 to 31)(48-63)
     6               //每两位控制一个引脚,确定是3周期采样还是6周期采样或者不用采样
     7   GPxMUX1;    // GPIO x Mux 1 Register (GPIO0 to 15)(32-47)(64-79)
     8   GPxMUX2;    // GPIO x Mux 2 Register (GPIO16 to 31)(48-63)(80-95)
     9               //配置各个引脚的功能,0:I/O功能,1:外设功能。
    10   GPxDIR;     // GPIO x Direction Register (GPIO0 to 31)(32-63)(64-95)
    11               //配置每个引脚是输入还是输出,0:数字量输入;1:数字量输出。
    12   GPxPUD;     // GPIO x Pull Up Disable Register (GPIO0 to 31)(32-63)(64-95)
    13               //使能或禁止jie口的内部上拉

    2、数据寄存器

    1  GPxDAT;     // GPIO Data Register (GPIO0 to 31)(32-63)(64-95)
    2  GPxSET;     // GPIO Data Set Register (GPIO0 to 31)(32-63)(64-95)
    3  GPxCLEAR;   // GPIO Data Clear Register (GPIO0 to 31)(32-63)(64-95)
    4  GPxTOGGLE;  // GPIO Data Toggle Register (GPIO0 to 31)(32-63)(64-95)

    3、中断寄存器

     1  GPIOXINT1SEL; // XINT1 GPIO Input Selection
     2  GPIOXINT2SEL; // XINT2 GPIO Input Selection
     3  GPIOXNMISEL;  // XNMI_Xint13 GPIO Input Selection
     4  GPIOXINT3SEL; // XINT3 GPIO Input Selection
     5  GPIOXINT4SEL; // XINT4 GPIO Input Selection
     6  GPIOXINT5SEL; // XINT5 GPIO Input Selection
     7  GPIOXINT6SEL; // XINT6 GPIO Input Selection
     8  GPIOXINT7SEL; // XINT7 GPIO Input Selection
     9  GPIOLPMSEL;   // Low power modes GP I/O input select
    10 可以对GPIO0-63进行外部中断设置

    注:0~31配置为XINT1、XINT2;32~63配置为XINT3、4、5、6、7

    在《手把手教你学DSP》的第六章为GPIO介绍,在配套例程配套文档例程资料CCS4.12lab2-GPIO_SETUP下的DSP2833x_Gpio.c程序如下

     1 // TI File $Revision: /main/1 $
     2 // Checkin $Date: August 18, 2006   13:46:25 $
     3 //###########################################################################
     4 //
     5 // FILE:    DSP2833x_Gpio.c
     6 //
     7 // TITLE:   DSP2833x 通用 I/O 初始化& 支持函数.
     8 //
     9 //###########################################################################
    10 // $TI Release: DSP2833x Header Files V1.01 $
    11 // $Release Date: September 26, 2007 $
    12 //###########################################################################
    13 
    14 #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
    15 #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
    16 
    17 //---------------------------------------------------------------------------
    18 // InitGpio: 
    19 //---------------------------------------------------------------------------
    20 // 该函数初始化到一个已知的(默认)状态.
    21 //
    22 // 更多关于配置GPIO外围功能的细节,
    23 // 请参照个人设置的外围例子/或 GPIO 设置示例. 
    24 void InitGpio(void)
    25 {
    26    EALLOW;
    27 
    28    // 每个 GPIO pin 都可以: 
    29    // a) a GPIO 输入/输出
    30    // b) 外设功能 1
    31    // c) 外设功能 2
    32    // d) 外设功能 3
    33    // 默认情况下, 所有的 GPIO 都为输入 
    34    GpioCtrlRegs.GPAMUX1.all = 0x0000;     // GPIO 功能 GPIO0-GPIO15
    35    GpioCtrlRegs.GPAMUX2.all = 0x0000;     // GPIO 功能 GPIO16-GPIO31
    36    GpioCtrlRegs.GPBMUX1.all = 0x0000;     // GPIO 功能 GPIO32-GPIO39
    37    GpioCtrlRegs.GPBMUX2.all = 0x0000;     // GPIO 功能 GPIO48-GPIO63
    38    GpioCtrlRegs.GPCMUX1.all = 0x0000;     // GPIO 功能 GPIO64-GPIO79
    39    GpioCtrlRegs.GPCMUX2.all = 0x0000;     // GPIO 功能 GPIO80-GPIO95
    40 
    41    GpioCtrlRegs.GPADIR.all = 0x0000;      // GPIO0-GPIO31 都为输入
    42    GpioCtrlRegs.GPBDIR.all = 0x0000;      // GPIO32-GPIO63 都为输入   
    43    GpioCtrlRegs.GPCDIR.all = 0x0000;      // GPI064-GPIO95 都为输入
    44 
    45    // 每个输入都可以有不同的限制
    46    // a) 输入信号同步 to SYSCLKOUT
    47    // b) 输入合适的采样窗口
    48    // c) 异步输入模式 (仅外围输入有效)
    49    GpioCtrlRegs.GPAQSEL1.all = 0x0000;    // GPIO0-GPIO15 同步 to SYSCLKOUT 
    50    GpioCtrlRegs.GPAQSEL2.all = 0x0000;    // GPIO16-GPIO31 同步 to SYSCLKOUT
    51    GpioCtrlRegs.GPBQSEL1.all = 0x0000;    // GPIO32-GPIO39 同步 to SYSCLKOUT 
    52    GpioCtrlRegs.GPBQSEL2.all = 0x0000;    // GPIO48-GPIO63 同步 to SYSCLKOUT 
    53 
    54    // 上拉可以禁止或使能. 
    55    GpioCtrlRegs.GPAPUD.all = 0x0000;      // 启用上拉 GPIO0-GPIO31
    56    GpioCtrlRegs.GPBPUD.all = 0xffff;    //0x0000;      // 启用上拉 GPIO32-GPIO63
    57    GpioCtrlRegs.GPCPUD.all = 0x0000;      // 启用上拉 GPIO64-GPIO79
    58 
    59    //GpioCtrlRegs.GPAPUD.all = 0xFFFF;    // 禁止上拉 GPIO0-GPIO31
    60    //GpioCtrlRegs.GPBPUD.all = 0xFFFF;    // 禁止上拉 GPIO32-GPIO34
    61    //GpioCtrlRegs.GPCPUD.all = 0xFFFF     // 禁止上拉 GPIO64-GPIO79
    62 
    63    EDIS;
    64 
    65 }   
    66 
    67 //=========================================================
    68 // End of file.
    69 //=========================================================

    GPIO的控制实例在《手把手教你学DSP》配套例程CCS4.12lab1-GPIO_LED下控制LED灯闪烁

      1 #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
      2 #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
      3 
      4 #define   LED1  GpioDataRegs.GPADAT.bit.GPIO0   //数据寄存器宏定义
      5 #define   LED2  GpioDataRegs.GPADAT.bit.GPIO1
      6 #define   LED3  GpioDataRegs.GPADAT.bit.GPIO2
      7 #define   LED4  GpioDataRegs.GPADAT.bit.GPIO3
      8 #define   LED5  GpioDataRegs.GPADAT.bit.GPIO4
      9 #define   LED6  GpioDataRegs.GPADAT.bit.GPIO5
     10 
     11 
     12 
     13 interrupt void ISRTimer0(void); 
     14 void configtestled(void);
     15 
     16 
     17 void main(void)
     18 {
     19 // 步骤 1. 初始化系统控制:
     20 // PLL, WatchDog, 使能外围时钟
     21 // 这个函数在 DSP2833x_SysCtrl.c 文件中.
     22    InitSysCtrl();
     23 
     24 // 步骤 2. 初始化设置 GPIO:
     25 // 这个函数例子在 DSP2833x_Gpio.c 文件中
     26 // 说明了如何设置GPIO的默认状态.
     27 // InitGpio();  // 跳过这个函数
     28    InitXintf16Gpio();   //zq
     29 
     30 // 步骤 3. 清除所有中断向量和初始化向量表:
     31 // 禁止CPU中断
     32    DINT;
     33 
     34 // 初始化PIE控制寄存器的默认状态.
     35 // 默认状态是所有的中断和中断标志被清除
     36 // 这个函数在 DSP2833x_PieCtrl.c 文件中.
     37    InitPieCtrl();
     38 
     39 // Disable CPU interrupts and clear all CPU interrupt flags:
     40    IER = 0x0000;
     41    IFR = 0x0000;
     42 
     43 // 初始化中断向量表的地址指针
     44 // 中断服务程序 (ISR).
     45 // 即使不使用中断也要将表格填充满, 这样的目的是用于调试.
     46 // 这个函数在 DSP2833x_DefaultIsr.c文件中
     47 // 这个函数在 DSP2833x_PieVect.c.文件中
     48    InitPieVectTable();
     49    configtestled();
     50 
     51       LED1=1;
     52    DELAY_US(10);
     53       LED2=1;
     54    DELAY_US(10);
     55       LED3=1;
     56    DELAY_US(10);
     57       LED4=0;
     58    DELAY_US(10);
     59       LED5=0;
     60    DELAY_US(10);
     61       LED6=0;
     62    DELAY_US(10);
     63 
     64 
     65  while(1){
     66       LED1=~LED1;
     67    DELAY_US(50000);
     68       LED2=~LED2;
     69    DELAY_US(50000);
     70       LED3=~LED3;
     71    DELAY_US(50000);
     72       LED4=~LED4;
     73    DELAY_US(50000);
     74       LED5=~LED5;
     75    DELAY_US(50000);
     76       LED6=~LED6;
     77    DELAY_US(50000);
     78 
     79 }
     80 
     81 }
     82 
     83 
     84 void configtestled(void)
     85 {
     86    EALLOW;
     87    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO0 = GPIO0
     88    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;  // 输出
     89    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO1 = GPIO1
     90    GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;  // 输出
     91    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO2 = GPIO2
     92    GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;  // 输出
     93    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; // GPIO3 = GPIO3
     94    GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;  // 输出
     95    GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0; // GPIO4 = GPIO4
     96    GpioCtrlRegs.GPADIR.bit.GPIO4 = 1;  // 输出
     97    GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0; // GPIO5 = GPIO5
     98    GpioCtrlRegs.GPADIR.bit.GPIO5 = 1;  // 输出
     99 
    100    EDIS;
    101 }
    102 //===========================================================================
    103 // No more.
    104 //===========================================================================
  • 相关阅读:
    [bzoj1076]奖励关
    [bzoj1085]骑士精神
    [bzoj1082]栅栏
    [bzoj1084]最大子矩阵
    [bzoj1072]排列
    [bzoj1071]组队
    [bzoj1068]压缩
    [bzoj1061]志愿者招募
    [bzoj1059]矩阵游戏
    [bzoj1052]覆盖问题
  • 原文地址:https://www.cnblogs.com/ylhwx/p/7758106.html
Copyright © 2011-2022 走看看