打印

用stm32向msp430的bsl下载程序 有懂bsl的吗大神吗

[复制链接]
1435|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
707414287|  楼主 | 2017-11-29 17:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验是基于stm32的msp430脱机编程器
向stm32的spi flish里写入用 iar生成的msp430的txt文本的16进制数据,数据代码是点亮msp430的一个led
然后通过stm32控制msp430 的bsl 往里边发送数据 来下载程序 实现脱机下载

Tx_Buffer里前100位存放的是用iar生成的一段代码的16进制数据。
void hong() 函数里是具体发送过程。
这是别人写好的代码 , 我这里有点问题不理解。我用iar软件生成的是一堆16进制数,
但是这个函数里开头用了这两个函数把数据分成了k1、k2两个数组来存放数据。                W25QXX_Read(BSLRxDataBlk1, FLASH_WriteAddress, BufferSize2);  // k1[74]     0    74         1-74
                W25QXX_Read(BSLRxDataBlk2, BufferSize2, BufferSize3);               // k2[26]    74    26        74-100       
        这个函数是 读取前1-74的内容放入k1数组里
问题就在这,为什么我用iar生成的是一堆16进制数,这里为啥要把它拆成两次发送??



//--------------------------------下面是具体代码

u8 BSLErase[]={0x80,0x18,0x04,0x04,0x00,0xff,0x04,0xa5,0x7f,0xb9};    //檫除命令

u8 BSLTxDataBlk[]={0x80,0x14,0x04,0x04,0xf0,0x0f,0x0c,0x00,0x87,0xe0};//TX数据块

u8 BslPassword[]={0x80,0x10,0x24,0x24,0xe0,0xff,0x20,0x00,            //密码
                  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9b,0x34};

u8 Tx_Buffer[1000]={0x80,0x12,0x44,0x44,0x00,0xf0,0x40,0x00,0x31,0x40,0x00,0x04,0xb0,0x12,0x0c,0xf0,
                    0xb0,0x12,0x34,0xf0,0xb2,0x40,0x80,0x5a,0x20,0x01,0xe2,0x43,0x1a,0x00,0xe2,0x43,
                    0x19,0x00,0xe2,0xe3,0x19,0x00,0x3c,0x40,0x30,0x75,0xb0,0x12,0x28,0xf0,0xf9,0x3f,
                    0x0f,0x4c,0x0c,0x4f,0x3c,0x53,0x0f,0x93,0xfb,0x23,0x30,0x41,0x30,0x40,0x38,0xf0,
                    0x30,0x40,0x3c,0xf0,0xff,0x3f,0xff,0xff,0x0a,0x6c,0x80,0x12,0x14,0x14,0xf0,0xff,
                          0x10,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                    0x00,0xf0,0x74,0x09


void hong()
{
          u8 i;
       
                W25QXX_Read(BSLRxDataBlk1, FLASH_WriteAddress, BufferSize2);// k1[74]    0    74     0-74
                W25QXX_Read(BSLRxDataBlk2, BufferSize2, BufferSize3);       // k2[26]   74    26    74-100       
       
                bslEntrySeq(); //启动BSL时序
                delay_ms(100);       
       
                USART_SendData(USART3,0x80);     //同步队列    在向BSL 发送任何命令之前,一个值为80h的同步
                //字符(SYNC) 必须被发送到BSL。需要这个字符来计算所有重要的内部参数,这些参数用于保持UART 和闪存存储器程序
                //和擦除时间选择。它还提供了BSL 系统时间基准。当接收到这个字符之后,BSL 会发回一个DATA_ACK=90h 以确认接收成功。       
                delay_ms(100);        

                for(i=0;i<10;i++)                             
                {
                                USART_SendData(USART3,BSLErase[i]);               //檫除命令      
                                while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
                }

                USART_SendData(USART3,0x80);
                delay_ms(100);
       
                for(i=0;i<42;i++)
                {
                         USART_SendData(USART3,(uint8_t) BslPassword[i]);              //密码      
                         while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
                }

                USART_SendData(USART3,0x80);
                delay_ms(100);

                for(i=0;i<10;i++)
                {
                         USART_SendData(USART3, (uint8_t) BSLTxDataBlk[i]);            //TX数据块           
                         while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
                }

                USART_SendData(USART3,0x80);
                delay_ms(100);

                for(i=0;i<BufferSize2;i++)    // // i<74                                            
                {
                         USART_SendData(USART3, (uint8_t) BSLRxDataBlk1[i]);
                         while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
                }

                USART_SendData(USART3,0x80);
                delay_ms(100);       

                for(i=0;i<BufferSize3;i++)   //  // i<26
                {
                         USART_SendData(USART3, (uint8_t) BSLRxDataBlk2[i]);
                         while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
                }

                bslend();      //退出BSL时序
}       

评论
q2573444650 2018-6-27 17:34 回复TA
分段的原因,可能是BSL发送命令,最大数据好像是255。我最近也在研究这个,STM32可以和MSP430通信,但是我写入数据成功,但是去读取刚才写入的数据,就全是FF,你知道这个是为什么吗?着急呀!!! 

相关帖子

沙发
dirtwillfly| | 2017-11-30 19:43 | 只看该作者
这个是stm32的代码吧?
bsl官网有说明文档的

使用特权

评论回复
板凳
707414287|  楼主 | 2017-12-1 19:58 | 只看该作者
dirtwillfly 发表于 2017-11-30 19:43
这个是stm32的代码吧?
bsl官网有说明文档的

发送代码那部分没看懂

使用特权

评论回复
地板
dirtwillfly| | 2017-12-1 21:43 | 只看该作者
5
707414287|  楼主 | 2017-12-2 14:49 | 只看该作者
dirtwillfly 发表于 2017-12-1 21:43
不是你写的代码?
参考官网文档
http://www.ti.com.cn/cn/lit/ug/slau655e/slau655e.pdf

你帮我看看bsl发送代码的格式,我看不懂

使用特权

评论回复
6
shenmu2012| | 2018-6-27 23:02 | 只看该作者
个人感觉这一部分代码的较复杂的,有优化的空间的

使用特权

评论回复
7
dirtwillfly| | 2018-6-28 20:59 | 只看该作者
shenmu2012 发表于 2018-6-27 23:02
个人感觉这一部分代码的较复杂的,有优化的空间的

这个要自己实现bsl的协议,比较麻烦
可以参考官网的代码,不过是msp430上的代码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝