OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 24944|回复: 213

分享我的项目必需品:IAP+YMODEM+CRC16+AES256+PC端软件+hex合并

  [复制链接]

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2353
金钱
2353
注册时间
2015-7-26
在线时间
600 小时
发表于 2016-7-3 18:26:53 | 显示全部楼层 |阅读模式
由于项目需要,花时间研究了一下有关IAP的知识,虽然在原子哥的教程中有讲到关于IAP,但是实际项目中并不会那样使用,也不会使用串口直接不通过协议传输文件,但是原子哥的教程很好的讲明白了IAP的思路以及实现的方法,至于细节部分就是我开贴的原因,希望能多把这种实际项目一定会用到的知识为大家所知,一下代码使用的平台是STM32F0,改成F1/F4也很简单,可根据自己情况修改
IAP
学习IAP之前建议大家先看看原子哥的教程了解一下大概,知道IAP的作用以及实现,下面提供一个网址( http://www.openedv.com/posts/list/11494.htm)  ,是原子哥的IAP文字教程,看完后起码按照教程顺序下来实现串口升级代码了,但是教程中有个跳转至中断向量表的知识点我觉得可能存在问题,我也发帖询问过,但是没有得到解答,以下是我的提问帖,希望能得到答复
YMODEM
Ymodem的知识简介自己百度一下吧,传送门 (http://baike.baidu.com/link?url=Z7sLoTcGJjKH580EUmlnqTFIZnPYUM4IH-Tj-TMYVOy7vOmp7L_J5E5ADX8O97rHLvjX-AVM6LAPkslPUvV6qK),原子哥采用的是串口直传升级文件,显然在实际项目我们一般不会那么做,因为可能传输出现错误,需要采取些容错、重发和校验等一些措施来避免传输错误,原本有考虑自己写这个协议来实现文件传输,但是上ST官网一查,已经有了现成的YMODEM+CRC16的代码,所以没多想,直接移植过来好了,也许就是所谓的傻瓜式编程了。但是我觉得去了解YMODEM协议是如何实现的对自己技术水平的提高有很大的帮助,在遇到移植出错时起码知道从哪里下手修改代码,官方找来的IAP+Ymodem的代码在附件中,需要的可以自行下载查看。这里主要讲解一下几个重要的函数,其中主要有menu.c /ymodem.c / flash_if.c / common.c 这几个头文件,menu.c主要实现的是调用ymodem协议的接口然后对传输是否成功以及传输文件的大小名字做一些显示,最关键还是ymodem.c,实现通过ymodem协议发送和接收文件,其中作为接收一方,我们只用到“Ymodem_Receive(uint8_t *buf)”这个函数,其中buf是将接收到的1024字节通过ymodem协议接收下来存到缓存buf里面,每传送完成1024字节就写入一次FLASH,这样只需要开辟一个1024字节的缓存就可以实现升级了,而不需要开辟一个很大的数组存储所有代码,没必要浪费那么大一片存储空间,这就是边写边存的好处,在源码中flash_if.c主要就是对flash的操作了,里面有个FLASH_If_Write函数很好的实现了这个功能,而common.c里面就是现实些整数和字符串的转换和串口发送。把这个协议移植到自己代码中的时候还是跳了不少坑的,官方的东西有时候也不一定靠谱,我发现我ymodem接收数据后写入flash的时候总是写入错误,写入flash指定地址后从同个地址读出那个值做二次判断的时候居然不同,我使用的是电脑的超级终端,win7网上可以随便下载得到,XP有自带。这个软件我也会添加到下面的附件当中,里面集成了各种文件传输协议,其中就有ymodem,只要将代码生成bin文件后直接通过ymodem发送出去,然后串口收到的数据通过官方的这段代码就直接能用了。回到话题,写入flash总是出错,后面经过debug发现官方在写flash之前居然不解锁和上锁!不解锁和上锁!!!后面我在写入前加了解锁,写入后上锁,写入错误这个bug就没了,但是还有个问题官方处理的不太严谨, 就是代码文件是否写入完成不是按照文件的大小来判断的,而是通过设定的代码区flash大小来决定的,所以我修改了一些代码,在往flash写入数据的时候判断是否已经把整个文件写完了,由于ymodem协议传输文件时首先会传递文件的大小的一些信息,所以这个文件的大小通过第一个包就可以获取到了,修改的是“FLASH_If_Write”这个函数,可以对比查看,另外官方在写入前会将要写入的那个flash地址先擦除一遍,但是也没有先解锁再上锁的操作,这个地方我也加上了,我会将我修改后ymodem协议添加到附件中,官方的我也会给在附件中,需要的可以自己查看
“Ymodem_Receive (uint8_t *buf)”这个函数的区别。
在官方例程中还需要修改一个串口发送和接收函数(在commo.h中),官方的代码的串口发送这样的:
[C] 纯文本查看 复制代码
void SerialPutChar(uint8_t c)
{ 
  USART_SendData(EVAL_COM1, c);
  
  while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TXE) == RESET)
  {}
}

//改成如下:串口几可以根据自己的情况修改
void SerialPutChar(uint8_t c)
{ 
  USART_SendData(USART1, c);
  
  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
  {}
}

//官方的串口接收如下:
uint32_t SerialKeyPressed(uint8_t *key)
{
  if ( USART_GetFlagStatus(EVAL_COM1, USART_FLAG_RXNE) != RESET)
  {
    *key = USART_ReceiveData(EVAL_COM1);
    return 1;
  }
  else
  {
    return 0;
  }
}

//改成:
uint32_t SerialKeyPressed(uint8_t *key)
{
  if ( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
  {
    *key = USART_ReceiveData(USART1);
    return 1;
  }
  else
  {
    return 0;
  }
}

在程序中我使用的升级方式是通过串口发送字符‘1’(可自行修改),串口收到字符‘1’后,向指定的地址写入0xAAAA,然后使用软复位回到bootloader,bootloader中判断那个地址是不是0xAAAA,如果是则升级,升级完成后擦除这个地址的flash内容跳到APP,如果不是则跳直接回到APP执行,由于升级不可能频繁升,所以这里不用担心把falsh擦写坏。

AES256+PC软件:
完成ymodem协议传输代码后紧接着又有一个问题了,以往的代码中如果不需要用到升级功能我们会加上读保护,保证有一层明锁,不至于能直接读出代码,但是一旦有了APPbootloader,虽然你代码还是能加上读保护,但是当APP变成一个bin文件给到客户升级的时候如果你不进行加密,很容易就给别人读出来,所以APP就要想办法再给到客户的时候又不至于那么容易让他破解,因此需要采用代码加密,AES是目前最流行的加密算法之一,破解也有一定的难度,关于AES的介绍看传送门
对代码加密有更加严格需求,想加暗锁的可以看下坛友写的一些方法
一开始也是想自己写AES来着,研究了网上的很多资料,偏理论性的东西实在太多了,后面找到了一个动图,可以很清晰的了解每个加密过程,看了后感觉茅塞顿开,动图贴附件中,需要自己写AES的可以根据这个动图来写。AES分加密和解密两个步奏,了解了原理以后偷懒上网查了一下有没现成的可以用,几次查找后发现了个好东西,如果自己写的话首先需要写解密到MCU上,然后PC需要自己写个软件来对bin进行加密,这份资料已经做完了这些,我只需要直接拿来用就好了,使用的是AES256
想想也没那么简单,拿来就能直接用?作者提供MCUAES算法倒是没问题,问题在PC端软件根本用不了,下载了他的软件后用VS编译器调试了下,发现作者不是纯用C#,界面用C#写的,AES的实现用C写的,用C代码生成dllC#调用,问题就出现这个dll,不知道什么原因总之调用这个dll就报错,后面我重新将这部分C代码重新生成一个dll软件把平台改成X86后就可以正常使用了,接着只要将生成的hex文件导入这个软件,写入AES密匙后会自动生成一个加密后的代码,接着通过Ymodem传输给MCUMCU边接收别解密,解密后写入flash,这个作者的原网址
(http://www.amobbs.com/thread-5069186-1-1.html),他给的文件包无法直接用,我给的文件包估计也没法在你们的电脑上上直接用,所以只能用你们自己用电脑将C代码生成dll才能正常用了,怎么把C代码生成dllC#调用,这个百度一大把,很容易(底下有教程,需要VS环境)
下面是我加了AES的yemodem接收代码,由于是之前写的,现在只加了一些关键备注,附件中的源代码都有注释,这里截取关键的发出来
[C] 纯文本查看 复制代码
int32_t Ymodem_Receive (uint8_t *buf)
{                    //1024 + 5
	uint8_t bufferOut[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD], file_size[FILE_SIZE_LENGTH], *file_ptr, *buf_ptr;
  uint8_t *BufferIn;
	int32_t i, j, packet_length, session_done, file_done, packets_received, errors, session_begin, size = 0;
  uint32_t flashdestination, ramsource;

	aesDecInit();//AES解密初始化
	
  /* Initialize flashdestination variable */
  flashdestination = APPLICATION_ADDRESS; //APP代码的起始地址,APPLICATION_ADDRESS = 0x8005000,可在target界面根据情况设置
                                           //这些都在ymodem.h里面的宏进行设置

  
  for (session_done = 0, errors = 0, session_begin = 0; ;)//死循环直至文件数据包全部发送完成
  {
    for (packets_received = 0, file_done = 0, buf_ptr = buf; ;)
    {
			
      switch (Receive_Packet(packet_data, &packet_length, NAK_TIMEOUT))
      {
        case 0://成功接收到1K
          errors = 0;
          switch (packet_length)
          {
            /* Abort by sender */
            case - 1:  //接收失败
              Send_Byte(ACK);  //回复
              return 0;
            /* End of transmission */
            case 0:
              Send_Byte(ACK);//回复
              file_done = 1;
              break;
            /* Normal packet */
            default:   //接收成功
              if ((packet_data[PACKET_SEQNO_INDEX] & 0xff) != (packets_received & 0xff))
              {//序号00(文件名)
                Send_Byte(NAK);
								
              }
              else
              {
                if (packets_received == 0)//文件名(首包)
                {
                  /* Filename packet */
                  if (packet_data[PACKET_HEADER] != 0)//文件名字
                  {
                    /* Filename packet has valid data */
                    for (i = 0, file_ptr = packet_data + PACKET_HEADER; (*file_ptr != 0) && (i < FILE_NAME_LENGTH);)
                    {
                      FileName[i++] = *file_ptr++;//保存文件名
                    }
                    FileName[i++] = '\0';//字符串形式
                    for (i = 0, file_ptr ++; (*file_ptr != ' ') && (i < (FILE_SIZE_LENGTH - 1));)
                    {
                      file_size[i++] = *file_ptr++;//文件大小
                    }
                    file_size[i++] = '\0';
                    Str2Int(file_size, &size);//Convert a string to an integer

                    /* Test the size of the image to be sent */
                    /* Image size is greater than Flash size */
                    if (size > (USER_FLASH_SIZE + 1))
                    {
                      /* End session */
                      Send_Byte(CA);
                      Send_Byte(CA);
                      return -1;
                    }
                    /* erase user application area */
										FLASH_Unlock();						//解锁
                    FLASH_If_Erase(APPLICATION_ADDRESS);//This function does an erase of all user flash area
										FLASH_Lock();             //上锁
										
										Send_Byte(ACK);
										Send_Byte(CRC16);
                  }
                  /* Filename packet is empty, end session */
                  else
                  {
                    Send_Byte(ACK);
                    file_done = 1;
                    session_done = 1;
                    break;
                  }
                }
                /* Data packet */
                else  //文件信息保存完后开始接收数据
                {
                  memcpy(buf_ptr, packet_data + PACKET_HEADER, packet_length);
									
									/*----------------------------------------------------------------------------------------------*/
									BufferIn=buf;
									for (j = 0; j < packet_length; j += 16) //每次解密16字节
									{
										//解密数据包
										aesDecrypt(BufferIn,bufferOut); //由于参数使用的是指针,所以解密后依旧存在buf里面
										BufferIn+=16;
									}
									/*----------------------------------------------------------------------------------------------*/
								
                  ramsource = (uint32_t)buf;
                  
                  /* Write received data in Flash */                                   //这个size参数是自己加进入的,便于判断文件传输完成 
                  if (FLASH_If_Write(&flashdestination, (uint32_t*) ramsource, (uint16_t) packet_length/4, size)  == 0)
                  {//写入FLASH  
                    Send_Byte(ACK);
                  }
                  else /* An error occurred while writing to Flash memory */
                  {
                    /* End session */
                    Send_Byte(CA);
                    Send_Byte(CA);
                    return -2;
                  }
                }
                packets_received ++;
                session_begin = 1;
              }
          }
          break;
        case 1:
          Send_Byte(CA);
          Send_Byte(CA);
          return -3;
        default://检验错误
          if (session_begin > 0)
          {
            errors ++;
          }
          if (errors > MAX_ERRORS)
          {
            Send_Byte(CA);
            Send_Byte(CA);
            return 0;
          }
          Send_Byte(CRC16); //发送校验值
          break;
      }
			
      if (file_done != 0)
      {
        break;
      }
    }
    if (session_done != 0) //文件发送完成
    {
      break;
    }
  }
  return (int32_t)size;
}

Hex合并以及Hexbin
首次下载代码时为了方便需要合并bootloader和APP的hex文件,Hex合并本论坛有人已经提供了一个很好的方法 (http://www.openedv.com/thread-70162-1-1.html),转成一个hex文件后通过上面那个PC软件,可以直接生成bin文件,之后通过超级终端接通串口传输过去就行了。

无线方式传输
我试过用电脑蓝牙传输(使用超级终端发送),接收方也用蓝牙,可以实现升级文件的传输,但是一般客户不会使用电脑蓝牙来发送,只有笔记本有,台式需要蓝牙适配器,当然使用USB转串口来实现升级也是不错的选择,但是需要个USB转串口芯片,也可以直接改修串口发送函数改成USB发送,加上USB驱动就行了。综合考虑还是在产品的APP通过ymodem协议发送会比较符合现在客户的主流需求,安卓系统的我在网上有找到java现成的ymodem发送代码,但是苹果系统如果使用OC进行开发,我目前还没有找到,希望有资源的坛友能提供,下面需要java代码的ymodem协议的可以在这个网址搜   
安卓手机也可以下载有些通用的串口助手,有些也有带ymodem协议。至于其他的无线方式也是一样的。
整个升级过程分为以下步奏:
1.完成ymodem移植,修改官方ymodem串口发送以及修改flash的一些操作(操作前解锁,操作完上锁),修改ymodem.h的宏配置,对应编译器的bootloader区和APP代码区的地址
2.移植aes.c的代码,添加到ymodem接收函数中
3.target界面修改APP的代码区地址,写入跳回Bootloader的条件,接收到串口字符’1’后往指定地址写入0xAAAA,软复位在bootloader判断这个地址是否是0xAAAA(这个写入我是另外开辟了1Kflash专门用于存储掉电不丢失数据区,比如0xAAAA就是),是则升级后跳回APP
4.修改附件提供的PCAES256加密软件,用VS编译器重新将环境改为X86C代码(.c文件)生成DLLC#调用,C#代码中替换下关键字即可,如果我附件中的软件能直接用则不需要做任何修改(直接能用的概率不高)
5.合并两个hex文件后,通过PC软件加上16字节的密匙后自动生成bin
6.下载超级终端,设置为ymodem发送文件,首先发送两个字符‘1’,进入bootloader后发送文件完成升级

PC软件

刚拿到这个软件的作者(网址在上面有提到)时会出现如下报警,经修改后可以正常使用。
11.png

VS如何生成DLL文件让PC端软件能够正常使用,先根据下面这个网址操作一遍生成dll工程
2.jpg
3.png
12.png

接着先打开项目工程
4.png

先将平台修改为X86
7.png
8.jpg
9.png
10.png

修改完后编译一遍,可以看到多了一个x86的文件夹
13.png

之后将Debug里面有关MYAES2565个文件都copyx86->debug里面,如下
14.png

接下来要做的就是用这个“MYAES256.dl”替代作者的那个“AES256.dll”了,替换关键字
5.jpg

修改完后编译程序,PC软件就可以正常运行了,密匙根据自己的MCU解密匙来写,如下
15.png

生成一个bin在桌面,之后用“超级终端”发送这个bin文件就可以了
18.png

升级资料分享.zip

15.23 MB, 下载次数: 99972

我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2353
金钱
2353
注册时间
2015-7-26
在线时间
600 小时
 楼主| 发表于 2016-7-3 18:28:48 | 显示全部楼层
代码是前段时间写的,现在整理起来有点麻烦,可能有写漏的地方,码了一天字,希望对需要的人有用,也请大神指导提出错误的地方
我的博客:http://blog.csdn.net/itdo_just
回复 支持 1 反对 0

使用道具 举报

  离线 

3

主题

2112

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3935
金钱
3935
注册时间
2013-11-22
在线时间
721 小时
发表于 2016-7-3 22:25:03 | 显示全部楼层
这个好! 多谢分享~
回复 支持 反对

使用道具 举报

  离线 

3

主题

549

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1375
金钱
1375
注册时间
2015-2-3
在线时间
194 小时
发表于 2016-7-3 23:47:15 | 显示全部楼层
好详细啊,支持!
回复 支持 反对

使用道具 举报

  离线 

4

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2015-9-16
在线时间
86 小时
发表于 2016-7-4 09:19:40 | 显示全部楼层
不错,以前虽然也用Ymode+IAP方式更新,但是没有做到你的这么详细以及全面化,点个赞。
回复 支持 反对

使用道具 举报

  离线 

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2015-6-29
在线时间
100 小时
发表于 2016-7-4 09:21:44 | 显示全部楼层
好详细啊,支持
我是菜鸟
回复 支持 反对

使用道具 举报

  离线 

22

主题

678

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
3959
金钱
3959
注册时间
2015-11-5
在线时间
1193 小时
发表于 2016-7-4 09:42:23 | 显示全部楼层
很好的经验分享,非常感谢楼主的无私奉献!
佛前一跪三千年
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2353
金钱
2353
注册时间
2015-7-26
在线时间
600 小时
 楼主| 发表于 2016-7-4 09:49:09 | 显示全部楼层
本帖最后由 229382777@qq.com 于 2016-7-4 09:50 编辑
yklstudent 发表于 2016-7-4 09:15
mark,谢谢楼主的分享
楼主上位机VS用的是多少版本的?
加密库文件源码方便分享下

加密用的是AES256,原理基本看懂,主要还是看我附件中提供的一个AES动图很很清晰的了解整个加密过程,有些高数部分的知识也不会很难,后来我上网找了一下,有现成的加密代码可以拿看了下代码基本和动图一致,MCU端的在工程的aes.c里面,加解密都在里面,PC端的也是调用的这个C文件,只是转成dll给C#调用了,你直接看我aes.c这个文件然后对应那个动图来理解就好了,版本是VS2010,2012用过也能直接打开工程
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-2-2
在线时间
5 小时
发表于 2016-7-4 10:37:35 | 显示全部楼层
可以!学习了,谢谢楼主
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2353
金钱
2353
注册时间
2015-7-26
在线时间
600 小时
 楼主| 发表于 2016-7-5 11:30:07 | 显示全部楼层
也希望各位能多分享些项目经验
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2353
金钱
2353
注册时间
2015-7-26
在线时间
600 小时
 楼主| 发表于 2016-7-6 21:58:27 | 显示全部楼层
另外请教个问题,一般如果硬件上不加eeprom,想要保存掉电不丢失的数据,又需要频繁改动这些数据,显然写flash不太现实,会擦写坏,如果记录擦写次数,到达指定次数后换个地址写也比较麻烦,如果有装电池可以使用后备寄存器来保存,那么请问还有其他方式吗?
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-7-1
在线时间
2 小时
发表于 2016-7-7 10:47:29 | 显示全部楼层
支持下
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-7-7
在线时间
0 小时
发表于 2016-7-7 10:49:29 | 显示全部楼层
支持,讲解的很透彻,资料很全,谢谢!!
回复 支持 反对

使用道具 举报

  离线 

11

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2016-6-12
在线时间
89 小时
发表于 2016-7-7 15:17:46 | 显示全部楼层
感谢分享,初学者收藏了!~
回复 支持 反对

使用道具 举报

  离线 

0

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-3-17
在线时间
38 小时
发表于 2016-7-7 22:48:21 | 显示全部楼层
大牛,学习...
回复 支持 反对

使用道具 举报

  离线 

13

主题

297

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2037
金钱
2037
注册时间
2012-5-26
在线时间
288 小时
发表于 2016-7-7 23:38:17 来自手机 | 显示全部楼层
谢谢分享呀,正好用到加密那个,明天研究下
回复 支持 反对

使用道具 举报

  离线 

2

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
344
金钱
344
注册时间
2015-9-24
在线时间
37 小时
发表于 2016-7-9 10:48:45 | 显示全部楼层
为楼主点赞  mark
回复 支持 反对

使用道具 举报

  离线 

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2014-11-23
在线时间
97 小时
发表于 2016-7-9 11:41:20 | 显示全部楼层
资料很好,谢谢分享!!
回复 支持 反对

使用道具 举报

头像被屏蔽

  离线 

65

主题

280

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2013-8-11
在线时间
28 小时
发表于 2016-7-10 11:45:38 | 显示全部楼层
谢谢楼主!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

  离线 

0

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2016-7-5
在线时间
43 小时
发表于 2016-7-19 10:22:06 | 显示全部楼层
谢谢谢谢谢谢楼主....学习学习
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-7-4
在线时间
2 小时
发表于 2016-7-20 09:32:54 | 显示全部楼层
楼主辛苦,好东西呀
回复 支持 反对

使用道具 举报

  离线 

3

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-7-12
在线时间
6 小时
发表于 2016-7-20 09:40:40 | 显示全部楼层
很详细,谢谢!
回复 支持 反对

使用道具 举报

  离线 

11

主题

79

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-8-1
在线时间
53 小时
发表于 2016-7-25 09:24:42 | 显示全部楼层
好帖,谢谢分享
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-10-24
在线时间
1 小时
发表于 2016-8-2 20:45:38 | 显示全部楼层
好帖,学习
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手入门

积分
36
金钱
36
注册时间
2015-12-1
在线时间
5 小时
发表于 2016-8-9 14:08:05 | 显示全部楼层
非常棒,最近刚好在研究这个东西。
回复 支持 反对

使用道具 举报

  离线 

6

主题

113

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2011-2-28
在线时间
6 小时
发表于 2016-8-18 17:00:54 | 显示全部楼层
谢谢楼主的分享,很好的思路。
我会很乐意与你交流的。
回复 支持 反对

使用道具 举报

  离线 

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2016-6-10
在线时间
17 小时
发表于 2016-8-18 17:05:13 | 显示全部楼层
楼主好帖
回复 支持 反对

使用道具 举报

  离线 

1

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-8-5
在线时间
6 小时
发表于 2016-8-30 16:04:47 | 显示全部楼层
这个好,刚好在研究,开发板的例程,只能帮助理解IAP,不实用。
回复 支持 反对

使用道具 举报

  离线 

9

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
936
金钱
936
注册时间
2013-7-16
在线时间
77 小时
发表于 2016-9-18 09:57:33 | 显示全部楼层
在程序中我使用的升级方式是通过串口发送字符‘1’(可自行修改),串口收到字符‘1’后,向指定的地址写入0xAAAA,然后使用软复位回到bootloader,bootloader中判断那个地址是不是0xAAAA,如果是则升级,升级完成后擦除这个地址的flash内容跳到APP,如果不是则跳直接回到APP执行,由于升级不可能频繁升,所以这里不用担心把falsh擦写坏。”  这里我刚开始写的时候跳转也是这样子做的,自动跳转,但是有个问题就是如果写入的APP错误,无法正常运行,那么这个设备就再也升级不了。PS: 我做过的项目使用到和你的差不多, 不过还要加上一个硬件加密和软件加密的防止人家破解,传输协议自己写的。   
回复 支持 反对

使用道具 举报

  离线 

25

主题

638

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1085
金钱
1085
注册时间
2012-4-25
在线时间
131 小时
发表于 2016-9-18 10:06:17 | 显示全部楼层
一般不是什么工业级产品,搞什么IAP,搞什么加密,吃饭没事干啊,随便加个读保护不就行了,量产时候人为成本增加。
1-1
回复 支持 反对

使用道具 举报

  离线 

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-8-31
在线时间
11 小时
发表于 2016-9-18 11:18:00 | 显示全部楼层
多谢分享,学习
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2353
金钱
2353
注册时间
2015-7-26
在线时间
600 小时
 楼主| 发表于 2016-9-18 12:11:36 | 显示全部楼层
mygod 发表于 2016-9-18 10:06
一般不是什么工业级产品,搞什么IAP,搞什么加密,吃饭没事干啊,随便加个读保护不就行了,量产时候人为成本 ...

人为成本没有增加,加密是软件里面实现的,难道你们的产品连代码都不用烧写吗。另外加密也是因为IAP才需要,不用的话确实读保护就够了,读保护也是代码实现,不需要厂线增加任何工序
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2353
金钱
2353
注册时间
2015-7-26
在线时间
600 小时
 楼主| 发表于 2016-9-18 12:14:18 | 显示全部楼层
cookles 发表于 2016-9-18 09:57
“在程序中我使用的升级方式是通过串口发送字符‘1’(可自行修改),串口收到字符‘1’后,向指定的地址写入 ...

写入APP怎么会错误?用文件传输协议有容错机制,而且就算你真的传输中途断了数据,直接重开机再次重新开始接收就行了
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

9

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
936
金钱
936
注册时间
2013-7-16
在线时间
77 小时
发表于 2016-9-18 14:18:33 | 显示全部楼层
229382777@qq.co 发表于 2016-9-18 12:14
写入APP怎么会错误?用文件传输协议有容错机制,而且就算你真的传输中途断了数据,直接重开机再次重新开 ...

可能是我表达的不清楚, 我说的APP错误并不一定是说写入的错误。 而是下载了一个错的的APP,  没有通过写入0XAAAA 标志来转到Bootloader升级的功能。 那么上电后Bootloader跳转到APP后将没法跳回到Bootloader 来升级。
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2353
金钱
2353
注册时间
2015-7-26
在线时间
600 小时
 楼主| 发表于 2016-9-18 16:50:35 | 显示全部楼层
cookles 发表于 2016-9-18 14:18
可能是我表达的不清楚, 我说的APP错误并不一定是说写入的错误。 而是下载了一个错的的APP,  没有通过写 ...

你这种情况就更不可能发生了,你都是调试好完全没问题的代码才发给客户进行升级,这种问如果出现题你在调试的时候就可以通过JLink重烧了,到客户那里肯定要杜绝这种问题啊
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

9

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
936
金钱
936
注册时间
2013-7-16
在线时间
77 小时
发表于 2016-9-18 23:07:26 | 显示全部楼层
229382777@qq.co 发表于 2016-9-18 16:50
你这种情况就更不可能发生了,你都是调试好完全没问题的代码才发给客户进行升级,这种问如果出现题你在调 ...

原来我也是这样想的,但是我boss说这是给想要破解的人一个突破口。  所以能避免的一定要做。
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2353
金钱
2353
注册时间
2015-7-26
在线时间
600 小时
 楼主| 发表于 2016-9-19 08:29:12 | 显示全部楼层
本帖最后由 229382777@qq.com 于 2016-9-19 08:30 编辑
cookles 发表于 2016-9-18 23:07
原来我也是这样想的,但是我boss说这是给想要破解的人一个突破口。  所以能避免的一定要做。

我是在跳回bootloader的时候把APP全都删了,如果别人想要通过跳回bootloader烧入破解程序的话之前那段APP已经不存在了,目前我觉得想破解只能破解AES加密,那样的话就看破解成本和自己研发成本之间的权衡了,而且我上面有提到"暗锁",如果实在避免不了就把暗锁加上
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

9

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
936
金钱
936
注册时间
2013-7-16
在线时间
77 小时
发表于 2016-9-19 08:39:50 | 显示全部楼层
229382777@qq.co 发表于 2016-9-19 08:29
我是在跳回bootloader的时候把APP全都删了,如果别人想要通过跳回bootloader烧入破解程序的话之前那段APP ...

我也用的AES加密,不过AES加密是对称加密, 通讯两端的密钥是完全一样的。 所以只要一方的密钥被拿到, 那么通讯过程也就完全透明了。  现在STM32 的破解费 只要几千块。 只要有钱可赚就会有人想要破解你的产品。
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2353
金钱
2353
注册时间
2015-7-26
在线时间
600 小时
 楼主| 发表于 2016-9-19 09:29:05 | 显示全部楼层
cookles 发表于 2016-9-19 08:39
我也用的AES加密,不过AES加密是对称加密, 通讯两端的密钥是完全一样的。 所以只要一方的密钥被拿到,  ...

密匙给拿到那代码肯定会泄露,避免不了你就试试加暗锁吧,参考链接
http://www.openedv.com/thread-64685-1-1.html
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

9

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
936
金钱
936
注册时间
2013-7-16
在线时间
77 小时
发表于 2016-9-19 09:51:13 | 显示全部楼层
229382777@qq.co 发表于 2016-9-19 09:29
密匙给拿到那代码肯定会泄露,避免不了你就试试加暗锁吧,参考链接
http://www.openedv.com/thread-6468 ...

加暗锁这个方法不错, 就是实现起来相对复杂一些。  现在流行的都是软加密和硬加密相结合。 这样破解起来成本大大增加。
回复 支持 反对

使用道具 举报

  离线 

8

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2015-9-1
在线时间
161 小时
发表于 2016-9-21 14:09:40 | 显示全部楼层
感谢大神分享
回复 支持 反对

使用道具 举报

  离线 

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2015-12-28
在线时间
26 小时
发表于 2016-9-22 11:08:32 | 显示全部楼层
666感谢分享!
回复 支持 反对

使用道具 举报

  离线 

4

主题

53

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-3-9
在线时间
54 小时
发表于 2016-9-25 20:40:39 | 显示全部楼层
MARK!!!!!!
回复 支持 反对

使用道具 举报

  离线 

13

主题

313

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2012-7-20
在线时间
94 小时
发表于 2016-10-7 00:16:04 来自手机 | 显示全部楼层
mark,,,,,
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-10-20
在线时间
0 小时
发表于 2016-10-20 10:47:05 | 显示全部楼层
好帖,必须赞
回复 支持 反对

使用道具 举报

  离线 

78

主题

905

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1550
金钱
1550
注册时间
2013-4-15
在线时间
111 小时
发表于 2016-11-7 13:57:13 | 显示全部楼层
aes部分研究研究
回复 支持 反对

使用道具 举报

  离线 

4

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2016-5-28
在线时间
14 小时
发表于 2016-11-9 15:03:41 | 显示全部楼层
非常感谢
回复 支持 反对

使用道具 举报

  离线 

0

主题

6

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-10-20
在线时间
5 小时
发表于 2016-11-15 11:14:23 | 显示全部楼层
谢谢分享!!!
回复 支持 反对

使用道具 举报

fuhongyu321 该用户已被删除
发表于 2016-12-7 17:49:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

  离线 

6

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
341
金钱
341
注册时间
2015-9-22
在线时间
32 小时
发表于 2016-12-7 18:08:25 | 显示全部楼层
牛人啊,不知道是工作多久做出来的产品呢
嵌入式开发微信公众号:嵌入式STM32软硬件开发
STM32交流,加好友,Q707372788
STM32交流群:383260480
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-20 21:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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