📄 main.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 + -