|
最近因?yàn)橐粋(gè)項(xiàng)目同時(shí)用到了28035和103.兩個(gè)芯片通過spi通信。目的是通過usb下發(fā)數(shù)據(jù)到arm,再經(jīng)spi到dsp。dsp收到數(shù)據(jù)后,自己擦寫程序,之后跳轉(zhuǎn)到新的程序執(zhí)行。準(zhǔn)備工作:
生成bin文件,ccs生成bin的步驟參照
http://blog.csdn.net/cbffyx/article/details/49911813
由于cmd的文件配置,bin有時(shí)比較大,參照
http://www.deyisupport.com/question_answer/microcontrollers/c2000/f/56/t/117154.aspx
我參照了前兩個(gè)后bin文件還是比較大,所以選擇hex2bin轉(zhuǎn)換工具
http://download.csdn.net/download/lishoubox/8804179
這個(gè)好處是keil或ccs都可以用,而且解決了生成bin文件過大的問題
準(zhǔn)備好之后,就可以開始28035的程序
1、調(diào)試一個(gè)可以進(jìn)行spi通訊的程序,cmd采用小塊小flash放boot的代碼。
FLASHC : origin = 0x3E8000, length = 0x002000 /* on-chip FLASH */
用到flash的地方全部用flashc。
2、flash的擦除,dsp的flash擦寫必須是整個(gè)扇區(qū),并且操作flash前必須關(guān)閉所有中斷
DINT;
DRTM;
Unlock_OK = CsmUnlock();//首先解鎖
EALLOW;
Flash_CPUScaleFactor = SCALE_FACTOR;
EDIS;
EALLOW;
Flash_CallbackPtr = &MyCallbackFunction;
EDIS;
if(Unlock_OK==1)//解鎖成功后擦除Flash
{
Status =Flash_Erase((SECTORB|SECTORC|SECTORD|SECTORE),&FlashStatus);
index_encoder = 22;
GpioDataRegs.GPACLEAR.bit.GPIO5 = 1;
}
3、寫flash,ram大小有限,定義一個(gè)uint16 200長度的數(shù)組,存放spi接受的數(shù)據(jù),每到200個(gè)數(shù)據(jù),寫入flash一次
start_index = Flash_Program((Uint16 *) add_code,code_bin, PROG_BUFFER_LENGTH, &FlashStatus);
4、app的cmd需要進(jìn)行一些改動。
cmd中的begin需定義為
BEGIN : origin = 0x3EA000, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */
FLASHA : origin = 0x3EA002, length = 0x003FFE /* on-chip FLASH */
需要用到flash的地方全部用flasha。
5、boot程序中,接收的spi數(shù)據(jù)全部存儲于以0x3EA000開始的flash地址中,存儲結(jié)束后執(zhí)行跳轉(zhuǎn)指令。
(*(void(*)(void))0x3EA000)();
即可執(zhí)行新的app程序
arm的執(zhí)行步驟:
1、預(yù)留boot的地址空間
1.png (1.97 KB, 下載次數(shù): 83)
下載附件
2018-3-15 23:42 上傳
2、app的程序空間
2.png (1.54 KB, 下載次數(shù): 79)
下載附件
2018-3-15 23:42 上傳
3、修改app的中斷向量偏移
3.jpg (149.28 KB, 下載次數(shù): 88)
下載附件
2018-3-15 23:42 上傳
#define VECT_TAB_OFFSET 0x8000 /*!< Vector Table base offset field.
4、擦除flash,注意和dsp不同的地方,arm32位的地址對應(yīng)一個(gè)字節(jié)即8位的數(shù)據(jù)。dsp32位的地址應(yīng)用一個(gè)word即16位的數(shù)據(jù)。
__set_PRIMASK(1);
FLASH_Unlock();
//FLASHStatus = EraseSectors(EXE_START_ADDR,EXE_START_ADDR);//???????????????·??·???????
//if(FLASHStatus == FLASH_COMPLETE){
FLASHStatus = EraseSectors(ERASE_START,ERASE_END);//????APP??·????·????
//}
FLASH_Lock();
__set_PRIMASK(0);
5、寫flash
__set_PRIMASK(1);
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR | FLASH_FLAG_OPTERR);
for(i=0;i< length;i++)
{
FLASHStatus = FLASH_ProgramHalfWord(add_code,code_bin[ i]);
if(FLASHStatus == FLASH_COMPLETE)
{
add_code += 2;
}
else
{
return FLASHStatus;
}
}
FLASH_Lock();
__set_PRIMASK(0);
6、app的程序開始打開全局中斷
int main(void)
{
__set_PRIMASK(0);
USB_GPIO_Configuration();
SPI_Configuration();
7、跳轉(zhuǎn)執(zhí)行
JumpToApplication(0x08008000); |
評分
-
查看全部評分
|