⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 startup.c

📁 ARM9200的can驱动原程序
💻 C
📖 第 1 页 / 共 2 页
字号:

//*----------------------------------------------------------------------------
//* \fn    AT91F_InitFlash
//* \brief This function performs very low level HW initialization
//*----------------------------------------------------------------------------
void AT91F_InitFlash()
{
	AT91C_BASE_MC->MC_PUIA[0] = AT91C_MC_PROT_PRWURW;
	AT91C_BASE_MC->MC_PUP = 0;
	AT91C_BASE_MC->MC_PUER =0;	//* Memory controller protection unit disable
	AT91C_BASE_MC->MC_ASR = 0;  //* read only!
	AT91C_BASE_MC->MC_AASR = 0; //* read only!

	//* Setup MEMC to support CS0=Flash
	AT91C_BASE_EBI->EBI_CSA |= AT91C_EBI_CS0A_SMC;
	AT91C_BASE_EBI->EBI_CFGR = (AT91C_EBI_DBPUC & 0x00) | (AT91C_EBI_EBSEN & 0x00);

	//* Setup Flash
	AT91C_BASE_SMC2->SMC2_CSR[0] = (AT91C_SMC2_NWS & 0x4) | AT91C_SMC2_WSEN
									| (AT91C_SMC2_TDF & 0x200) | AT91C_SMC2_BAT | AT91C_SMC2_DBW_16;
}

char AT91F_DBGU_GetChar()
{
  char temp;
  temp=AT91F_US_GetChar ((const AT91PS_USART)AT91C_BASE_DBGU);
  return temp;
}

void AT91F_DBGU_PutChar(char ch)
{ 
    AT91F_US_PutChar ((AT91PS_USART)AT91C_BASE_DBGU,(int)ch );

}
//-----------------------------------------------------------------------------
//*\fn AT91F_US_Printf
//*\brief Formatted Output String
//*----------------------------------------------------------------------------
void AT91F_DBGU_Printk(char *fmt,...)
{
    va_list argptr;
    char temp_buf[256];
   
    va_start(argptr, fmt);
    vsprintf(temp_buf, fmt, argptr);
    AT91F_US_PutStr((AT91PS_USART)AT91C_BASE_DBGU,temp_buf);
    va_end(argptr);
}
//-----------------------------------------------------------------------------
//*\fn AT91F_US_Printf
//*\brief Formatted Output String
//*----------------------------------------------------------------------------
void AT91F_US0_Printk(char *fmt,...)
{
    va_list argptr;
    char temp_buf[256];
   
    va_start(argptr, fmt);
    vsprintf(temp_buf, fmt, argptr);
    AT91F_US_PutStr((AT91PS_USART)AT91C_BASE_US0,temp_buf);
    va_end(argptr);
}

//-----------------------------------------------------------------------------
//*\fn AT91F_US_Printf
//*\brief Formatted Output String
//*----------------------------------------------------------------------------
void AT91F_US1_Printk(char *fmt,...)
{
    va_list argptr;
    char temp_buf[256];
   
    va_start(argptr, fmt);
    vsprintf(temp_buf, fmt, argptr);
    AT91F_US_PutStr((AT91PS_USART)AT91C_BASE_US1,temp_buf);
    va_end(argptr);
}
//-----------------------------------------------------------------------------
//*\fn AT91F_US_Printf
//*\brief Formatted Output String
//*----------------------------------------------------------------------------
void AT91F_US2_Printk(char *fmt,...)
{
    va_list argptr;
    char temp_buf[256];
   
    va_start(argptr, fmt);
    vsprintf(temp_buf, fmt, argptr);
    AT91F_US_PutStr((AT91PS_USART)AT91C_BASE_US2,temp_buf);
    va_end(argptr);
}
//-----------------------------------------------------------------------------
//*\fn AT91F_US_Printf
//*\brief Formatted Output String
//*----------------------------------------------------------------------------
void AT91F_US3_Printk(char *fmt,...)
{
    va_list argptr;
    char temp_buf[256];
   
    va_start(argptr, fmt);
    vsprintf(temp_buf, fmt, argptr);
    AT91F_US_PutStr((AT91PS_USART)AT91C_BASE_US3,temp_buf);
    va_end(argptr);
}
//*----------------------------------------------------------------------------
//* \fn    AT91F_DBGU_Printk
//* \brief This function is used to send a string through the DBGU channel (Very low level debugging)
//*----------------------------------------------------------------------------
/*void AT91F_DBGU_Printk(
	char *buffer) // \arg pointer to a string ending by \0
{
	while(*buffer != '\0') {
		while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
		AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, *buffer++);
	}
}*/


	
	




//*----------------------------------------------------------------------------
//* \fn    AT91F_DataAbort
//* \brief This function reports an Abort
//*----------------------------------------------------------------------------
void AT91F_SpuriousHandler() 
{
	AT91F_DBGU_Printk("-F- Spurious Interrupt detected\n\r");
	while (1);
}


//*----------------------------------------------------------------------------
//* \fn    AT91F_DataAbort
//* \brief This function reports an Abort
//*----------------------------------------------------------------------------
void AT91F_DataAbort() 
{
	AT91F_DBGU_Printk("-F- Data Abort detected\n\r");
	while (1);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_FetchAbort
//* \brief This function reports an Abort
//*----------------------------------------------------------------------------
void AT91F_FetchAbort()
{
	AT91F_DBGU_Printk("-F- Prefetch Abort detected\n\r");
	while (1);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_Undef
//* \brief This function reports an Abort
//*----------------------------------------------------------------------------
void AT91F_Undef() 
{
	AT91F_DBGU_Printk("-F- Undef detected\n\r");
	while (1);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_UndefHandler
//* \brief This function reports that no handler have been set for current IT
//*----------------------------------------------------------------------------
void AT91F_UndefHandler() 
{
	AT91F_DBGU_Printk("-F- Undef detected\n\r");
	while (1);
}


//*----------------------------------------------------------------------------
//* \fn    AT91F_LowLevelInit
//* \brief This function performs very low level HW initialization
//*----------------------------------------------------------------------------
void AT91F_LowLevelInit()
{    
 
    unsigned char 	status;

/////////////////////////////////////////////////////////////////////////////////////////////////////
// Step 2.
// Checking the Main Oscillator Frequency (Optional)
/////////////////////////////////////////////////////////////////////////////////////////////////////

	status = AT91F_WaitForMainClockFrequency();

/////////////////////////////////////////////////////////////////////////////////////////////////////
// Flash AT49BV1614 Initialisation : must be done before change the clocks -> Set correct Wait States
/////////////////////////////////////////////////////////////////////////////////////////////////////

	//AT91F_InitFlash();
 
/////////////////////////////////////////////////////////////////////////////////////////////////////
// Step 3. to 5.
/////////////////////////////////////////////////////////////////////////////////////////////////////

	status = AT91F_InitClocks(PLLAR,PLLBR,MCKR);

/////////////////////////////////////////////////////////////////////////////////////////////////////
// SDRAM Initialisation
/////////////////////////////////////////////////////////////////////////////////////////////////////

	//AT91F_InitSDRAM();
	//(AT91PS_PIO)AT91C_BASE_PIOA->PIO_OER = (AT91PS_PIO)AT91C_PA23_TXD2;
   AT91F_AIC_Open(
		AT91C_BASE_AIC,          // pointer to the AIC registers
		AT91C_AIC_BRANCH_OPCODE, // IRQ exception vector
		AT91F_UndefHandler,      // FIQ exception vector
		AT91F_UndefHandler,      // AIC default handler
		AT91F_SpuriousHandler,   // AIC spurious handler
		0);                      // Protect mode

	// Perform 8 End Of Interrupt Command to make s齬e AIC will not Lock out nIRQ 
	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);

	AT91F_AIC_SetExceptionVector((unsigned int *)0x0C, AT91F_FetchAbort);
	AT91F_AIC_SetExceptionVector((unsigned int *)0x10, AT91F_DataAbort);
	AT91F_AIC_SetExceptionVector((unsigned int *)0x4, AT91F_Undef);

	// Open PIO for DBGU
    AT91F_DBGU_CfgPIO();
    AT91F_DBGU_CfgPMC();
	// Configure DBGU
	AT91F_US_Configure (
		(AT91PS_USART) AT91C_BASE_DBGU,          // DBGU base address
		60000000,             // 60 MHz
		AT91C_US_ASYNC_MODE,  // mode Register to be programmed
		115200 ,              // baudrate to be programmed
		0);                   // timeguard to be programmed

	// Enable Transmitter
	AT91F_US_EnableTx((AT91PS_USART) AT91C_BASE_DBGU);
    // Enable Receiver
    AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_DBGU);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -