F28335管脚分类+GPIO简介+点灯
- 前言
- 一、F28335管脚分类
- 二、GPIO简介
- 2.1 GPIO结构
- 2.1.1 GPIO 数据寄存器
- 2.2.2 GPIO 控制寄存器
- **GPxCTRL**:GPIO控制寄存器
- **GPxQSEL1/2**:GPIO量化控制寄存器1/2
- **GPxMUX1/2** :GPIO复用选择寄存器1/2
- **GPxDIR**:GPIO方向寄存器
- **GPAPUD**寄存器控制引脚是否上拉;
- 2.1.1 GPIO 中断源与低功耗唤醒源选择寄存器 _配合中断控制那块儿,还没学到
- 三、点灯
- 总结
前言
鲁迅曾经没说过:灯点亮就算入门
一、F28335管脚分类
详见F28335数据手册,2节Introduction.
F28335按其功能划分可分为以下几类(见2.1节 Signal Descriptions):
-
电源引脚-CPU AND I/O POWER PINS
包括:CPU and Logic Digital Power Pins、Digital I/O Power Pin、Digital Ground Pins -
晶振引脚-CLOCK
-
复位引脚-RESET
-
下载引脚-Jtag
-
BOOT引脚
F28335启动方式如下,由BOOT引脚(GPIO84~87)电平逻辑控制:
开发板BOOT脚电路如下图,GPIO84~87脚均上拉到3.3v,通过MODE F(Flash)启动。
- 普通引脚-GPIO AND PERIPHERAL SIGNALS
二、GPIO简介
详见 System Control and Interrupts ,.6节General-Purpose Input/Output (GPIO)
2.1 GPIO结构
GPIO时钟由SYSCLKOUT提供,其值等于CLKIN,在本例程中CLKIN为150MHz.
GPIO多路复用电路如下图所示(以GPIO0~27组为例):
2.1.1 GPIO 数据寄存器
- GPxDAT: 存储输入模式PIN上电平逻辑(0/1),输出模式锁存器值(0/1)。防止直接修改数据寄存器使得同组I/O数据发生错误,就是这个32位的数据寄存器同时储存一组(A/B/C)I/O的电平逻辑值,无论是输入的还是输出的,当读入数据寄存器值->修改值->再写入的过程中,由于数据修改不是原子操作,如果有个别I/O口设置为输入且在你修改值还未写入的时候电平逻辑发生变化,那么对于该I/O口对应的寄存器位来说,准备写入值与当前值发生错误,emmm,毕竟是输入模式,再去读就对应不上了。输出模式尽量通过修改SET,CLEAR,TOGGLE寄存器进行操作,单bit或多位操作,不影响其它脚。
- GPxSET:写1拉高
- GPxCLEAR:写1拉低
- GPxTOGGLE:写1翻转
A组I/O口的数据寄存器如下,每位对应一个I/O口:
struct GPIO_DATA_REGS {
...
union GPADAT_REG GPADAT; // GPIO Data Register (GPIO0 to 31)
union GPADAT_REG GPASET; // GPIO Data Set Register (GPIO0 to 31)
union GPADAT_REG GPACLEAR; // GPIO Data Clear Register (GPIO0 to 31)
union GPADAT_REG GPATOGGLE; // GPIO Data Toggle Register (GPIO0 to 31)
...
}
2.2.2 GPIO 控制寄存器
A组I/O口的控制寄存器如下:
struct GPIO_CTRL_REGS {
...
union GPACTRL_REG GPACTRL; // GPIO A Control Register (GPIO0 to 31)
union GPA1_REG GPAQSEL1; // GPIO A Qualifier Select 1 Register (GPIO0 to 15)
union GPA2_REG GPAQSEL2; // GPIO A Qualifier Select 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 Direction Register (GPIO0 to 31)
union GPADAT_REG GPAPUD; // GPIO A Pull Up Disable Register (GPIO0 to 31)
...
}
GPxCTRL:GPIO控制寄存器
控制采样周期,配合GPxQSEL1/2寄存器使用。GPxCTRL寄存器在配置为使用3或6个样本的窗口(具体是否使用采样窗口与进行3次或6次由GPxQSEL1/2控制)进行输入鉴定时指定输入引脚的采样周期。采样周期为SYSCLKOUT周期倍数,每个采样周期结束进行一次采样量化,具体采样量化数量在GPxQSEL 1/2寄存器指定。
例:GPACTRL寄存器如下,A组I/O口分为4部,根据Value控制采样周期,1~510*T(SYSCLKOUT)。
- 采样周期计算:
if:GPxCTRL[QUALPRDn] = 0 ,Sampling Period = 1 × TSYSCLKOUT;
if: GPxCTRL[QUALPRDn] ≠ 0 , Sampling Period = 2×GPXCTRL[QUALPRDn] × TSYSCLKOUT;
Where TSYSCLKOUT is the period in time of SYSCLKOUT;
例如:
GPxQSEL1/2:GPIO量化控制寄存器1/2
控制输入信号量化方式,下面这样。
三种输入量化方式:
- 异步输入:用于不需要输入同步或外设本身执行同步的外设。例如通信端口SCI, SPI, eCAN、I2C和ePWM。如果引脚用作普通GPIO,则异步选项无效。如果引脚配置为GPIO输入,并且选择异步选项,则量化默认为同步到SYSCLKOUT。
- 只同步到SYSCLKOUT
与SYSCLKOUT进行同步采样,信号进来后需等到同步时钟的到达再进行采样量化,信号量化可能导致会延时一个SYSCLKOUT周期; - 使用采样窗口量化
在这种模式下,信号首先被同步到系统时钟(SYSCLKOUT),然后在允许改变输入之前经过指定周期数的限定(在指定窗口时间内采样值不变),才认为该值可靠被采纳。下图显示了如何执行输入限定以消除不必要的噪声,需指定了两个参数:1)采样周期,2)采样的数量。
- 采样窗口时间计算:
3次采样:
If GPxCTRL[QUALPRDn] = 0, Window Width = 2× TSYSCLKOUT;
If GPxCTRL[QUALPRDn] ≠ 0, Window Width =2×2×GPXCTRL[QUALPRDn]×TSYSCLKOUT;
6次采样:
If GPxCTRL[QUALPRDn] = 0, Window Width = 5× TSYSCLKOUT;
If GPxCTRL[QUALPRDn] ≠ 0, Window Width =5×2×GPXCTRL[QUALPRDn]×TSYSCLKOUT;
以下面例子为例:
1.某个I/O口,GPxQSEL值为 1,0,使用采样窗口,6次采样;GPXCTRL[QUALPRDn] = 1。那么:
采样周期为:
Sampling Period = 2×GPXCTRL[QUALPRDn] × TSYSCLKOUT;
窗口时间为:
Window Width =5×2×GPxXCTRL[QUALPRDn]×TSYSCLKOUT;
2.比如我的开发板,TSYSCLKOUT=TCLKIN=1/(150*106)=6.67ns。
那么: Sampling Period =13.34ns; Window Width =67ns;
3.最大检测延时:由于输入信号需要与SYSCLKOUT作同步,可能需要一个额外的采样周期,来检测输入信号的变化,最大的检测延时:Td = Sampling Period + TSYSCLKOUT
整体如下图所示:
GPxMUX1/2 :GPIO复用选择寄存器1/2
控制I/O口复用功能,通常每个I/O口可作为普通GPIO口或可选的3个外设端口之一。
简略可查看GPIO外设复用选择矩阵,或者查看具体寄存器,其每两位控制一个I/O口,复位默认情况下为普通GPIO,即对应寄存器位为0,0;
例如数据手册中GPIOA的部分复用矩阵如下:
具体寄存器长这样,与上图GPIO15对应:
GPxDIR:GPIO方向寄存器
控制I/O口输入输出,写0输入,写1输出
GPAPUD寄存器控制引脚是否上拉;
-控制I/O是否上拉电阻
2.1.1 GPIO 中断源与低功耗唤醒源选择寄存器 _配合中断控制那块儿,还没学到
struct GPIO_INT_REGS {
union GPIOXINT_REG GPIOXINT1SEL; // XINT1 GPIO Input Selection
union GPIOXINT_REG GPIOXINT2SEL; // XINT2 GPIO Input Selection
union GPIOXINT_REG GPIOXNMISEL; // XNMI_Xint13 GPIO Input Selection
union GPIOXINT_REG GPIOXINT3SEL; // XINT3 GPIO Input Selection
union GPIOXINT_REG GPIOXINT4SEL; // XINT4 GPIO Input Selection
union GPIOXINT_REG GPIOXINT5SEL; // XINT5 GPIO Input Selection
union GPIOXINT_REG GPIOXINT6SEL; // XINT6 GPIO Input Selection
union GPIOXINT_REG GPIOXINT7SEL; // XINT7 GPIO Input Selection
union GPADAT_REG GPIOLPMSEL; // Low power modes GP I/O input select
};
三、点灯
- 在之前的基础上,新建.c .h文件,条件头文件路径
- 敲代码
.c
//LED初始化设置
void LED_Init(void)
{
EALLOW; //关闭写保护
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; //开启GPIO时钟
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0; //引脚设置为通用GPIO功能
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0;
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0; //设置GPIO有上拉电阻
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; //设置GPIO方向为输出
GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1;
GpioDataRegs.GPBSET.bit.GPIO60 = 1; //设置GPIO输出高电平
GpioDataRegs.GPBSET.bit.GPIO61 = 0; //设置GPIO输出低电平
EDIS; //开启写保护
}
void LED_Toggle(void)
{
GpioDataRegs.GPBTOGGLE.bit.GPIO60 = 1;
GpioDataRegs.GPBTOGGLE.bit.GPIO61 = 1;
}
TI的DSP为了提高安全性能,将很多关键寄存器作了保护处理。通过状态寄存器1(ST1)的位6设置与复位,来决定是否允许DSP指令对关键寄存器进行操作。
可在System Control and Interrupts文件中查看具体哪些寄存器有写保护;
其实每个寄存器下边都会有说明的 This register is EALLOW protected.
DSP由于在上电复位时,会清除EALLOW位,使能EALLOW保护。在受保护时,CPU对受保护寄存器的所有写操作都会被忽略,只允许CPU读、JTAG读和JTAG写操作。如果通过执行EALLOW指令设置了该位,则允许CPU自由地向受保护的寄存器写入。在修改寄存器之后,可以通过执行EDIS指令来清除EALLOW位来再次保护它们。
EALLOW;//关闭写保护
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0;
EDIS;//开启写保护
.h
#ifndef APP_LEDS_LEDS_H_
#define APP_LEDS_LEDS_H_
void delay(void);//随便写一个拉
void LED_Init(void);
void LED_Toggle(void);
#endif /* APP_LEDS_LEDS_H_ */
and main 巴拉巴拉
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "leds.h"
void main(void)
{
InitSysCtrl();
LED_Init();
for(;;)
{
delay();
LED_Toggle();
}
}
总结
点亮一个灯,啊不,两个