Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

本实验利用前面介绍的定时器中断控制实验,完成通用GPIO 输入输出口控制实验, Plus1 7021系统提供9组(P0到P8),每组8个,共计72个通用GPIO 通用输入输出口,每个GPIO都可单独配置为输入或输出:

 对应的32位寄存器如下:

寄存器

功能描述

 

gpio_first[0]

bit[7:0] :  P0组GPIO控制,对应bit为1,开启GPIO功能;对应bit为0,关闭GPIO功能;(缺省为0)

bit[15:8]P1组GPIO控制,对应bit为1,开启GPIO功能;对应bit为0,关闭GPIO功能;(缺省为0)

bit[23:16]P2组GPIO控制,对应bit为1,开启GPIO功能;对应bit为0,关闭GPIO功能;(缺省为0)

bit[31:24]P3组GPIO控制,对应bit为1,开启GPIO功能;对应bit为0,关闭GPIO功能;(缺省为0)

 

gpio_first[1]

bit[7:0] :  P4组GPIO控制,对应bit为1,开启GPIO功能;对应bit为0,关闭GPIO功能;(缺省为0)

bit[15:8]P5组GPIO控制,对应bit为1,开启GPIO功能;对应bit为0,关闭GPIO功能;(缺省为0)

bit[23:16]P6组GPIO控制,对应bit为1,开启GPIO功能;对应bit为0,关闭GPIO功能;(缺省为0)

bit[31:24]P7组GPIO控制,对应bit为1,开启GPIO功能;对应bit为0,关闭GPIO功能;(缺省为0)

gpio_first[2]

bit[7:0] :  P8组GPIO控制,对应bit为1,开启GPIO功能;对应bit为0,关闭GPIO功能;

 

gpio_oe[0]

bit[7:0] :   P0组输入输出控制,对应bit为1,输出功能;对应bit为0,输入功能;(缺省为0)

bit[15:8] :  P1组输入输出控制,对应bit为1,输出功能;对应bit为0,输入功能;(缺省为0)

bit[23:16] :  P0组mask ; 对应bit为1,P0组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

bit[31:24] :  P1组mask ; 对应bit为1,P0组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

 

gpio_oe[1]

bit[7:0] :   P2组输入输出控制,对应bit为1,输出功能;对应bit为0,输入功能;(缺省为0)

bit[15:8] :  P3组输入输出控制,对应bit为1,输出功能;对应bit为0,输入功能;(缺省为0)

bit[23:16] :  P2组mask ; 对应bit为1,P2组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

bit[31:24] :  P3组mask ; 对应bit为1,P3组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

 

gpio_oe[2]

bit[7:0] :   P4组输入输出控制,对应bit为1,输出功能;对应bit为0,输入功能;(缺省为0)

bit[15:8] :  P5组输入输出控制,对应bit为1,输出功能;对应bit为0,输入功能;(缺省为0)

bit[23:16] :  P4组mask ; 对应bit为1,P4组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

bit[31:24] :  P5组mask ; 对应bit为1,P5组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

 

gpio_oe[3]

bit[7:0] :   P6组输入输出控制,对应bit为1,输出功能;对应bit为0,输入功能;(缺省为0)

bit[15:8] :  P7组输入输出控制,对应bit为1,输出功能;对应bit为0,输入功能;(缺省为0)

bit[23:16] :  P6组mask ; 对应bit为1,P4组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

bit[31:24] :  P7组mask ; 对应bit为1,P5组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

 

gpio_oe[4]

bit[7:0] :   P8组输入输出控制,对应bit为1,输出功能;对应bit为0,输入功能;(缺省为0)

bit[15:8] :  保留

bit[23:16] :  P8组mask ; 对应bit为1,P8组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

bit[31:24] :  保留

 

gpio_out[0]

bit[7:0] :   P0组输出控制,对应bit为1,输出1;对应bit为0,输出0;

bit[15:8] :  P1组输出控制,对应bit为1,输出1;对应bit为0,输出0;

bit[23:16] :  P0组mask ; 对应bit为1,P0组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

bit[31:24] :  P1组mask ; 对应bit为1,P0组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

 

gpio_out[1]

bit[7:0] :   P2组输出控制,对应bit为1,输出1;对应bit为0,输出0;

bit[15:8] :  P3组输出控制,对应bit为1,输出1;对应bit为0,输出0;

bit[23:16] :  P2组mask ; 对应bit为1,P2组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

bit[31:24] :  P3组mask ; 对应bit为1,P3组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

 

gpio_out[2]

bit[7:0] :   P4组输出控制,对应bit为1,输出1;对应bit为0,输出0;

bit[15:8] :  P5组输出控制,对应bit为1,输出1;对应bit为0,输出0;

bit[23:16] :  P4组mask ; 对应bit为1,P4组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

bit[31:24] :  P5组mask ; 对应bit为1,P5组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

 

gpio_out[3]

bit[7:0] :   P6组输出控制,对应bit为1,输出1;对应bit为0,输出0;

bit[15:8] :  P7组输出控制,对应bit为1,输出1;对应bit为0,输出0;

bit[23:16] :  P6组mask ; 对应bit为1,P6组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

bit[31:24] :  P7组mask ; 对应bit为1,P7组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

 

gpio_out[4]

bit[7:0] :   P8组输出控制,对应bit为1,输出1;对应bit为0,输出0;

bit[15:8] :  保留;

bit[23:16] :  P8组mask ; 对应bit为1,P8组对应bit可写;对应bit为0,P0组对应bit禁写;(缺省为0)

bit[31:24] :  保留

 安装目录\SP7021\workspace\sp7021\include 文件夹下的regmap_q628.h定义了相关寄存器,如下图红色

struct pad_ctl_regs {

        unsigned int reserved[20];         // 101.0

        unsigned int spi_flash_sftpad_ctl; // 101.20

        unsigned int spi_nd_sftpad_ctl;    // 101.21

        unsigned int reserved_21[3];       // 101.22

        unsigned int gpio_first[4];        // 101.25

        unsigned int reserved_29[3];       // 101.29

};

#define PAD_CTL_REG ((volatile struct pad_ctl_regs *)RF_GRP(101, 0))

 

struct gpioxt1_regs {

    unsigned int gpio_ctl_sel[8];

    unsigned int gpio_oe[8];

    unsigned int gpio_out[8];

    unsigned int gpio_in[6];

    unsigned int reserved[2];

};

#define GPIOXT1_REG ((volatile struct gpioxt1_regs *)RF_GRP(6, 0))

通用GPIO输入输出口控制实验需要安装目录\SP7021\example\gpio下的3个文件,如下:

main.c;timer.c;gpio.h,分别放到如下的路径中,同名文件覆盖

 1) 安装目录 \SP7021\workspace\sp7021\ 文件夹下的main.c

2) 安装目录 \SP7021\workspace\sp7021\testapi\util 文件夹下的timer.c

3) 安装目录 \SP7021\workspace\sp7021\ include\util文件夹下的gpio.h

 main.c

int main(void)

{

    printf("Build @%s, %s\n", __DATE__, __TIME__);

    hw_init();

    sys_init();

    pin_mux();

    gpio_ctl();

    timer_test_init();/*interrupt test api */

    sp_interrupt_setup(); /* interrupt manager module init */

    while(1);

}

对比定时器中断控制实验,增加了pin_mux()和gpio_ctl()两个函数,用来完成GPIO的配置及初始化操作,如下讲解。

 void pin_mux()

{

       PAD_CTL_REG->gpio_first[0] = 0xffffffff; //enable GPIO pinmux P0--P3

       PAD_CTL_REG->gpio_first[1] = 0xffffffff;//enable GPIO pinmux  P4--P7

       PAD_CTL_REG->gpio_first[2] = 0xff;//enable GPIO pinmux P8

}

配置P0组到P8组共72个IO口为GPIO 功能

 void gpio_ctl()

{

    GPIOXT1_REG->gpio_oe[0]= RF_MASK_V(0xffff,0xffff);

    GPIOXT1_REG->gpio_oe[1]= RF_MASK_V(0xffff,0xffff);

    GPIOXT1_REG->gpio_oe[2]= RF_MASK_V(0xffff,0xffff);

    GPIOXT1_REG->gpio_oe[3]= RF_MASK_V(0xffff,0xffff);

    GPIOXT1_REG->gpio_oe[4]= RF_MASK_V(0x00ff,0xffff);

    GPIO_P5_CLR;

}

配置P0组到P8组共72个IO口为输出功能

 timer.c

对比定时器中断控制实验,只修改了void timer3_callback(void),如下讲解

void timer3_callback(void)

{

         if(toggle==0)

    {

        GPIO_P0_SET;

         toggle++;

        printf("@toggle++\n");

    }

    else

    {

        GPIO_P0_CLR;

        toggle--;

        printf("@toggle--\n");

    }

 }

每次定时器1S中断后,GPIO P0 组的8个端口交替输出0和1,即产生周期为1S的方波,可在示波器上观察到对应波形

 

gpio.h

#ifndef __GPIO_H__

#define __GPIO_H__

 //#define RF_MASK_V(_mask, _val)       (((_mask) << 16) | (_val))

//#define RF_MASK_V_SET(_mask)         (((_mask) << 16) | (_mask))

//#define RF_MASK_V_CLR(_mask)         (((_mask) << 16) | 0)

/////////////////PO ////////////////////////////////////////////////

#define GPIO_P0_SET  GPIOXT1_REG->gpio_out[0] = RF_MASK_V (0xff,0xff)

#define GPIO_P0_CLR  GPIOXT1_REG->gpio_out[0] = RF_MASK_V (0xff,0)

 #define GPIO_P0_00_SET  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_SET(1<<0)

#define GPIO_P0_01_SET  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_SET(1<<1)

#define GPIO_P0_02_SET  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_SET(1<<2)

#define GPIO_P0_03_SET  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_SET(1<<3)

#define GPIO_P0_04_SET  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_SET(1<<4)

#define GPIO_P0_05_SET  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_SET(1<<5)

#define GPIO_P0_06_SET  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_SET(1<<6)

#define GPIO_P0_07_SET  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_SET(1<<7)

 

#define GPIO_P0_00_CLR  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_CLR(1<<0)

#define GPIO_P0_01_CLR  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_CLR(1<<1)

#define GPIO_P0_02_CLR  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_CLR(1<<2)

#define GPIO_P0_03_CLR  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_CLR(1<<3)

#define GPIO_P0_04_CLR  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_CLR(1<<4)

#define GPIO_P0_05_CLR  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_CLR(1<<5)

#define GPIO_P0_06_CLR  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_CLR(1<<6)

#define GPIO_P0_07_CLR  GPIOXT1_REG->gpio_out[0] = RF_MASK_V_CLR(1<<7)

/////////////////P8 ////////////////////////////////////////////////

#define GPIO_P8_SET  GPIOXT1_REG->gpio_out[4] = RF_MASK_V (0xff,0xff)

#define GPIO_P8_CLR  GPIOXT1_REG->gpio_out[4] = RF_MASK_V (0xff,0)

             

#define GPIO_P8_00_SET  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_SET(1<<0)

#define GPIO_P8_01_SET  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_SET(1<<1)

#define GPIO_P8_02_SET  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_SET(1<<2)

#define GPIO_P8_03_SET  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_SET(1<<3)

#define GPIO_P8_04_SET  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_SET(1<<4)

#define GPIO_P8_05_SET  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_SET(1<<5)

#define GPIO_P8_06_SET  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_SET(1<<6)

#define GPIO_P8_07_SET  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_SET(1<<7)

             

#define GPIO_P8_00_CLR  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_CLR(1<<0)

#define GPIO_P8_01_CLR  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_CLR(1<<1)

#define GPIO_P8_02_CLR  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_CLR(1<<2)

#define GPIO_P8_03_CLR  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_CLR(1<<3)

#define GPIO_P8_04_CLR  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_CLR(1<<4)

#define GPIO_P8_05_CLR  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_CLR(1<<5)

#define GPIO_P8_06_CLR  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_CLR(1<<6)

#define GPIO_P8_07_CLR  GPIOXT1_REG->gpio_out[4] = RF_MASK_V_CLR(1<<7)

#endif // __GPIO_H__

定义GPIO 相关的宏操作,在timer.c 中的void timer3_callback(void)函数中被调用

在Plus1 IDE环境中compile后

下载到平台,在terminal窗口看到如下信息

同时将示波器探头接到P0口位置,可在示波器上观察到周期为1 second的方波波形

  • No labels