介绍一下电路板
有数据寄存器和控制寄存器两类组成
GPAQSEL控制着噪声的滤波和采样周期的限制
GPAMUX控制着功能的复用
GPADIR控制着输入与输出
GPAPUD可以控制它的上拉翻转
GPADAT 控制一组引脚的置高或置低 或读取引脚数据
GPASET、GPACLEAR 强制制高和制低的指令
GPATOGGLE 强制翻转指令
GPAMUX1=00 普通的I/O口功能、GPAMUX1=01 EPWM功能 GPAMUX1=10 在O6和O7是 同步脉冲信号、SCI-A 信号
GPAMUX1=11 O1、O3 ADC 转换启动、O5捕获信号 O6同步脉冲信号 还有其他组可查阅手册的GPIOA MUX选择
通过这个表可以查看不同的GPIO MUX配置来实现不同的外设功能
使用采样窗口(GPxQSEL1/2=0,1 和 1,0)进行确认:在这种模式下,输入信号在与系 统时钟(SYSCLKOUT)同步后,在允许更改输入之前,通过指定的周期数进行确认。
采样周期由 GPxCTRL 寄存器中的 QUALPRD 位指定,可配置为 8 个信号组。它指定用于对
DSC2802x-DS-2021 年 1 月-修订-2021 年 11 月 62 / 79 输入信号进行采样的 SYSCLKOUT 周期的倍数。采样窗口为 3 个采样或 6 个采样宽,只有 当所有采样相同(所有 0 或所有 1)时,输出才会更改,如图 6-42 所示(对于 6 采样 模式)。
无同步(GPxQSEL1/2=1,1):此模式用于不需要同步的外设(同步在外设内执行)。 由于设备上需要多级复用,可能存在外围输入信号可以映射到多于一个 GPIO 管脚的情 况。另外,当没有选择输入信号时,根据外围设备的不同,输入信号将默认为 0 或 1 状态。
比如接flash或者接一些EEROM的不同步信号 外部器件传播速率慢,而内部的是传输速度很快的一个功能呢,只能是通过无同步去实现。
包括CPU和其它外设的寄存器起始地址等信息,代码直到127行
中断服务函数,开启与关闭。还有包括中断的一些格式
#include "f2802x_examples.h"
通过配置,三个寄存器
GPAMUX1 0xD800 GPIO A MUX 1 寄存器(GPIO0 到 15)
GPADIR 0xD824 GPIOA 方向寄存器(GPIO0 到 31)
GPAPUD 0xD830 GPIO A 上拉禁用寄存器(GPIO0 到 31)
#include "dsc_config.h"
/******************************************************************
*函数名:void InitKEY()
*参 数:无
*返回值:无
*作 用:初始化独立IO口按键 SW-SPST
******************************************************************/
void InitKEY(void)
{
/*允许访问受保护的空间*/
EALLOW;
/*将GPIO12配置为数字IO*/
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;
/* //使能GPIO12内部上拉*/
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;
/*将GPIO12配置为输入*/
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
/*禁止访问受保护的空间*/
EDIS;
}
/******************************************************************
*函数名:void InitLED()
*参 数:无
*返回值:无
*作 用:初始化LED
******************************************************************/
void InitLED(void)
{
/*允许访问受保护的空间*/
EALLOW;
/*将GPIO16配置为数字IO*/
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;
/*将GPIO6配置为输出*/
GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
/*将GPIO7配置为数字IO*/
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0;
/*将GPIO7配置为输出*/
GpioCtrlRegs.GPADIR.bit.GPIO7 = 1;
/*禁止访问受保护的空间*/
EDIS;
}
通过跳转可以看到 两个定义的
#define EALLOW asm(“csrsi 0x7C1, 0x01”)
#define EDIS asm(“csrci 0x7C1, 0x01”)
DSP为了提高安全性能,将很多关键寄存器作了保护处理。允许DSP指令对关键寄存器进行操作。这些关键寄存器包括:器件仿真寄存器、FLASH寄存器、CSM寄存器、PIE矢量表、系统控制寄存器、GPIOMux寄存器等等。
DSP由于在上电复位之后,状态寄存器基本上都是清零,而这样的状态下正是上述特殊寄存器禁止改写的状态。为了能够对这些特殊寄存器进行初始化,所以在对上述特殊寄存器进行改写之前,一定要执行(“EALLOW”)在设置完寄存器之后,一定要注意执行(“EDIS”),来防止杂散代码或指针破坏寄存器内容。
IntOsc1Sel();//选择内部振荡器1作为时钟源(默认),关闭所有未使用的时钟
InitPll(DSP28_PLLCR,DSP28_DIVSEL);//设置倍频与分频信号
void IntOsc1Sel (void) {
EALLOW;
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL=0; // Clk Src = INTOSC1
SysCtrlRegs.CLKCTL.bit.XCLKINOFF=1; // Turn off XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF=1; // Turn off XTALOSC
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF=1; // Turn off INTOSC2
EDIS;
}
GPADAT 0xD838 GPIO A 数据寄存器(GPIO0 到 31)
GPADAT 0xD838 GPIO A 数据寄存器(GPIO0 到 31)
GPACLEAR 0xD848 GPIO A 数据清除寄存器(GPIO0 到 31)
GPATOGGLE 0xD84C GPIO A 数据翻转寄存器(GPIO0 到 31)
#include "dsc_config.h"
#include
#include "IQmathLib.h"
extern void InitKEY(void);
extern void InitLED(void);
int main(void)
{
uint16_t cnt = 0;
/*初始化系统控制:PLL,WatchDog,使能外设时钟*/
InitSysCtrl();
/*将PIE控制寄存器初始化为默认状态,该状态禁止所有PIE中断并清除所有标志*/
InitPieCtrl();
/*禁止CPU中断并清除所有中断标志*/
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE向量表,为PIE向量表中的所有中断向量配置对应向量的入口地址*/
InitPieVectTable();
/*初始化KEY、LED*/
InitKEY();
InitLED();
while(1)
{
/*按键按下*/
if(GpioDataRegs.GPADAT.bit.GPIO12 == 0)
{
/*D400亮*/
GpioDataRegs.GPACLEAR.bit.GPIO7 = 1;
}
else
{
/*松开按键D400灭*/
GpioDataRegs.GPASET.bit.GPIO7 = 1;
}
if(cnt == 500)
{
cnt = 0;
/*D401一直闪烁*/
GpioDataRegs.GPATOGGLE.bit.GPIO6 = 1;
}
else
{
cnt++;
DELAY_US(1000);
}
}
return 0;
}