弄了两周终于把28335的启动流程、寄存器及中断向量表的映射方法、内存的划分等有了一个全面的了解,今天看到久违的LED灯的闪烁,顿扫阴霾。特在此总结下28335GPIO及外部中断配置介绍。其实对于一个微控制器,只要能够独立实现这两个功能,也算是入门了。
一、GPIO口介绍
外界二进制信息(数字量)要被CPU处理,要给存储器存放,就需要外界信息源与两者之间的交换接口,这样的交换接口若用来进行通用目的数字量的输入输出,就被称为通用数字量输入/输出接口,简称GPIO。F28335 DSP有多达88个GPIO口,对应着芯片引出的88个引脚,随着芯片的封装与尺寸的确定,引脚数目是有限的,所以这88个引脚多数都是功能复用的,即可以灵活配置为输入引脚,也可以灵活配置为输出引脚,即可以作为通用I/O引脚,也可以作为特殊功能口(如SCI、SPI、ECAN等),非常灵活,用户根据需要,可以通过GPIO MUX(输入输出多路选择器,复用开关)寄存器来进行相关配置。
F28335DSP将这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、可以通过GPxDAT寄存器独立读/写I/O信号;(操作较慢,需要加延时(取反不需),下面的方法不需加延时)
2、利用GPxSET寄存器写1(写0无效)对I/O口进行置位
3、利用GPxCLEAR寄存器写1(写0无效)对I/O口进行清零;
4、利用GPxTOOGLE寄存器置1后(写0无效)来将I/O输出电平翻转,原来高电平变成低电平,原来低电平则变成高电平。
对GPIO模块的设置主要通过三类寄存器来完成(TI的库文件把GPIO的寄存器分成三部分,实际的寄存器在这三类中),分别是:控制寄存器、数据寄存器、中断寄存器。(TI已经定义了三个这样的名字)
extern volatilestruct GPIO_CTRL_REGSGpioCtrlRegs;
externvolatilestruct GPIO_DATA_REGSGpioDataRegs;
extern volatile struct GPIO_INT_REGS GpioIntRegs;
想要操作一个外设,首先可以查看对应外设头文件最后定义的这几个结构体变量,其实就是对这几个结构体的赋值。然后查看对应结构体的元素,后面都有对应的说明,然后可层层查看包含的结构体及元素,后面的注释很容易理解相应的意思,然后根据需要配置即可。
例:GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; // GPIO2 = output
1、控制寄存器
//设置采样窗周期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进行外部中断设置;
另:采样频率:分为同步频率和异步频率
同步频率:当IO口作为普通IO时,对信号采样使用的是同步采样信号,SYSCLKOUT 或者SYSCLKOUT/n
异步频率:当IO口作为SCISPI eCAN I2C这样的外设外口时,不需要同步采样频率,外设本身就有异步的采样频率。
系统复位的时候,所有的管脚都是默认为输入状态,默认都是普通IO口,采样频率默认都为SYSCLKOUT。上拉电阻在复位后默认除了ePWM(GPIO0~GPIO11)外都是默认已经上拉。
采样次数:
采样窗口分3次和6次两种窗口,用来过滤噪声。采样窗口为3的间隔时间为2个采样周期,采样窗口为6的间隔时间为5个采样周期。
只有在这2或者5个采样周期内采集的信号完全一样才说明信号稳定,信号才会传递为DSP,依次来消除噪声。
(采样次数与采样频率根据实际要求配合使用)
GpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 2; // XINT2 Qual using 6 samples
GpioCtrlRegs.GPACTRL.bit.QUALPRD0 = 0x80; // Each sampling window is 128*SYSCLKOUT
GPIO的寄存器(A):
上面表格内容由TI转化为了下面的结构体:
struct GPIO_CTRL_REGS {
union GPACTRL_REG GPACTRL; // GPIO A ControlRegister (GPIO0 to 31)
union GPA1_REG GPAQSEL1; // GPIO A QualifierSelect 1 Register (GPIO0 to 15)
union GPA2_REG GPAQSEL2; // GPIO A QualifierSelect 2 Register (GPIO16 to 31)
union GPA1_REG GPAMUX1; // GPIO A Mux 1 Register(GPIO0 to 15)
union GPA2_REG GPAMUX2; // GPIO A Mux 2 Register(GPIO16 to 31)
union GPADAT_REG GPADIR; // GPIO A DirectionRegister (GPIO0 to 31)
union GPADAT_REG GPAPUD; // GPIO A Pull Up DisableRegister (GPIO0 to 31)
Uint32 rsvd1;
union GPBCTRL_REG GPBCTRL; // GPIO B ControlRegister (GPIO32 to 63)