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

📄 main.c

📁 解决smartarm2200串口下载问题的程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
** Description: 将SRAM中的数据写入到NOR Flash中,实现程序的固化。
**     将要烧写的BIN文件改名为flash.bin,然后复制到本工程目录的src目录下,接着重新编译本工程(一定要
** 重新编译),再启动AXD调试,全速运行程序即可。
**     要求系统存储器分配为Bank0:Flash,Bank1:RAM。本工程要使用DebugInExram生成目标来编译。
********************************************************************************************************/
#include "config.h"


// 定义蜂鸣器控制口
#define   BEEP		        (1 << 7)     /* P0.7口 */	

// 声明外部标号(flash.bin文件的存储地址)
extern  uint16 FLASH_FUNCTION[];
extern  uint16 FLASH_FUNCTION_END[];

/*********************************************************************************************************
** Function name: DelayNS
** Descriptions: 长软件延时。
**              延时时间与系统时钟有关。
** Input: dly	延时参数,值越大,延时越久
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  DelayNS(uint32  dly)
{  
	uint32  i;

   	for(; dly > 0; dly--) 
       for(i = 0; i < 50000; i++);
}

/*********************************************************************************************************
** Function name: RunBeep
** Descriptions: 控制蜂鸣器Be一声音。
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2006-01-05 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  RunBeep(void)
{  
    IO0CLR = BEEP;	    // BEEP = 0
    DelayNS (5);
    IO0SET = BEEP;	    // BEEP = 1 
    DelayNS (5);
}

// FLASH的起始地址(分配为Bank0块,16位宽度)
#define   FLASH_ADDR		0x80000000

/*********************************************************************************************************
** Function name: GetAddr (宏函数)
** Descriptions: 转换地址。将要发送给SST39VF1601的地址值进行转换,以便于S3C2410A输出。
**               由于SST39VF1601的A0是与S3C2410A的A1相连,所以addr要左移1位。
** Input: addr		SST39VF1601的内部地址值
** Output: 返回转换出的地址
** Created by: 黄绍斌
** Created Date: 2006-01-05 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define  GetAddr(addr)	(volatile uint16  *)(FLASH_ADDR|(addr<<1))

/*********************************************************************************************************
** Function name: WordProgram
** Descriptions: 半字(16位)数据编程。    
** Input: Addr		编程地址(SST39VF1601内部地址)	
**        Data		编程数据
** Output: 返回TRUE表示操作成功,返回FALSE表示操作失败
** Created by: 黄绍斌
** Created Date: 2006-01-05 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int  WordProgram(uint32 Addr, uint16 Data) 
{  
    volatile uint16  *ip;
    uint16  temp1, temp2;

    ip = GetAddr(0x5555);	// 转换地址0x5555
    ip[0] = 0xaaaa;			// 第一个写周期,地址0x5555,数据0xAA
    ip = GetAddr(0x2aaa);
    ip[0] = 0x5555;			// 第二个写周期,地址0x2aaa,数据0x55
    ip = GetAddr(0x5555);
    ip[0] = 0xa0a0;			// 第三个写周期,地址0x5555,数据0xA0
    
    ip = GetAddr(Addr);
    *ip = Data;				// 第四个写周期,地址Addr,数据Data
  
    temp1 = *ip;			// 预读处理
    while(1)				// 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
    {  
        temp1 = *ip;			
        temp2 = *ip;
        if(temp1 == temp2)
        {  
            if(temp1 != Data)
            {  
                return(FALSE);
            }
            else
            {  
                return(TRUE);
            }
        } // end of if(temp1 == temp2)...
    } // end of while(1)...  
    return(TRUE);
}

/*********************************************************************************************************
** Function name: WordRead
** Descriptions: 读取指定地址(Flash内部的)上的半字(16位)数据。      
** Input: Addr		编程地址(SST39VF1601内部地址)	
** Output: 返回值即是读出的数据
** Created by: 黄绍斌
** Created Date: 2006-01-05 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16  WordRead(uint32 Addr) 
{	
    volatile uint16  *ip;
	
	ip = GetAddr(Addr);
	return(*ip);
}

/*********************************************************************************************************
** Function name: ChipErase
** Descriptions: 芯片全片擦除。         
** Input: 无
** Output: 返回TRUE表示操作成功,返回FALSE表示操作失败
** Created by: 黄绍斌
** Created Date: 2006-01-05 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int  ChipErase(void) 
{  
    volatile uint16  *ip;
    uint16  temp1, temp2;

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

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

uint16  wr_data;

/*********************************************************************************************************
** Function name: main
** Descriptions: 将FLASH_FUNCTION起始地址上的数据写入到NOR Flash的0x000000地址。
**               写入字节个数为flash.bin文件的大小。         
** Input: 无
** Output: 系统返回值0
** Created by: 黄绍斌
** Created Date: 2006-01-05 
**-------------------------------------------------------------------------------------------------------
** Modified by:    	zouchao
** Modified Date: 	2006-02-09
** Descriptions:  	增加Flash编程的全局校验,程序编程成功,蜂鸣器响一声,否则蜂鸣器持续间断蜂鸣
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main (void)
{   
    uint32  addr, size;
    uint32  err;

    PINSEL0 = 0x00000000;		  // I/O初始化
    PINSEL1 = 0x00000000;
    IO0DIR = BEEP;
    IO0SET = BEEP;

	ChipErase();				 // 全片擦除操作
	DelayNS(1);
	
	
	size = FLASH_FUNCTION_END - FLASH_FUNCTION;			// 计算flash.bin文件的大小
    
	
	for(addr = 0; addr < size; addr++)				    // 开始写数据
	{	
	    wr_data = FLASH_FUNCTION[addr];
		WordProgram(addr, wr_data); 
	}
													   
	err = 0;										   // 将写入Flash中的数据与原bin文件中的数据相校验
	
	for(addr = 0; addr < size; addr++)
	{
	    wr_data = WordRead(addr);
	    if(wr_data != FLASH_FUNCTION[addr]) err++;  
	}												   
	
	while(err)          
	{   
	    RunBeep();				// 校验出错报警
	}
	
	RunBeep();					// 编程正确	
	
	while(1);
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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