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

📄 main.c

📁 LPC2400入门参考。 由于例程的运行平台仅为SmartARM2400
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  
** Last Version:		
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:		zhangmingjie		
** Created date:		
** Version:				
** Descriptions:		
*******************************************************************************************************/
#include "config.h"


/****************************************************************************
* 文 件 名:main.c
* 功    能:对SST39VF1601进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验,
*           若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。
* 说    明:需将跳线P3.30和BEEP短接。
****************************************************************************/
#include "config.h"

#define	 BEEPCON  1<<30					// P3.30引脚控制B1,低电平蜂鸣
#define  FLASH_ADDR		0x81000000  	// FLASH的起始地址(分配为Bank1块)

// 转换地址。将要发送给SST39VF1601的地址值进行转换,以便于LPC2210输出。
// 由于SST39VF1601的A0是与LPC2470的A1相连,所以addr要左移1位。
#define  GetAddr(addr)	(volatile uint16  *)(FLASH_ADDR|(addr<<1))


/****************************************************************************
* 名    称:DelayNS()
* 功    能:长软件延时。
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(uint32  idly)
{  
    uint32  i;
    for(; idly>0; idly--) 
    {
        for(i=0; i<5000; i++);
    }
}



/****************************************************************************
* 名    称:WordProgram()
* 功    能:半字(16位)数据编程。
* 入口参数:Addr		编程地址(SST39VF1601内部地址)	
*           Data		编程数据
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
****************************************************************************/
uint8  WordProgram(uint32 iAddr, uint16 iData) 
{  
    volatile uint16  *ipTmp;
    uint16  itemp1,itemp2;

    ipTmp = GetAddr(0x5555);	// 转换地址0x5555
    ipTmp[0] = 0xaaaa;			// 第一个写周期,地址0x5555,数据0xAA
    ipTmp = GetAddr(0x2aaa);
    ipTmp[0] = 0x5555;			// 第二个写周期,地址0x2aaa,数据0x55
    ipTmp = GetAddr(0x5555);
    ipTmp[0] = 0xa0a0;			// 第三个写周期,地址0x5555,数据0xA0
    
    ipTmp = (volatile uint16  *)(FLASH_ADDR|(iAddr&0x1FFFFF));
    *ipTmp = iData;				// 第四个写周期,地址Addr,数据Data
   
    while (1)				// 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
    { 
        itemp1 = *ipTmp;			
        itemp2 = *ipTmp;
        if (itemp1 == itemp2)
        {  
            if (itemp1 != iData)
            {  
                return(FALSE);
            }
            else
            { 
                return(TRUE);
            }
        }
    }
    return(TRUE);
}

/****************************************************************************
* 名    称:ChipTmpErase()
* 功    能:芯片全片擦除。
* 入口参数:无
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
****************************************************************************/
uint8  ChipErase(void) 
{  
    volatile uint16  *ipTmp;
    uint16  itemp1,itemp2;

    ipTmp = GetAddr(0x5555);
    ipTmp[0] = 0xaaaa;			// 第一个写周期,地址0x5555,数据0xAA
    ipTmp = GetAddr(0x2aaa);
    ipTmp[0] = 0x5555;			// 第二个写周期,地址0x2aaa,数据0x55
    ipTmp = GetAddr(0x5555);
    ipTmp[0] = 0x8080;			// 第三个写周期,地址0x5555,数据0x80
    ipTmp = GetAddr(0x5555);
    ipTmp[0] = 0xaaaa;			// 第四个写周期,地址0x5555,数据0xAA
    ipTmp = GetAddr(0x2aaa);
    ipTmp[0] = 0x5555;			// 第五个写周期,地址0x2aaa,数据0x55
    ipTmp = GetAddr(0x5555);
    ipTmp[0] = 0x1010;			// 第六个写周期,地址0x5555,数据0x10

    while (1)				// 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
    {  
        itemp1 = *ipTmp;
        itemp2 = *ipTmp;
        if (itemp1 == itemp2)
        {  
            if (itemp1 != 0xffff)
            {  
                return(FALSE);
            }
            else
            {  
                return(TRUE);
            }
        }
    }
    return(TRUE);
}

/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :用P3.30控制BEEP,让BEEP鸣叫。
** 调试说明 :需将跳线P3.30和BEEP短接。
*********************************************************************************************************
*/
int main (void){
    uint8  i;
    uint8  ierr = 0;
   
    volatile uint16  *ipAddr;
	
	/*  
	 *  Edit for LPC2460/70
     *  配置外部总线访问SST36VF1601C
     *  的速度,其中,将读取速度
     *  配置为最快,写速度配置为最快 	
     */
    
    PINSEL6          = 0x55555555;              						/* 配置外部总线D0~D15  	        */
    PINSEL8          = 0x55555554;										/* 配置外部总线A1~A15  	        */
    PINSEL9          = 0x40050155;              						/* 配置外部总线A16~A20,OE,WE,CS1*/

    EMCControl       = 0x01;											/* 使能外部EMC,禁止镜像        */
    EMCStaticConfig1 = 0x00000081;              						/* 配置外部总线,16bit宽度 	    */ 
	EMCStaticWaitRd1 = 4;												/* 配置外部总线,读延时5cclk 	*/ 
	EMCStaticWaitOen1  = 0x01;											/* 输出使能延时1cclk 			*/ 
	
	EMCStaticWaitWen1  = 0x00;											/* 写使能延时1cclk 			*/ 
	EMCStaticWaitWr1   = 0x02;	



    PINSEL7 = 0x00000000;			// 设置管脚连接GPIO   
    FIO3DIR = BEEPCON; 				// 设置I/O为输出
    FIO3SET = BEEPCON;				// BEEPCON = 0
    
    ChipErase();					// FLASH全片擦除
   
    // 校验是否真正擦除。若发现有非0xFFFF的存储单元,设置ierr=1
    ipAddr = (volatile uint16  *)FLASH_ADDR + 0;
    for(i=0; i<100; i++)  			
    { 
        if(0xFFFF != (*ipAddr)) ierr = 1;
        ipAddr++;
    }
    
    
    for(i=0; i<255; i++)  			
    { 
	    WordProgram(i, 0x55AA);			// 向FLASH的0地址写入0x55AA

    }
         
   
    ipAddr = (volatile uint16  *)FLASH_ADDR + 0;
    if(0x55AA != (*ipAddr)) ierr = 1;	// 读出校验,若数据错误则设置err=1
      
    if(0==ierr)   
    {  
        FIO3CLR = BEEPCON;				// BEEPCON = 0
        DelayNS(1000);
        FIO3SET = BEEPCON;				// BEEPCON = 1
        DelayNS(1000);
    }
    else
    {  
        while(1)	
        {  
            FIO3CLR = BEEPCON;			// BEEPCON = 0
            DelayNS(500);
            FIO3SET = BEEPCON;			// BEEPCON = 1
            DelayNS(500);
        }
    }  
    while(1);
    return(0);
	
    while(1);

}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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