📄 control.c
字号:
#include "def.h"
#include "config.h"
#include "board.h"
#include "utils.h"
#include "option.h"
extern char Image$$RO$$Limit[];
extern char Image$$RO$$Base[];
extern char Image$$RW$$Limit[];
extern char Image$$RW$$Base[];
extern char Image$$ZI$$Limit[];
extern char Image$$ZI$$Base[];
void ShowBootInfo( void )
{
puts( "\n ***************************************\n" );
puts( "* *\n" );
puts( "* BIOS for YL-LPC2292 Board V1.00 *\n" );
puts( "* Http://www.uCdragon.com *\n" );
puts( "* *\n" );
puts( " ***************************************\n" );
/* printf( " Image$$RO$$Base = 0x%x\n", Image$$RO$$Base );
printf( " Image$$RO$$Limit = 0x%x\n", Image$$RO$$Limit );
printf( " Image$$RW$$Base = 0x%x\n", Image$$RW$$Base );
printf( " Image$$RW$$Limit = 0x%x\n", Image$$RW$$Limit );
printf( " Image$$ZI$$Base = 0x%x\n", Image$$ZI$$Base );
printf( " Image$$ZI$$Limit = 0x%x\n", Image$$ZI$$Limit );*/
}
/****************************************************************************
* 名称:PWM5_Set( U32 CYCLE_DATA, U32 DUTY_CYCLE_DATA )
* 功能:使用PWM5输出占空比可调的PWM波形。
* 参数说明:CYCLE_DATA表示PWM的周期是多少,范围是1--100000,对应于10us;
DUTY_CYCLE_DATA占空比是多少,范围是1--100000,对应于0.001% - 100%
****************************************************************************/
void PWM5_Set( U32 CYCLE_DATA , U32 DUTY_CYCLE_DATA )
{
PWMTCR = 0x02; // 停止定时器,PWM禁止,复位定时器
PWMPR = 0x00; // 不分频,计数频率为Fpclk
PWMMCR = 0x02; // 设置PWMMR0匹配时复位PWMTC
PWMMR0 = CYCLE_DATA * ( Fpclk / 100000 ); // 设置PWM周期
PWMMR5 = DUTY_CYCLE_DATA * ( Fpclk / 100000 ); // 设置PWM占空比
PWMLER = 0x21; // PWMMR0、PWMMR5锁存
PWMPCR = 0x2000; // 允许PWM5输出,单边PWM
PWMTCR = 0x09; // 启动定时器,PWM使能
}
void PWM5_Stop( void )
{
PWMMCR = PWMMCR | ( 1 << 17 ) ;
} //停止PWM5
/****************************************************************************
【功能说明】PWM模式控制蜂鸣器
****************************************************************************/
void Beep( U32 time )
{
PWM5_Set( 100 , 50 ) ;
Delay( time ) ;
PWM5_Stop() ;
}
/****************************************************************************
【功能说明】PWM模式控制蜂鸣器测试
****************************************************************************/
int PWM5_Beep_Test( int argc , char* argv[] )
{
U16 CYCLE = 100;
printf( "PWM5 Test( Beep ) !\n\n" ) ;
printf( "Press +/- to increase/reduce the frequency of beep !\n" ) ;
printf( "Press 'ESC' to Exit this test program !\n\n" );
PWM5_Set( CYCLE , ( CYCLE / 2 ) ) ;
while ( 1 )
{
U8 key;
key = getch();
putch( key );
if ( key == '+' )
if ( CYCLE > 0 )
CYCLE -- ;
if ( key == '-' )
if ( CYCLE < 10000 )
CYCLE ++ ;
if ( key == ESC_KEY )
break ;
PWM5_Set( CYCLE , ( CYCLE / 2 ) ) ;
printf( "\tNow beep CYCLE is %duS\n" , ( CYCLE * 10 ) ) ;
}
PWM5_Stop() ;
return 1 ;
}
/****************************************************************************
【功能说明】SRAM测试
****************************************************************************/
int SRAM_Test( int argc , char* argv[] )
{
//#define ADDRESS_ADD 0x1000
#define ADDRESS_ADD 0x0
U32 i ;
U8 j ;
U8 memError = 0 ;
U32 start_adr, end_adr ;
U32 temp ;
U8 value0 ;
U8 value1 ;
U8 value2 ;
U8 value3 ;
if ( argc == 1 )
{
start_adr = SRAM_BASE + ADDRESS_ADD ;
end_adr = SRAM_BASE + USER_SRAM ;
value0 = 0x33 ;
value1 = 0x55 ;
value2 = 0xaa ;
value3 = 0xcc ;
}
else
{
if ( argc > 1 )
start_adr = strtoul( ( char * ) argv[1] );
if ( argc > 2 )
end_adr = strtoul( ( char * ) argv[2] );
if ( argc > 3 )
temp = strtoul( ( char * ) argv[3] ) ;
value0 = (U8)( (temp>>0) & 0xff ) ;
value1 = (U8)( (temp>>8) & 0xff ) ;
value2 = (U8)( (temp>>16) & 0xff ) ;
value3 = (U8)( (temp>>24) & 0xff ) ;
}
if ( ( start_adr < SRAM_BASE ) || ( end_adr > ( SRAM_BASE + USER_SRAM ) ) )
{
printf( "\nArguments error!\n" ) ;
printf( "Please input \n" ) ;
printf( "Usage: ram start_adr end_adr value\nstart_adr = test start address\nend_adr = test end address\nvalue = the value for write and read to ram\n" );
return -1 ;
}
printf( "\nMemory Test(0x%xh--0x%xh) : WR\n" , start_adr , end_adr ) ;
for ( i = start_adr; i < end_adr; i += 4 )
{
*( ( volatile unsigned char * ) (i+0) ) = value0 ;
*( ( volatile unsigned char * ) (i+1) ) = value1 ;
*( ( volatile unsigned char * ) (i+2) ) = value2 ;
*( ( volatile unsigned char * ) (i+3) ) = value3 ;
if ( ( i % 0x10000 ) == 0 )
SerialTxChar( '.' ) ;
}
printf( "\nMemory Test(0x%xh--0x%xh) : RD\n" , start_adr , end_adr ) ;
for ( i = start_adr; i < end_adr; i += 4 )
{
j = *( ( volatile unsigned char * ) (i+0) ) ;
if ( j != value0 )
{
memError = 1 ;
break ;
}
j = *( ( volatile unsigned char* ) (i+1) ) ;
if ( j != value1 )
{
memError = 1 ;
break ;
}
j = *( ( volatile unsigned char* ) (i+2) ) ;
if ( j != value2 )
{
memError = 1 ;
break ;
}
j = *( ( volatile unsigned char* ) (i+3) ) ;
if ( j != value3 )
{
memError = 1 ;
break ;
}
if ( ( i % 0x10000 ) == 0 )
SerialTxChar( '.' ) ;
}
if ( memError == 0 )
printf( "\n\nRAM Test is OK!\n" );
else
{
printf( "\n\nMemory Test is FAIL!\n" ) ;
printf( " Write the memory address (0x%xh) with data (0x%xh)\n" , i ,
i ) ;
printf( " But read the memory is 0x%xh!\n" , j ) ;
}
CacheEnable() ;
return 0 ;
}
/****************************************************************************
* 名称:LedSet()
* 功能:根据表DISP_TAB来控制LED显示
****************************************************************************/
void LedSet( U32 m )
{
if ( m & 0x01 )
IO0SET = IO0SET | ( 1 << 2 ) ;
else
IO0CLR = IO0CLR | ( 1 << 2 ) ;
if ( m & 0x08 )
IO0SET = IO0SET | ( 1 << 4 ) ;
else
IO0CLR = IO0CLR | ( 1 << 4 ) ;
if ( m & 0x4 )
IO0SET = IO0SET | ( 1 << 5 ) ;
else
IO0CLR = IO0CLR | ( 1 << 5 ) ;
if ( m & 0x02 )
IO0SET = IO0SET | ( 1 << 6 ) ;
else
IO0CLR = IO0CLR | ( 1 << 6 ) ;
if ( m & 0x80 )
IO2SET = IO2SET | ( 1 << 28 ) ;
else
IO2CLR = IO2CLR | ( 1 << 28 ) ;
if ( m & 0x40 )
IO2SET = IO2SET | ( 1 << 29 ) ;
else
IO2CLR = IO2CLR | ( 1 << 29 ) ;
if ( m & 0x20 )
IO2SET = IO2SET | ( 1 << 30 ) ;
else
IO2CLR = IO2CLR | ( 1 << 30 ) ;
if ( m & 0x10 )
IO2SET = IO2SET | ( 1 << 31 ) ;
else
IO2CLR = IO2CLR | ( 1 << 31 ) ;
}
/****************************************************************************
* 名称:LedDisp()
* 功能:根据表DISP_TAB来控制LED显示。
****************************************************************************/
void LedDisp( U32 m , U32 delay_time )
{
while ( m-- )
{
LedSet( ~0x01 ) ;
Delay( delay_time ) ;
LedSet( ~0x02 ) ;
Delay( delay_time ) ;
LedSet( ~0x04 ) ;
Delay( delay_time ) ;
LedSet( ~0x08 ) ;
Delay( delay_time ) ;
LedSet( ~0x10 ) ;
Delay( delay_time ) ;
LedSet( ~0x20 ) ;
Delay( delay_time ) ;
LedSet( ~0x40 ) ;
Delay( delay_time ) ;
LedSet( ~0x80 ) ;
Delay( delay_time ) ;
}
}
U8 Get_Keystoke( void )
{
if ( ( IO2PIN & ( 1 << 16 ) ) == 0 )
return 1 ;
else if ( ( IO2PIN & ( 1 << 17 ) ) == 0 )
return 2 ;
else if ( ( IO2PIN & ( 1 << 18 ) ) == 0 )
return 3 ;
else if ( ( IO2PIN & ( 1 << 19 ) ) == 0 )
return 4 ;
else if ( ( IO2PIN & ( 1 << 20 ) ) == 0 )
return 5 ;
else if ( ( IO2PIN & ( 1 << 21 ) ) == 0 )
return 6 ;
else if ( ( IO2PIN & ( 1 << 22 ) ) == 0 )
return 7 ;
else if ( ( IO0PIN & ( 1 << 30 ) ) == 0 )
return 8 ;
else
return 0 ;
}
int Keystoke_Test( int argc , char* argv[] )
{
U8 m ;
printf( "Keystoke test, ESC key to exit\n" );
while ( getkey() != ESC_KEY )
{
m = Get_Keystoke() ;
if ( m != 0 )
{
LedSet( ~( 1 << ( m - 1 ) ) ) ;
PWM5_Set( ( m * 10 ) , ( m * 5 ) ) ;
Delay( 80 ) ;
PWM5_Stop() ;
}
else
LedSet( 0xff ) ;
}
return 1 ;
}
void MemCfgInit( void )
{
}
void BoardInitStart( void )
{
}
void BoardInitEnd( void )
{
}
void BoardPrepareRun( void )
{
}
void CacheDisable( void )
{
}
void CacheEnable( void )
{
}
void CacheFlush( void )
{
}
U16 GetKeyStatus( void )
{
return 0 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -