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

📄 boot.c

📁 dsp 5509 通过EMIF口实现从FLASH的二次启动功能。
💻 C
字号:
// 本程序是第一次启动使用的boot程序,作用是提高DSP主频,把应用程序从串行FLASH里读到DSP内存里
// 本程序将被写入FLASH的零地址里,上电时首先被DSP从串行FLASH中读出执行

#include "Flash.h"

#define IODIR 	*(volatile ioport unsigned short *)0x3400
#define IODATA 	*(volatile ioport unsigned short *)0x3401
#define IER0	*(volatile unsigned short *)0
#define IER1	*(volatile unsigned short *)0x45
#define McBSP_PCR *(volatile ioport unsigned short *)0x2812
#define McBSP0START 0x2804

#define XIOEN	1 << 13
#define RIOEN	1 << 12
#define FSXM	1 << 11
#define CLKXM	1 << 9
#define DXSTAT	1 << 5
#define DRSTAT	1 << 4
#define CLKXP	1 << 1

#define RamStart	0x015000	// byte address 应用程序在RAM中的起始地址
#define RamLen		0x01B000	// byte address 应用程序在RAM中的长度
#define RdFlashAddr	0x004000	// word address 应用程序在FLASH里的起始地址


main()
{
    Uint32 i, j, tempaddr;
    Uint16 Rdbit, RdDatTemp, WrDatTmp;
    Uint16 *RamAddr, once = 0;
	ioport Uint16 *regaddr = (ioport Uint16 *)McBSP0START;

    /*设置系统运行速度*/
	CLK_init();
	IER0 = 0;
	IER1 = 0;
    
	tempaddr = (Uint32)(RamStart/2);
	RamAddr = (Uint16 *)tempaddr;

   	/*初始化McBSP0*/
	for(i = 0x4; i < 0x20; i++)
		*regaddr++ = 0;
	McBSP_PCR = 0 | XIOEN | RIOEN | FSXM | CLKXM;
	
    /*确定方向为输出*/
	IODIR = 0x10;
	IODATA = 0x10;

//sub	SPIcs(1);	
	IODATA |= 0x10;	
//sub	SPIclk(0);	
	McBSP_PCR &= ~CLKXP;
	
	FlashWrReg(0);

	/* read from flash */	
//sub	SPIcs(1);	
	IODATA |= 0x10;
//sub	SPIcs(0);	
	IODATA &= ~0x10;

	sWr1Byte(0x03);		// write operation code
	WrDatTmp = (RdFlashAddr >> 16) & 0x00FF;		//write start address
	sWr1Byte(WrDatTmp);
	WrDatTmp = (RdFlashAddr >> 8) & 0x00FF;
	sWr1Byte(WrDatTmp);			
	WrDatTmp = RdFlashAddr & 0x00FF;
	sWr1Byte(WrDatTmp);			

	for(j = 0; j < RamLen/2; j++)
	{	
		for(i=0;i<16;i++)
		{
//sub			SPIclk(0);
			McBSP_PCR &= ~CLKXP;	
//sub			Rdbit=MCBSP_FGET(PCR0,DRSTAT);
			Rdbit = (McBSP_PCR & DRSTAT);
			RdDatTemp<<=1; 
		
//sub			SPIclk(1);		
			McBSP_PCR |= CLKXP;	
			if(Rdbit==0)
				RdDatTemp&=0xfffe;
			else
				RdDatTemp|=0x0001;
		}

		RamAddr = (Uint16 *)tempaddr;
		*RamAddr = RdDatTemp;
		tempaddr += 1;

	}

//sub	SPIcs(1);
	IODATA |= 0x10;	
	
	asm("	b	#0x18000");	// 此处是应用程序的_c_int00的地址
}


void CLK_init()
{
   ioport unsigned int *clkmd;
   clkmd=(unsigned int *)0x1c00;
   *clkmd =0x2333;	// cpu clock = 120MHz (clkin = 12MHz) 
}


void FlashWrReg(Uint16 RegP)
{
	FlashWrEn();
//sub	SPIcs(1);	
	IODATA |= 0x10;	
//sub	SPIcs(0);
	IODATA &= ~0x10;

	sWr1Byte(0x01);
	sWr1Byte(RegP);

//sub	SPIcs(1);	
	IODATA |= 0x10;	

}

void FlashWrEn()
{
//sub	SPIcs(1);	
	IODATA |= 0x10;	
//sub	SPIcs(0);
	IODATA &= ~0x10;
	
	sWr1Byte(0x06);

//sub	SPIcs(1);	
	IODATA |= 0x10;	
}

void sWr1Byte(Uint16 WrDatP)
{
	Uint16 WrDatPTmp,i, j;

	WrDatPTmp=WrDatP;

	for(i=0;i<8;i++)
	{
		WrDatPTmp&=0x80;

		if(WrDatPTmp==0x80)
//sub			SPItx(1);
			McBSP_PCR |= DXSTAT;
		else
//sub			SPItx(0);
			McBSP_PCR &= ~DXSTAT;
		
//sub		SPIclk(0);
		McBSP_PCR &= ~CLKXP;
//sub		SPIclk(1);
		McBSP_PCR |= CLKXP;

		
		WrDatP<<=1;
		WrDatPTmp=WrDatP;
	} 
}

⌨️ 快捷键说明

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