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

📄 main.c

📁 Keil-At91sam7S64-SPI Flash AT45D081
💻 C
字号:
 #include  "hardware.h"
 #include "at91sam7s64.h"
 #include "lib_at91sam7s64.h"
 #include "ADS.h"
 #include "AT91C_SPI_DataFlash.h"
 #include <stdio.h> 




volatile unsigned long timeval;             /* Current Time Tick */

 //*----------------------------------------------------------------------------
//* Function Name       : Init_Debug
//* Object              : 调试串口初始化  (固定波特率115200)
//* Input Parameters    : none
//* Output Parameters   : none
//*----------------------------------------------------------------------------
void Init_Debug(void)
{
	AT91F_DBGU_CfgPIO();
	// Configure DBGU
	AT91F_US_Configure (
		(AT91PS_USART) AT91C_BASE_DBGU,     // DBGU base address
		MCK,             					// 18.432 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);
}

 //*----------------------------------------------------------------------------
//* \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++);
	}
}


 /* System Interrupt Handler */
void system_int (void) __irq  
{
      
  AT91S_PITC * pPIT = AT91C_BASE_PITC;

  if (pPIT->PITC_PISR & AT91C_PITC_PITS)	 /* Check PIT Interrupt */ 
  { 
    timeval++;                              /* Increment Time Tick */
    if ((timeval % 500) == 0) 
	{            							 /* 500ms Elapsed ? */
      *AT91C_PIOA_ODSR ^= LED0;             /* Toggle LED4 */
    }

    *AT91C_AIC_EOICR = pPIT->PITC_PIVR;     /* Ack & End of Interrupt */
  } 
  else 
  {
    *AT91C_AIC_EOICR = 0;                   /* End of Interrupt */
  }
}


void init_timer (void) {                    /* Setup PIT with Interrupt */
  AT91S_AIC * pAIC = AT91C_BASE_AIC;

  *AT91C_PITC_PIMR = AT91C_PITC_PITIEN |    /* PIT Interrupt Enable */
                     AT91C_PITC_PITEN  |    /* PIT Enable */
                     PIV;                   /* Periodic Interval Value */

  /* Setup System Interrupt Mode and Vector with Priority 7 and Enable it */
  pAIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED | 7;
  pAIC->AIC_SVR[AT91C_ID_SYS] = (unsigned long) system_int;
  pAIC->AIC_IECR = (1 << AT91C_ID_SYS);
}


  void wait (unsigned long time) {            /* Wait Function */
  unsigned long tick;

  tick = timeval;
  while ((timeval - tick) < time);          /* Wait for specified Time */
}

	INT8U buf[528];
	char Buf[100];


int main(void)
{
	INT32U Addr=0;
	INT16U i,err = 0;


    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC ,
	 								(1 << AT91C_ID_PIOA) |  /* Enable Clock for PIO    */
                                    (1 << AT91C_ID_IRQ0) |  /* Enable Clock for IRQ0   */
                                    (1 << AT91C_ID_US0)  );    /* Enable Clock for USART0 */

	AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,LED0|LED1|LED2|LED3|RST);
	AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,LED0|LED1|LED2|LED3|RST);      
	AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA,LED0|LED1|LED2|LED3|RST);
	AT91F_PIO_Enable(AT91C_BASE_PIOA,LED0|LED1|LED2|LED3|RST);			//设置PIOA 端口输出
	AT91F_PIO_OutputWriteEnable(AT91C_BASE_PIOA,LED0|LED1|LED2|LED3|RST);


	init_timer();
	

	AT91F_PIO_SetOutput(AT91C_BASE_PIOA,LED0|LED1|LED2|LED3|RST);



	AT91F_CfgSPIForDataFlash();

	
	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,RST); 
	wait(10);
	AT91F_PIO_SetOutput(AT91C_BASE_PIOA,RST);
	Init_Debug();
	for(;;)
	{
	
		for(i=0;i<528;i++)
		{
			buf[i] = (INT8U)Addr;
		}
		WriteSPIflash(buf,Addr);	

		for(i=0;i<528;i++)
		{
			buf[i] = 0;
		}

		ReadSPIflash(buf,Addr);

		for(i=0;i<528;i++)
		{
			if(buf[i] != (INT8U)Addr)
			{
				err++;
				*AT91C_PIOA_ODSR ^= LED1; 			
			}
		}

		Addr += 528;
		*AT91C_PIOA_ODSR ^= LED2; 

		if(Addr >= 528*4096)
		{
			Addr = 0;
		}

		sprintf(Buf,"写入的地址:%#x  错误次数: %d \r\n",Addr,err);
		AT91F_DBGU_Printk(Buf);

    }

}

⌨️ 快捷键说明

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