本实验利用前面介绍的定时器中断控制实验,完成通用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 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 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的方波波形
...