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

📄 loader.c

📁 ARM嵌入式常用模块的原理图和源码
💻 C
字号:
#include "ioregs.h" 
#include "net.h"
#include "flash.h"


unsigned long address;				//32位地址
unsigned long data;					//32位数据
unsigned long length;				//32位长度
void init_uart(void)				//串口1初始化 @ 115200bps
{
	IO_UBRLCR1 = (IO_UBRLCR1 & ~BRDIV) | BR_115200;
	IO_UBRLCR1 = IO_UBRLCR1 | FIFOEN;
	IO_UBRLCR1 = (IO_UBRLCR1 & ~WRDLEN) | (3<<WRDLEN_SHIFT);
	IO_SYSCON1 |=  UART1EN;
}
unsigned char get_char(void)			//串口1接收
{
	while (IO_SYSFLG1 & URXFE1);
	return IO_UARTDR1 & 0xff;
}
void put_char(unsigned char data)	//串口1发送
{
	while (IO_SYSFLG1 & UTXFF1);
	IO_UARTDR1 = data;
}
void put_string(char *sp)				//串口1字符串发送
{
	unsigned int i=0;
	while(sp[i]!=0)
		put_char(sp[i++]);
}
unsigned int wait(unsigned char i)	//延时函数
{
	unsigned int sum=0;
	for(;i>0;i--)
		sum+=i;
	return(sum);
}
void flash_erase()					//FLASH擦除
{
	SYSC_(0x70005555)=0xaa;			//写入擦除命令
	wait(1);						//延时
	SYSC_(0x70002aaa)=0x55;			//写入擦除命令
	wait(1);						//延时
	SYSC_(0x70005555)=0x80;			//写入擦除命令
	wait(1);						//延时
	SYSC_(0x70005555)=0xaa;			    //写入擦除命令
	wait(1);						//延时
	SYSC_(0x70002aaa)=0x55;		//写入擦除命令
	wait(1);						//延时
	SYSC_(0x70005555)=0x10;			    //写入擦除命令
	wait(1);						//延时
	while((SYSC_(0x70000000)& 0x80)==0);	//确认已擦除
}
void flash_prog(unsigned long address,unsigned char data)	//FLASH字节编程
{
	SYSC_(0x70005555)=0xaa;			    //写入编程命令
	wait(1);						//延时
	SYSC_(0x70002aaa)=0x55;		//写入编程命令
	wait(1);						//延时
	SYSC_(0x70005555)=0xa0;			      //写入编程命令
	wait(1);						//延时
	SYSC_(address)=data;				//写入编程数据
	while(SYSC_(address)!=data);	//确认字节已写入
}
void writein()					//块数据获取
{
	unsigned long i,data;
	put_string("Len:\n");				//发送“请输入长度数据”的提示
	length=get_char();
	length=(length<<8)+get_char();
	length=(length<<8)+get_char();
	length=(length<<8)+get_char();	//获取32位长度数据
	for(i=0;i<length;i+=4)
	{
		data=get_char();
		data+=get_char()<<8;
		data+=get_char()<<16;
		data+=get_char()<<24;			//获取32位数据
		SDRAM_(i)=data;			//SDRAM赋值
	}
	put_string("Ok!\n");				//发送块数据读取完毕标志
}
void flashload()					//块数据FLASH编程
{
	unsigned long i;
	writein();					//编程数据先读入SDRAM
	flash_erase();				//FLASH擦除
	for(i=0;i<length;i+=4)
	{
		data=SDRAM_(i);
		flash_prog((0x70000000+i),data & 0xff);	          //FLASH字节编程
		flash_prog((0x70000001+i),(data>>8) & 0xff);	//FLASH字节编程
		flash_prog((0x70000002+i),(data>>16) & 0xff);	//FLASH字节编程
		flash_prog((0x70000003+i),(data>>24) & 0xff);	//FLASH字节编程			
	}
	put_string("Done!\n");				//发送FLASH编程成功标志
}
void mymain(void)					//串口调试函数
{
	unsigned char scomm,sdata;
	unsigned char *addrp;
	unsigned char *datap;
	addrp=(unsigned char*)&address;
	datap=(unsigned char*)&data;
	put_string("ok!\n");				//发送串口调试启动标志
	
	while (1)					//主循环
    	{
		scomm=get_char();			   //读串口
		if(scomm==0xff)			//是否为命令前导字节“0xFF”?
	  		{
		  	scomm=get_char();	//读调试命令字节
		  	if(scomm!=0xff)
	  			switch(scomm)		//根据调试命令散转
	  			{
					case 0xfa:flashload();break; //执行FLASH编程操作
		  			default:put_string("Not Support!\n"); //不支持的命令
		  		}
		else sdata=0xff;				   //数据“0xFF”赋值
		}
	else sdata=scomm;			//非“0xFF”数据直接赋值
	}
}
void  C_vMain(void)				//主程序
{
	unsigned char i;
	unsigned short j;	
	init_uart();					//串口1初始化
	while(1)
	{
		i=get_char();				//读串口
		if(i==0x79)				//是否读取到调试开始命令?
			mymain();			//进入串口调试
		else put_char(i);			//测试串口
	}
}

⌨️ 快捷键说明

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