📄 10.1.c
字号:
/****************************************************************
**描述:利用GP定时器1在GPIOF8引脚上产生方波,令一个贴片LED闪烁**
**系统时钟150M,高速外设时钟25M,128分频后定时器周期为5.12us****
****************************************************************/
#include "DSP28_Device.h"
#define strb GpioDataRegs.GPBDAT.bit.GPIOB10
#define ad0 GpioDataRegs.GPBDAT.bit.GPIOB12
#define ad1 GpioDataRegs.GPBDAT.bit.GPIOB13
#define ad2 GpioDataRegs.GPBDAT.bit.GPIOB14
#define rw GpioDataRegs.GPBDAT.bit.GPIOB11
#define RDY GpioDataRegs.GPADAT.bit.GPIOA1
unsigned int kk1,kk2,kk3,kk4,i;
unsigned int reg_8980[8]={0,0,0,0,0,0,0,0};
unsigned int tdo_8980[4]={0,0,0,0},counter_8980[4]={0,0,0,0};
unsigned int tdi_8980[10]={0,0,0,0,0,0,0,0,0,0};
unsigned int IntNum,BF,Key_Data,KeyV; //XINT1中使用的变量
unsigned int key_code,Key_UP,key_index; //Decode()中使用的变量
unsigned int UnShifted[18][2] = {
0x70, '0', //
0x69, '1',
0x72, '2',
0x7A, '3',
0x6B, '4',
0x73, '5',
0x74, '6',
0x6C, '7',
0x75, '8',
0x7D, '9',
0x5a,'E', //Enter
0x66,'B', //Bksp
0x71, '.',
0x79, '.',};
interrupt void X_INT1_isr(void);
void Decode(unsigned int);
interrupt void eva_timer1_isr(void);
void IC8980_set();
void readall_8980();
void check_RDY();
void read_status();
void DELAY_MY(unsigned int);
void EVA_Timer1()
{
EvaRegs.GPTCONA.all = 0; // 初始化 EVA Timer 1
EvaRegs.T1PR = 0x1; // 定时周期为5.12us*(T1PR+1)=10us
EvaRegs.EVAIMRA.bit.T1PINT = 1; //使能定时器1的周期中断
EvaRegs.EVAIFRA.bit.T1PINT = 1; //写1清除定时器1的周期中断标志
EvaRegs.T1CNT = 0x0000;
EvaRegs.T1CON.all = 0x1040; //连续增计数,不分频,打开定时器 0001 0000 0100 0000
}
void write_8980(int k)
{
int k1;
EALLOW;
GpioMuxRegs.GPBMUX.all=0x00; //把GPIOB设置为一般I/O口,输出
GpioMuxRegs.GPBDIR.all=0xFFFF; //输出
EDIS;
k1=(GpioDataRegs.GPBDAT.all & 0xff00)|(k&0x00ff);
GpioDataRegs.GPBDAT.all=k1;
}
int read_8980(void)
{
int k1;
EALLOW;
GpioMuxRegs.GPBMUX.all=0x00; //把GPIOB设置为一般I/O口,输出
GpioMuxRegs.GPBDIR.all=0xFF00; //输入
EDIS;
k1=(GpioDataRegs.GPBDAT.all & 0x00ff);
return k1;
}
void main(void)
{
InitSysCtrl(); //初始化系统控制寄存器, 时钟频率50M
EALLOW;
SysCtrlRegs.HISPCP.all = 0x0003;//高速时钟的工作频率=25M
EDIS;
DINT; //关闭总中断,清除中断标志
IER = 0x0000; //关闭外围中断
IFR = 0x0000; //清中断标志
InitPieCtrl(); //初始化PIE控制寄存器
InitPieVectTable();
EVA_Timer1();
IntNum=BF=Key_Data=KeyV=0; //XINT1中使用的变量
key_code=Key_UP=key_index=0;
EALLOW;
XIntruptRegs.XINT1CR.bit.POLARITY=0;
XIntruptRegs.XINT1CR.bit.ENABLE=0x1; //使能XINT1中断
GpioMuxRegs.GPDMUX.bit.T1CTRIP_PDPA_GPIOD0=0; //把GPIOD0设置为一般I/O口,输出
GpioMuxRegs.GPDDIR.bit.GPIOD0=1; //输出
GpioMuxRegs.GPDMUX.bit.T2CTRIP_SOCA_GPIOD1=0; //把GPIOD1设置为一般I/O口,输出
GpioMuxRegs.GPDDIR.bit.GPIOD1=1; //输出
GpioMuxRegs.GPAMUX.bit.T2PWM_GPIOA7=0; //IO
GpioMuxRegs.GPADIR.bit.GPIOA7=0; //输入
///////时钟输出
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=0; //IO A0
GpioMuxRegs.GPADIR.bit.GPIOA0=1; //A0 输出
GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=0; //IOA1 8980 RAELY信号
GpioMuxRegs.GPADIR.bit.GPIOA1=0; //输入
GpioMuxRegs.GPBMUX.all=0; //IO
GpioMuxRegs.GPBDIR.all=0xffff; //输出
GpioDataRegs.GPBDAT.bit.GPIOB15=1; //禁止输出
GpioDataRegs.GPBDAT.bit.GPIOB8=0;
GpioDataRegs.GPBDAT.bit.GPIOB8=0;
GpioDataRegs.GPBDAT.bit.GPIOB8=1; //复位
PieVectTable.XINT1= &X_INT1_isr; //中断服务程序入口地址放入中断向量表
PieVectTable.T1PINT = &eva_timer1_isr; //中断服务程序入口地址放入中断向量表
EDIS;
//依次使能各级中断:外设中相应中断位->PIE控制器->CPU
PieCtrlRegs.PIEIER1.bit.INTx4=1; //XINT1使能位于PIE第1组第4个,将其使能
IER|= M_INT1; //PIE第1组对应于CPU的可屏蔽中断1(INT1),将其使能
PieCtrlRegs.PIEIER2.all = M_INT4; //GP定时器1使能位于PIE第2组第4个,将其使能
IER |= M_INT2; //PIE第2组对应于CPU的可屏蔽中断2(INT2),将其使能
EINT; //开总中断
IC8980_set();
//GpioDataRegs.GPBDAT.bit.GPIOB15=0; // TOE 输出使能
while(1)
{
//strb=1;
//check_RYD();
//ad0=0; ad1=0; ad2=1; //写TDO
//rw=0;
//strb=0; //strb:闸门信号
//write_8980(0xf0); //设置8980,
//strb=1;
if(BF == 1)
{
if(KeyV==105)
{
GpioDataRegs.GPDDAT.bit.GPIOD0=GpioDataRegs.GPDDAT.bit.GPIOD0^1;
KeyV=0;
}
if(KeyV==114)
{
GpioDataRegs.GPDDAT.bit.GPIOD1=GpioDataRegs.GPDDAT.bit.GPIOD1^1;
KeyV=0;
}
BF =0;
} //if(BF == 1)
} // while(1)
}
interrupt void X_INT1_isr(void)
{
//GpioDataRegs.GPDDAT.bit.GPIOD0=GpioDataRegs.GPDDAT.bit.GPIOD0^1; //产生方波
Key_Data=GpioDataRegs.GPADAT.bit.GPIOA7;
if ((IntNum >=1) && (IntNum <=8))
{
KeyV = KeyV >> 1;//因键盘数据是低>>高,结合上一句所以右移一位
if (Key_Data) KeyV = KeyV | 0x8000;//当键盘数据线为1时为1到最高位
}
IntNum=IntNum+1;
//while (!Key_CLK);//等待PS/2CLK拉高
if (IntNum >= 11)
{
IntNum = 0;//当中断10次后表示一帧数据收完,清变量准备下一次接收
BF = 1;//标识有字符输入完了
KeyV= KeyV >> 8;
//EA = 0;//关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)
}
PieCtrlRegs. PIEACK.all = 0x0001; //清零 PIEACK中的第1组中断对应位,PIEACK_GROUP1=1
}
interrupt void eva_timer1_isr(void)
{
GpioDataRegs.GPADAT.bit.GPIOA0=GpioDataRegs.GPADAT.bit.GPIOA0^1; //产生方波
EvaRegs.EVAIMRA.bit.T1PINT = 1; //使能定时器1的周期中断
EvaRegs.EVAIFRA.bit.T1PINT = 1; //写1清除定时器1的周期中断标志
PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; //清零 PIEACK中的第2组中断对应位
}
void Decode(unsigned int ScanCode) //判断断码
{
unsigned int TempCyc;
if (!Key_UP)//当键盘松开时
{
switch (ScanCode)
{
case 0xF0 :// 当收到0xF0,Key_UP置1表示断码开始
Key_UP = 1;
break;
default:
for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++);//查表
if (UnShifted[TempCyc][0] == ScanCode) {key_code=UnShifted[TempCyc][1]; key_index=1;} //返回,
//显示
break;
} //switch (ScanCode)
} //if (!Key_UP)//当键盘松开时
else
{
Key_UP = 0;
}
BF = 0; //标识字符处理完了
}
void IC8980_set()
{
EALLOW;
GpioMuxRegs.GPBMUX.all=0x00; //把GPIOB设置为一般I/O口,输出
GpioMuxRegs.GPBDIR.all=0xFFFF; //输出
EDIS;
check_RDY();
strb=1;
//check_RYD();
ad2=0; ad1=0;ad0=0; //写config_A
rw=0;
strb=0; //strb:闸门信号
write_8980(0x01); //设置8980,
strb=1;
check_RDY();
ad2=0; ad1=0;ad0=1; //写config_B
rw=0;
strb=0;
write_8980(0x80); //clk=clkin 而默认为0x80
strb=1;
//counter
check_RDY();
ad2=1; ad1=1; ad0=0;
rw=0;
strb=0;
write_8980(24); //least
strb=1;
check_RDY();
strb=0;
write_8980(0x00);
strb=1;
check_RDY();
strb=0;
write_8980(0x00);
strb=1;
check_RDY();
strb=0;
write_8980(0x00); //
strb=1;
GpioDataRegs.GPBDAT.bit.GPIOB15=0;
check_RDY();
strb=1; //command
ad2=0; ad1=1; ad0=1;
rw=0;
strb=0;
write_8980(0x09); //
strb=1;
check_RDY();
read_status(); if((reg_8980[2] & 0x40) !=0){DELAY_MY(40000);}
//TDO
ad2=1; ad1=0; ad0=0;
rw=0;
strb=0;
strb=0;
write_8980(0x02); //ff
strb=1;
strb=1;
check_RDY();
read_status(); if((reg_8980[2] & 0x40) !=0){DELAY_MY(40000);}
ad2=1; ad1=0; ad0=0;
rw=0;
strb=0;
write_8980(0xbb); //bb
strb=1;
check_RDY();
read_status(); if((reg_8980[2] & 0x40) !=0){DELAY_MY(40000);}
ad2=1; ad1=0; ad0=0;
rw=0;
strb=0;
write_8980(0xcc); //cc
strb=1;
check_RDY();
read_status(); if((reg_8980[2] & 0x40) !=0){DELAY_MY(40000);}
ad2=1; ad1=0; ad0=0;
rw=0;
strb=0;
write_8980(0xff); //aa
strb=1;
for(i=0;i<40000;i++)
{
strb=1;strb=1;strb=1;strb=1;
strb=1;strb=1;strb=1;strb=1;
strb=1;strb=1;strb=1;strb=1;
strb=1;strb=1;strb=1;strb=1;
strb=1;strb=1;strb=1;strb=1;
strb=1;strb=1;strb=1;strb=1;
strb=1;strb=1;strb=1;strb=1;
strb=1;strb=1;strb=1;strb=1;
strb=1;strb=1;strb=1;strb=1;
strb=1;strb=1;strb=1;strb=1;
strb=1;strb=1;strb=1;strb=1;
strb=1;strb=1;strb=1;strb=1;
}
/////////////读 tdi 调试时使用
EALLOW;
GpioMuxRegs.GPBMUX.all=0x00;
GpioMuxRegs.GPBDIR.all=0xFF00;
EDIS;
check_RDY();
ad2=0; ad1=1; ad0=0; //status
rw=1;
strb=0;
reg_8980[2]=read_8980();
strb=1;
if((reg_8980[2] & 0x80)==0x80)
{
check_RDY();
ad2=1; ad1=0; ad0=1; //tdi
strb=0;
tdi_8980[0]=read_8980();
strb=1;}
check_RDY();
ad2=0; ad1=1; ad0=0; //status
rw=1;
strb=0;
reg_8980[2]=read_8980();
strb=1;
if((reg_8980[2] & 0x80)==0x80)
{
check_RDY();
ad2=1; ad1=0; ad0=1; //tdi
strb=0;
tdi_8980[1]=read_8980();
strb=1;}
check_RDY();
ad2=0; ad1=1; ad0=0; //status
rw=1;
strb=0;
reg_8980[2]=read_8980();
strb=1;
if((reg_8980[2] & 0x80)==0x80)
{
check_RDY();
ad2=1; ad1=0; ad0=1; //tdi
strb=0;
tdi_8980[2]=read_8980();
strb=1;}
check_RDY();
strb=0;
reg_8980[2]=read_8980();
strb=1;
if((reg_8980[2] & 0x80)==0x80)
{
check_RDY();
ad2=1; ad1=0; ad0=1; //tdi
strb=0;
tdi_8980[3]=read_8980();
strb=1;}
check_RDY();
ad2=0; ad1=1; ad0=0; //status
rw=1;
strb=0;
reg_8980[2]=read_8980();
strb=1;
if((reg_8980[2] & 0x80)==0x80)
{
check_RDY();
ad2=1; ad1=0; ad0=1; //tdi
strb=0;
tdi_8980[4]=read_8980();
strb=1;}
check_RDY();
ad2=0; ad1=1; ad0=0; //status
rw=1;
strb=0;
reg_8980[2]=read_8980();
strb=1;
if((reg_8980[2] & 0x80)==0x80)
{
check_RDY();
ad2=1; ad1=0; ad0=1; //tdi
strb=0;
tdi_8980[5]=read_8980();
strb=1;}
//strb=0;
//reg_8980[5]=read_8980();
//strb=1;
strb=1;
readall_8980();
strb=1;
for(i=0;i<40000;i++)
{
strb=1;
}
readall_8980();
strb=1;
}
void readall_8980()
{
EALLOW;
GpioMuxRegs.GPBMUX.all=0x00;
GpioMuxRegs.GPBDIR.all=0xFF00;
EDIS;
check_RDY();
ad2=0; ad1=0; ad0=0; //A
rw=1;
strb=0;
reg_8980[0]=read_8980();
strb=1;
check_RDY();
ad2=0; ad1=0; ad0=1; //B
rw=1;
strb=0;
reg_8980[1]=read_8980();
strb=1;
check_RDY();
ad2=0; ad1=1; ad0=0; //status
rw=1;
strb=0;
reg_8980[2]=read_8980();
strb=1;
check_RDY();
ad2=0; ad1=1; ad0=1; //command
rw=1;
strb=0;
reg_8980[3]=read_8980();
strb=1;
check_RDY();
ad2=1; ad1=1; ad0=1; //discrete control
rw=1;
strb=0;
reg_8980[7]=read_8980();
strb=1;
//读tdo
check_RDY();
ad2=1; ad1=0; ad0=0; //tdo
rw=1;
strb=0;
tdo_8980[0]=read_8980();
strb=1;
//读counter
check_RDY();
ad2=1; ad1=1; ad0=0; //counter
rw=1;
strb=0;
counter_8980[0]=read_8980();
strb=1;
check_RDY();
strb=0;
counter_8980[1]=read_8980();
strb=1;
check_RDY();
strb=0;
counter_8980[2]=read_8980();
strb=1;
check_RDY();
strb=0;
counter_8980[3]=read_8980();
strb=1;
//变为输出变量
EALLOW;
GpioMuxRegs.GPBMUX.all=0x00;
GpioMuxRegs.GPBDIR.all=0xFFFF;
EDIS;
}
void check_RDY()
{
unsigned int temp1;
temp1=RDY;
while(temp1!=1){temp1=RDY;}
}
void read_status()
{
unsigned int temp_r;
temp_r=GpioMuxRegs.GPBDIR.all;
EALLOW;
GpioMuxRegs.GPBDIR.all=0xFF00;
EDIS;
check_RDY();
ad2=0; ad1=1; ad0=0; //status
rw=1;
strb=0;
reg_8980[2]=read_8980();
strb=1;
EALLOW;
GpioMuxRegs.GPBDIR.all=temp_r;
EDIS;
}
void DELAY_MY(unsigned int kk)
{
unsigned int ii;
for(ii=0;ii<kk;ii++)
{
strb=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -