📄 gpio.c
字号:
#define ss 7
#include "DSP28_Device.h"
#include "stdlib.h"
interrupt void ISRTimer1(void) ;
interrupt void sci_rx_isr(void);
void delayus(unsigned long m);
void sci_init(void);
//全局变量定义;
char buffer[ss];
long width=10,t=20000;//width脉宽,t低电平的时间
unsigned long i=0;
int freq=50,k,h;//freq频率,h计数输入字符的位数
long count=0,count1=0;//计数脉冲个数,count1记忆功能
float t1;//中间计算周期用的
char a;//接收中断中读取第一个字符.
int zz=0;//停止标志位
int type=1;//极性选择
void main(void)
{
InitSysCtrl();
InitGpio();
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
InitPeripherals();
sci_init();
EALLOW;
PieVectTable.RXAINT = &sci_rx_isr;
PieVectTable.T1PINT = &ISRTimer1;
EDIS;
PieCtrl.PIEIER9.bit.INTx1=1;
IER|=0x100;
EINT;
ERTM;
EvaRegs.T1CON.all=EvaRegs.T1CON.all|0x0040; //启动Timer1
while(1)
{
//尚未开始工作,等待状态
if(count==0||zz==0)
{ zz=0;
EALLOW;
GpioDataRegs.GPACLEAR.all=0x0006;//清零
EDIS;
}
else if(type==0) //单极性
{count--;
EALLOW;
GpioDataRegs.GPACLEAR.all=0x0006;//gpio_2,gpio_3低电平
EDIS;
delayus(t1);
EALLOW;
GpioDataRegs.GPASET.all=0x0002;//gpio_2高电平
EDIS;
delayus(width);
}
else if(type==1) //双极性
{
//1
count--;
EALLOW;
GpioDataRegs.GPACLEAR.all=0x0006;//gpio_2,gpio_3低电平
EDIS;
delayus((t1/2-width));
//2
EALLOW;
GpioDataRegs.GPASET.all=0x0002;//gpio_2高电平
EDIS;
delayus(width);
//3
EALLOW;
GpioDataRegs.GPACLEAR.all=0x0006;//gpio_2,gpio_3低电平
EDIS;
delayus((t1/2-width));
//4
if(count!=0) //判断的目的是为了避免输入奇数个脉冲时跳不出循环
{count--;
EALLOW;
GpioDataRegs.GPASET.all=0x0004;//gpio_3高电平
EDIS;
delayus(width);
}
}
}
}
void delayus(unsigned long m)
{i=0;
while(i<m) //计数没有达到的时候等待中断
//否则跳出循环
{
//开中断2,M_INT2已经在头文件中定义
IER |= M_INT2;//定时器1的周期中断int2.4;
}
}
interrupt void ISRTimer1(void) //定时器1周期中断服务程序
{
i++; //每执行一次中断计数增加一次
PieCtrl.PIEACK.all=0x0002; //清除PIEACK中断标志位
EvaRegs.T1CNT=0x0000; //Timer1的计数器重新赋0
EvaRegs.EVAIFRA.all=EvaRegs.EVAIFRA.all&0x0080;
return;
}
interrupt void sci_rx_isr(void)
{
int j;
a=SciaRegs.SCIRXBUF.all;
if(a=='w'||a=='W')
{
for(j=0;j<ss;j++)
{buffer[j]=SciaRegs.SCIRXBUF.all;}
width=atoi(buffer);
t1=1000000/freq; //计算周期(us)
t=(long)(t1-width);
}
else if(a=='f'||a=='F')
{
for(j=0,h=0;j<ss;j++)
{buffer[j]=SciaRegs.SCIRXBUF.all;}
freq=atoi(buffer);
t1=1000000./freq; //计算周期(us)
t=(long)(t1-width); //低电平的时间长度(us)
}
else if(a=='n'||a=='N')
{
for(j=0;j<ss;j++)
{buffer[j]=SciaRegs.SCIRXBUF.all;}
count=atol(buffer);
count1=count;
}
else if(a=='s') //停止按钮
{count=0;
zz=0;}
else if(a=='z') //开始按钮
{count=count1;
zz=1;
}
else if(a=='b') //单极性
{type=0;}
else if(a=='c') //双极性
{type=1;}
SciaRegs.SCIFFRX.bit.RXOVF_CLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrl.PIEACK.all|=0x100; // Issue PIE ack
}
void sci_init(void)
{
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
SciaRegs.SCIHBAUD = 487>>8;
SciaRegs.SCILBAUD = 487&0x00ff;//9600
SciaRegs.SCICCR.bit.LOOPBKENA =0; // 自测试模式禁止
SciaRegs.SCIFFTX.all=0xC028;//接受8个字符产生一次中断
SciaRegs.SCIFFRX.all=0x0028;
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -