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