找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5623|回复: 1
收起左侧

C2000和STM32的在线bootload

[复制链接]
ID:292515 发表于 2018-3-15 21:42 | 显示全部楼层 |阅读模式
最近因为一个项目同时用到了28035和103.两个芯片通过spi通信。目的是通过usb下发数据到arm,再经spi到dsp。dsp收到数据后,自己擦写程序,之后跳转到新的程序执行。准备工作:
生成bin文件,ccs生成bin的步骤参照
http://blog.csdn.net/cbffyx/article/details/49911813
由于cmd的文件配置,bin有时比较大,参照
http://www.deyisupport.com/question_answer/microcontrollers/c2000/f/56/t/117154.aspx
我参照了前两个后bin文件还是比较大,所以选择hex2bin转换工具
http://download.csdn.net/download/lishoubox/8804179
这个好处是keil或ccs都可以用,而且解决了生成bin文件过大的问题
准备好之后,就可以开始28035的程序
1、调试一个可以进行spi通讯的程序,cmd采用小块小flash放boot的代码。

FLASHC      : origin = 0x3E8000, length = 0x002000     /* on-chip FLASH */

用到flash的地方全部用flashc。
2、flash的擦除,dsp的flash擦写必须是整个扇区,并且操作flash前必须关闭所有中断
                    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大小有限,定义一个uint16 200长度的数组,存放spi接受的数据,每到200个数据,写入flash一次
        start_index = Flash_Program((Uint16 *) add_code,code_bin, PROG_BUFFER_LENGTH, &FlashStatus);
4、app的cmd需要进行一些改动。
        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数据全部存储于以0x3EA000开始的flash地址中,存储结束后执行跳转指令。
        (*(void(*)(void))0x3EA000)();
        即可执行新的app程序

arm的执行步骤:
1、预留boot的地址空间
1.png
2、app的程序空间
2.png
3、修改app的中断向量偏移
3.jpg
#define VECT_TAB_OFFSET  0x8000 /*!< Vector Table base offset field.

4、擦除flash,注意和dsp不同的地方,arm32位的地址对应一个字节即8位的数据。dsp32位的地址应用一个word即16位的数据。
                        __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、跳转执行
         JumpToApplication(0x08008000);

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表