📄 test.c
字号:
}
// 定义蜂鸣器控制口
void Buzzer_Freq_Set( unsigned int freq )
{
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 2;
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
rTCNTB0 = (PCLK>>7)/freq;
rTCMPB0 = rTCNTB0>>1; // 50%
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit
}
void Buzzer_Stop( void )
{
rGPBCON &= ~3; //set GPB0 as output
rGPBCON |= 1;
rGPBDAT &= ~1;
}
//***************************[ BOARD BEEP ]*******************************
void Beep(unsigned int freq, unsigned int ms)
{
Buzzer_Freq_Set( freq ) ;
Delay( ms ) ;
Buzzer_Stop() ;
Timer0Init();
}
int test_beep_for(int v)
{
SetMenuReShow(0);
if( v < 0 )
return MENU_EXIT;
Beep(v,2000);
return MENU_RETAIN;
}
Menu gstr_BeepMenu[] =
{
{"500 Hz",500,test_beep_for},
{"1000 Hz",1000,test_beep_for},
{"2000 Hz",2000,test_beep_for},
{"3000 Hz",3000,test_beep_for},
{"4000 Hz",4000,test_beep_for},
{"5000 Hz",5000,test_beep_for},
{"数码管",0,test_digital},
{"Exit",-1,test_beep_for},
{0,0,0}
};
int test_beep(int v)
{
return MENU_RETAIN;
}
int test_digital(int v)
{
char str[16];
SetMenuReShow(0);
v = rand();
sprintf(str,"%d",v%100000000);
LED_Display(str,0);
sprintf(str,"数码管显示:%d",v%100000000);
StatusMessage(str);
return MENU_RETAIN;
}
int test_keys(int v)
{
int toExit = 0;
unsigned char ch;
unsigned short key;
char str[32];
RestoreDesktop();
TextOut(2,SH-FONT_HEIGHT-2,gstr_exit);
SetTextMode(TM_NOTTRANSPARENT);
SetHoriEnlarge(2);
SetVertEnlarge(2);
KeyScanInit();
while(!toExit)
{
Pollint();
toExit = IsToExit();
ch = Key_Scan();
if( ch != 0xff )
{
sprintf(str,"2x2 key 0x%02x,%d",ch,ch);
StatusMessage(str);
}
key = Keyboard_GetKey();
if( key != 0 && (key&0xff) )
{
sprintf(str,"小键盘0x%02x按下%2d次",key&0xff,(key>>8)+1);
StatusMessage(str);
}
}
KeyScanExit();
ResetTextOut();
return MENU_RETAIN;
}
extern void InitStepMotorTest(void);
void stepmotor_clockwise(unsigned char dly);
void stepmotor_anti_clockwise(unsigned char dly);
void dcmotor_stop(void);
void dcmotor_clockwise(void);
void dcmotor_anti_clockwise(void);
unsigned char steprate = 4;
void ShowStepRate(void)
{
sprintf((char*)buf,"步进电机速率%d",255-steprate+1);
StatusMessage((const char *)buf);
}
int test_motor(int v)
{
int i;
InitStepMotorTest();
switch(v)
{
case 1:
dcmotor_clockwise();
for( i = 0; i < 20; i++)
stepmotor_clockwise(steprate);
break;
case 2:
dcmotor_anti_clockwise();
for( i = 0; i < 20; i++)
stepmotor_anti_clockwise(steprate);
break;
case 4:
if( steprate < 255)
steprate++;
ShowStepRate();
break;
case 3:
if( steprate > 2 )
steprate--;
ShowStepRate();
break;
case 5:
dcmotor_stop();
break;
case 0xff:
dcmotor_stop();
return MENU_EXIT;
}
SetMenuReShow(0);
return MENU_RETAIN;
}
Menu gstr_MotorMenu[] =
{
{"顺时针转动",1,test_motor},
{"反时针转动",2,test_motor},
{"步进加速",3,test_motor},
{"步进减速",4,test_motor},
{"停止",5,test_motor},
{"Exit",0xff,test_motor},
{0,0,0}
};
extern int PlayAuditoControl(int v);
extern int RecordAuditoControl(int v);
Menu gstr_AudioMenu[] =
{
{"播放音频",1,PlayAuditoControl},
{"停止播放",2,PlayAuditoControl},
{"增大音量",3,PlayAuditoControl},
{"减小音量",4,PlayAuditoControl},
{"暂停/继续",5,PlayAuditoControl},
{"静音开关",6,PlayAuditoControl},
{"开始录音",1,RecordAuditoControl},
{"停止录音",2,RecordAuditoControl},
{"Exit",0xff,PlayAuditoControl},
{0,0,0}
};
extern SDI_test(void);
int test_default_idle(int v)
{
}
int test_sdi(int v)
{
PrintfFlag = 0x02;
SDI_test();
PrintfFlag = 0x01;
SetMenuReShow(0);
return MENU_RETAIN;
}
Menu gstr_MoreMenu[] =
{
{"uc/GUI",MENU_ucGUI,0},
{"SD Card",0,test_sdi},
{"RS-485",0,RS485Test},
{"CAN BUS",MENU_CANBUS,0},
{"I/O",MENU_IO,0},
{"RFID",MENU_RF,0},
{"多任务",MENU_MULTITASK,0},
{"以太网",MENU_NET,0},
{"Exit",0xff,0},
{0,0,0}
};
#ifndef PCLK
#define FCLK (200*1000000) // 系统时钟,修改此参数必须同时修改startup.s的参数
#define HCLK (FCLK/2) // HCLK只能为FCLK除上1、2
#define PCLK (HCLK/2) // PCLK只能为HCLK除上1、2
#endif
// 定义RS485发送/接收控制口。为高电平时使能发送。
#define RS485_CONS (1<<7) /* GPG7 */
#define RS485_CONC (~(1<<7)) /* GPG7 */
// 使能RS485数据发送
#define RS485_SEND() rGPGDAT = rGPGDAT | RS485_CONS
// 使能RS485数据接收
#define RS485_RCV() rGPGDAT = rGPGDAT & RS485_CONC
int RS485Test(int v)
{
unsigned int timeout = RunTimeMs + 5100;
// I/O口初始化
rGPGCON = (rGPGCON & (~(0x03<<14))) | (0x01<<14);
rGPGUP = rGPGUP | (0x01<<7);
RS485_SEND(); //设置485芯片为发送模式
StatusMessage("RS-485发送测试,5秒后退出");
UART_Select(1);
rUBRDIV1=( (int)(PCLK/16./19200) -1 );// UART_SetBaud(19200);
while( RunTimeMs < timeout ) {
if( (RunTimeMs % 1000) == 0 )
UART_SendStr("RS485 send data test!\r\n");
if( rUTRSTAT1 & 0x1 )
{
sprintf((char*)buf,"%02x ",RdURXH1());
AppendText((char*)buf);
}
if( (RunTimeMs % 50) == 0 )
ScrollShow(0);
}
UART_Select(0);
SetMenuReShow(0);
return MENU_RETAIN;
}
unsigned int port = 0;
unsigned int wdata = 0;
unsigned int rdata = 0;
#define BASE_PORT 0x08000000
void ShowIO(void)
{
sprintf((char*)buf,"端口0x%d 写入数据0x%02x 读出数据0x%02x",port,wdata,rdata);
StatusMessage((char*)buf);
}
char* printhex(char* str,const char* ptr,int len)
{
char* sptr = str;
while(len-- > 0 )
{
sptr += sprintf(sptr,"%02x",*ptr++);
}
return str;
}
char gstr_cardno[5];
char gstr_wrdata[16];
char gstr_rddata[16];
char gi_cardsector = 0;
char gi_cardblock = 0;
char gstr_pwd[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,};
void ShowRF500(void)
{
char* ptr = (char*)buf;
char str[48];
ptr += sprintf(ptr,"卡号:%s\r\n",printhex(str,gstr_cardno,5));
ptr += sprintf(ptr,"扇区%02x 块号%d\r\n",gi_cardsector,gi_cardblock);
ptr += sprintf(ptr,"密钥:%s\r\n",printhex(str,gstr_pwd,12));
ptr += sprintf(ptr,"写入数据:%s\r\n",printhex(str,gstr_wrdata,16));
ptr += sprintf(ptr,"读出数据:%s",printhex(str,gstr_rddata,16));
TextOut(0,SH-120,(char*)buf);
}
void Uart1SetBaudrate(int bdrate)
{
/* 系统时钟宏定义,用于串口配置 */
#define FCLK (200*1000000) // 系统时钟,修改此参数必须同时修改startup.s的参数
#define HCLK (FCLK/2) // HCLK只能为FCLK除上1、2
#define PCLK (HCLK/2) // PCLK只能为HCLK除上1、2
rUBRDIV1=(int)(PCLK/16.0/bdrate + 0.5) -1;
}
/**
* crc16 - CRC validation
* @ptr: point to source data that was checked by CRC
* @len: the length of source data
*/
U16 crc16(U8 *ptr,U16 len){
U16 crc = 0xc78c;
U8 i;
while(len--){
for(i = 0x80; i > 0; i >>= 1){
if((crc & 0x8000) != 0){
crc <<= 1;
crc ^= 0x1021;
}else
crc <<= 1;
if((*ptr&i) != 0)
crc ^= 0x1021;
}
ptr++;
}
return(crc);
}
/**
initial
COM1【WRITE:0】C0 FF E4 00 0C 03 C1
COM1【READ:0】C2 FF 00 02 04 14 40 44 C3
COM1【WRITE:0】C0 FF E1 00 F3 F6 C1
COM1【READ:0】C2 FF 00 05 FF FF FF FF FF 8F D4 C3
read card no
COM1【WRITE:0】C0 FF 01 00 E3 44 C1
COM1【READ:0】C2 FF 00 05 EC C8 8D 07 08 AB 60 C3
COM1【WRITE:0】C0 FF 3B 00 09 1A C1
COM1【READ:0】C2 FF 00 00 3D 1D C3
authen
COM1【WRITE:0】C0 FF 10 0E 00 02 FF FF FF FF FF FF FF FF FF FF FF FF 00 37 C1
COM1【READ:0】C2 FF 00 00 3D 1D C3
COM1【WRITE:0】C0 FF 3B 00 09 1A C1
COM1【READ:0】C2 FF 00 00 3D 1D C3
read 0,0
COM1【WRITE:0】C0 FF 2C 02 00 00 2D 09 C1
COM1【READ:0】C2 FF 00 10 EC C8 8D 07 AE 88 04 00 47 C1 2D 2A C9 00 28 07 C3 60 C3
COM1【WRITE:0】C0 FF 3B 00 09 1A C1
COM1【READ:0】C2 FF 00 00 3D 1D C3
**/
int ExecRF500(int para)
{
unsigned char srdata[32] = {0xc0,0xff,0x01,0x00};
unsigned short crc;
unsigned char i,len;
unsigned long timeout;
StatusMessage("GiRF500 Connecting...");
Uart1SetBaudrate(19200);
switch(para)
{
case 0: // read card no
break;
case 1:// read
srdata[2] = 0x2c;
srdata[3] = 0x02;
srdata[4] = gi_cardsector;
srdata[5] = gi_cardblock;
break;
case 2://write
srdata[2] = 0x2d;
srdata[3] = 0x12;
srdata[4] = gi_cardsector;
srdata[5] = gi_cardblock;
memcpy(srdata+6,gstr_wrdata,16);
break;
case 3://authenticate
srdata[2] = 0x10;
srdata[3] = 0x0e;
srdata[4] = gi_cardsector;
srdata[5] = 0x02;
memcpy(srdata+6,gstr_pwd,12);
break;
case 0x11: //C0 FF 3B 00 09 1A C1
srdata[2] = 0x3b;
srdata[3] = 0x00;
break;
case 0x12: //C0 FF e4
srdata[2] = 0xe4;
srdata[3] = 0x00;
break;
case 0x13: //C0 FF e1
srdata[2] = 0xe1;
srdata[3] = 0x00;
break;
}
len = srdata[3]+4;
crc = crc16(srdata,len);
srdata[len++] = crc >> 8;
srdata[len++] = crc;
srdata[len++] = 0xc1;
printf("send\r\n");
printbuf(srdata,len);
// 发送
for(crc = 0; crc < len; crc++)
{
while(!(rUTRSTAT1 & 0x02)); // 等待发送器THR为空
for(i=0; i<100; i++);
rUTXH1 = srdata[crc]; // 发送数据
}
// 接收
timeout = RunTimeMs + 3000;
len = 0;
while( timeout > RunTimeMs )
{
if(!(rUTRSTAT1 & 0x1))
continue;
srdata[len++] = (rURXH1);
if( len == (3+4+srdata[3]) )
break;
}
printf("recvd\r\n");
printbuf(srdata,len);
if( !(len >= 4 && len == (3+4+srdata[3])) )
{
StatusMessage("timeout 3000!");
return 0x1;
}
if( crc16(srdata,len-1) != 0 )
{
StatusMessage("crc error!");
return 0x2;
}
if( srdata[2] != 0 )
{
sprintf((char*)buf,"Status=0x%02x:error!",srdata[2]);
StatusMessage((char*)buf);
return 0x3;
}
StatusMessage("GiRF500 Communication OK!");
switch(para)
{
case 0:// card no
memcpy(gstr_cardno,srdata+4,5);
break;
case 1://read
memcpy(gstr_rddata,srdata+4,16);
break;
case 2://write
break;
case 3://authenticate
break;
}
return 0;
}
int test_io(int para)
{
int i;
switch(para)
{
case 1: port = (++port) % 3; break;
case 2: wdata = (++wdata) & 0xff; break;
case 3: rdata = *(unsigned char*)(BASE_PORT+port); break;
case 4: *(unsigned char*)(BASE_PORT+port) = wdata; break;
case 5: port = wdata = rdata = 0; break;
case 10: /*卡号*/
if( 0 == ExecRF500(0))
ExecRF500(0x11);
break;
case 11: gi_cardsector = (++gi_cardsector) & 0x0f; break;
case 12: gi_cardblock = (++gi_cardblock) & 0x03; break;
case 13:// 数据
for( i = 0; i < 16 ;i++)
gstr_wrdata[i] = rand() & 0xff;
break;
case 14:// 读卡
if( 0 == ExecRF500(1))
ExecRF500(0x11);
break;
case 15:// 写卡
if( 0 == ExecRF500(2) )
ExecRF500(0x11);
break;
case 19:// authenticate
if( 0 == ExecRF500(3) )
ExecRF500(0x11);
break;
case 18:
ExecRF500(0x12);
ExecRF500(0x13);
break;
}
if( para < 10 )
ShowIO();
else
ShowRF500();
SetMenuReShow(0);
return MENU_RETAIN;
}
Menu gstr_RFMenu[] =
{
{"切换扇区号0-15",11,test_io},
{"切换块号0-3",12,test_io},
{"切换写卡数据",13,test_io},
{"初始化",18,test_io},
{"读Mifare卡序列号",10,test_io},
{"密钥认证",19,test_io},
{"读Mifare卡",14,test_io},
{"写Mifare卡",15,test_io},
{"Exit",0xff,0},
{0,0,0}
};
Menu gstr_IOMenu[] =
{
{"切换端口地址",1,test_io},
{"切换写入数据",2,test_io},
{"读取端口",3,test_io},
{"写入端口",4,test_io},
{"复位设置",5,test_io},
{"Exit",0xff,0},
{0,0,0}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -