📄 main.c
字号:
/*************************************************************************
*
* Used with ICCARM and AARM.
*
* (c) Copyright IAR Systems 2005
*
* File name : main.c
* Description : main module
*
* History :
* 1. Data : June, 04 2005
* Author : Stanimir Bonev
* Description : Create
*
* Jumpers:
* PWR_J - depend of power source
* PWM/DAC - 2-3 (PWM)
* DBG - present
*
* LCD Backlight - indicate disks activity
*
* $Revision: 1.2.2.1 $
**************************************************************************/
#include "includes.h"
#define UPDATE_SHOW_DLY ((Int32U)(0.5*TICK_PER_SECOND))
#define STARTUP_SHOW_DLY ((Int32U)(2 *TICK_PER_SECOND))
#define LCD_BACKLIGHT_ON() (IO0SET_bit.P0_21 = 1)
#define LCD_BACKLIGHT_OFF() (IO0CLR_bit.P0_21 = 1)
#define LCD_BACKLIGHT_INIT() (PINSEL1_bit.P0_21 = 0, IO0DIR_bit.P0_21 = 1, IO0CLR_bit.P0_21 = 1)
const Int8U HexToCharStr [] = "0123456789ABCDEF";
volatile Int32U TickSysFlag;
/*************************************************************************
* Function Name: irq_handler
* Parameters: none
*
* Return: none
*
* Description: IRQ handler
*
*************************************************************************/
__irq __arm void irq_handler (void)
{
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr; // Get interrupt vector.
interrupt_function = (void(*)())vector;
if(interrupt_function != NULL)
{
interrupt_function(); // Call vectored interrupt function.
}
else
{
VICVectAddr = 0; // Clear interrupt in VIC.
}
}
/*************************************************************************
* Function Name: SetSysTickFlag
* Parameters: none
*
* Return: none
*
* Description: Set arg
*
*************************************************************************/
void SetSysTickFlag (void* arg)
{
Int32U* pFlag = arg;
*pFlag = 1;
}
/*************************************************************************
* Function Name: Dly100us
* Parameters: void *arg
*
* Return: none
*
* Description: Timer1 CH0 subroutine - delay [100us]
*
*************************************************************************/
void Dly100us(void *arg)
{
volatile Int32U Flag = 0;
Int32U Delay = (int)arg;
// Stop Timer 1
TIMER_Stop(TIMER1);
// Reset Timer 1 counter
TIMER_Reset(TIMER1);
// Set action - match module CH0
TIMER_SetMatchAction(TIMER1, CH0, TimerAction_Interrupt | TimerAction_StopTimer,
Delay usec_T1*100, SetSysTickFlag, (void *)&Flag, DONOTHING);
// Start Timer 1
TIMER_Start(TIMER1);
// Wait expire of delay
while(Flag == 0);
}
/*************************************************************************
* Function Name: main
* Parameters: none
*
* Return: none
*
* Description: main
*
*************************************************************************/
void main()
{
Int32U Dly;
Int8U Message[17];
Int32U Tmp, Tmp1;
LPC_SysControl_MAMConfig_t MamCofig = {MAM_CONFIG,MAM_CYCLES};
SYS_Init(FOSC, FCCLK, VPBDIV1, USER_FLASH, MAM_STATE, &MamCofig, 0xB27E7FFF,0x80FFFFFF,0xFFFFFFFF,0);
VIC_Init();
VIC_SetProtectionMode(UserandPrivilegedMode);
// Init System Timer - Timer0
TIMER_Init(TIMER0, TIMER_PRECISION);
TIMER_SetMatchAction(TIMER0, CH0, TimerAction_Interrupt | TimerAction_ResetTimer,
1sec_T0/TICK_PER_SECOND, SetSysTickFlag, (void *)&TickSysFlag, DONOTHING);
// System Timer interrupt registered
VIC_SetVectoredIRQ(TIMER0_ISR,VIC_Slot2,VIC_TIMER0);
VIC_EnableInt(1<<VIC_TIMER0);
// Init Dly 100 ms - Timer1
TIMER_Init(TIMER1, TIMER_PRECISION);
// Dly 100 ms interrupt registered
VIC_SetVectoredIRQ(TIMER1_ISR,VIC_Slot3,VIC_TIMER1);
VIC_EnableInt(1<<VIC_TIMER1);
// Init USB Hw
USB_HwInit(VIC_Slot1);
// Init USB Core
UsbCoreInit(UsbClassBotConfigure);
// LUNs Init
LunInit(RAM_DISK_LUN,RamDiskInit,RamDiskInfo,RamDiskStatus,RamDiskIO);
LunInit(MMC_DISK_LUN,MmcDiskInit,MmcDiskInfo,MmcDiskStatus,MmcDiskIO);
// Init SCSI module
ScsiInit();
// Soft connection enable
USB_Connect(TRUE);
// Enable interrupts
__enable_interrupt();
// Start System timer
TIMER_Start(TIMER0);
LCD_BACKLIGHT_INIT();
// LCD Powerup init
HD44780_PowerUpInit();
// Show meassges on LCD
HD44780_StrShow(1, 1, "IAR Systems ARM ");
HD44780_StrShow(1, 2, "USB Mass Storage");
// Set the startup message time out
Dly = STARTUP_SHOW_DLY;
while(1)
{
for(Int32U i = 0; i < SCSI_LUN_NUMB; i++)
{
// Implement LUNs messages
LunImp(i);
}
if (TickSysFlag)
{
TickSysFlag = 0;
// Update MMC/SD card status
MmcStatusUpdate();
if(Dly-- == 0)
{
// LCD show
Dly = UPDATE_SHOW_DLY;
// Current state of USB show
UsbDevState_t UsbDevState = UsbGetDevState();
switch(UsbDevState.DS)
{
case UsbDevStatusConfigured:
if(UsbDevState.Suspend)
{
strcpy((char*)Message,"USB - Suspend ");
}
else
{
strcpy((char*)Message,"USB - Connect ");
}
break;
default:
strcpy((char*)Message,"Pls, Insert USB ");
}
HD44780_StrShow(1, 1, (pInt8S)Message);
// Current state of MMC/SD show
pDiskStatus_t pMMCDiskStatus = MmcDiskStatus();
switch (pMMCDiskStatus->DiskStatus)
{
case DiskCommandPass:
switch(pMMCDiskStatus->DiskType)
{
case DiskMMC:
strcpy((char*)Message,"MMC Card - ");
break;
case DiskSD:
strcpy((char*)Message,"SD Card - ");
break;
default:
strcpy((char*)Message,"Card - ");
}
// Calculate MMC/SD size [MB]
Tmp = pMMCDiskStatus->BlockNumb * pMMCDiskStatus->BlockSize;
Tmp = Tmp/1000000;
Tmp1 = Tmp/1000;
if(Tmp1)
{
Message[strlen((char*)Message)+1] = 0;
Message[strlen((char*)Message)] = HexToCharStr[Tmp1];
Tmp %= 1000;
}
Tmp1 = Tmp/100;
if(Tmp1)
{
Message[strlen((char*)Message)+1] = 0;
Message[strlen((char*)Message)] = HexToCharStr[Tmp1];
Tmp %= 100;
}
Tmp1 = Tmp/10;
if(Tmp1)
{
Message[strlen((char*)Message)+1] = 0;
Message[strlen((char*)Message)] = HexToCharStr[Tmp1];
Tmp %= 10;
}
if(Tmp)
{
Message[strlen((char*)Message)+1] = 0;
Message[strlen((char*)Message)] = HexToCharStr[Tmp];
}
strcat((char*)Message,"MB");
for(Int32U i = strlen((char*)Message); i < 16; ++i)
{
Message[i] = ' ';
}
Message[strlen((char*)Message)+1] = 0;
break;
default:
strcpy((char*)Message,"Pls, Insert Card");
}
HD44780_StrShow(1, 2, (pInt8S)Message);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -