OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 34457|回复: 60

STM8的IAP 远程更新bootloader底层程序 你学不会可以骂我

  [复制链接]

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
发表于 2018-11-28 15:11:26 | 显示全部楼层 |阅读模式
第一次来这里分享自己的心得,在开源电子网转了很久也没见到一份精简的代码(优秀的代码不少啊),今天给大家讲讲STM8的IAP


STM8 IAP可以做什么
    做远程程序更新,我们只需要烧入底层程序(boot),就可以像手机更新系统那样来更新我们单片机的软件,当然出厂也是可以连boot和app都烧进去的
这里不多废话 讲重点
我们STM8使用IAR软件开发,我们需要给boot定义一个地址,这里定义地址为0x8000到0x88F0,为了方便大家看懂并且学习,我截图截整个工程
这是boot的地址
TP@L6U@7F0J%{}G_L%}%))U.png
至于为什么选择0x88F0 我们根据实际编译出的程序大小自由选择 一般要保证选择的flash足够 我这里用STVP查看我的程序截止于0x88B0 截图如下
6~~MAG%DI6OOFWFZ[0SU~Q8.png
这是APP的地址    0x8900 0x9FFF APP这里就不方便截图了  大家可以写一个简单的串口APP程序或者闪灯程序 十分简单的


这里大家可能会问 如何设置地址,就像第一张图 IAR软件是在一个文件中 lnkstm8l151f3.icf 为了方便大家可以像我一样可以把这个文件添加到工程中
   我的文件地址是:\IAR\stm8\config,这个地址取决于你安装IAR的根目录地址,添加工程文件大家不会的可以百度一下,选择文件夹点击鼠标右键,
   找到对应的芯片型号即可
V]~}~X@057Q_U8]`5G7ZNPL.png

这里还需要将这个文件引用到工程中,我测试过,不引用也是没问题的,多做一步也是很简单的
IR@{[P]SECU%VDO`U$EIYF5.png

然后编译工程,烧入板子,我们的boot程序就弄好了

下面给大家讲讲程序 ,我们的程序尽量简洁(因为STM8Lflash太小),编译优化我选择了中等
代码贴出来方法大家移植
[mw_shl_code=c,true]#include "usart.h"
#include "string.h"
///////////////////////////////////////////////////////////////////
//函数名称:main                                                ///
//功能描述:程序入口,处理程序更新                              ///
//作    者:baishuyuan                                          ///
//日    期:2018/11/26                                          ///
//注意事项:程序不可大于APP起始地址                             ///
///////////////////////////////////////////////////////////////////
const u8 FLASHKEY = 0xFF;//APP标志位
#define MAIN_USER_Start_ADDR     ((uint32_t)0x8000+0xB00-4)//用户代码的起始地址
#define MIN_USER_Start_ADDR     (MAIN_USER_Start_ADDR+4)//用户代码的起始地址 字节偏移5个字节
u16 APP_BIT_ADDR   =  0x1000;//用户代码的起始地址
#define PWR_HOLD_GPIO           GPIOD
#define PWR_HOLD_GPIO_Pin           GPIO_Pin_0
/*******************************************************************************
**函数名称:void delay(unsigned int ms)     Name: void delay(unsigned int ms)
**功能描述:大概延时
**入口参数:unsigned int ms   输入大概延时数值
**输出:无
******************************************************************************/
void delay(unsigned int ms)
{
  unsigned int x , y;
  for(x = ms; x > 0; x--)           /*  通过一定周期循环进行延时*/
    for(y = 1000 ;  y > 0 ; y--);
}

//定义指向函数的指针类型
typedef void ( *AppMainTyp)(void);

uint32_t FLASH_ReadWord(uint32_t Address)
{
return(*(PointerAttr uint32_t *) (uint16_t)Address);      
}

#include "stm8l15x_itc.h"
   //重新初始化STM8的中断向量表  把它重新定义到APP的中断向量中
void STM8_HanderIqr_Init(void)
{
  disableInterrupts();   //关闭中断  
  uint8_t Index;       
  FLASH_Unlock(FLASH_MemType_Program);
  for(Index = 1; Index < 0X20;Index++)
  {
   if(FLASH_ReadWord(0X8000+4*Index)!=(0X82000000+MIN_USER_Start_ADDR+Index*4))
   {
    FLASH_ProgramWord(0X8000+4*Index,0X82000000+MIN_USER_Start_ADDR+Index*4);
   }
  }
  FLASH_Lock(FLASH_MemType_Program);
}
//跳转到用户代码
void goto_app(void)
{
    //重定义STM8的中断向量
    STM8_HanderIqr_Init();
    //跳转至APP
    asm("LDW X,  SP ");
    asm("LD  A,  $FF");
    asm("LD  XL, A  ");
    asm("LDW SP, X  ");
    asm("JPF $8900");//0x8900 是APP的首地址
}
   
/*******************************************************************************
**函数名称:void EEPROM_Byte_Write(unsigned int address , unsigned char date)
**功能描述:向EEPROM中固定地址写入一个字节数据
**入口参数:unsigned int address , unsigned char date
            address  :要写入数据的存储地址
              date   :一个字节数据
**输出:无
*******************************************************************************/
void EEPROM_Byte_Write(unsigned int address , unsigned char date)
{
  
  FLASH_SetProgrammingTime(FLASH_ProgramTime_TProg); //设定编程时间为标准编程时间
  
  //MASS 密钥,解除EEPROM的保护
  FLASH_Unlock(FLASH_MemType_Data);
  
  FLASH_ProgramByte(address , date);  //把数据写入相应的存储地址

while(FLASH_GetFlagStatus(FLASH_FLAG_EOP) == 1);     //等待编程结束
}
/**********************************************************************
* 函数名称:  XOR_Inverted_Check
* 功能描述:数据的异或取反校验
* para:
inBuf: 需检测的字符串
inLen: 所需检测的字符串长度
***********************************************************************/
u8  XOR_Inverted_Check(unsigned char* inBuf, unsigned char inLen)
{
  u8 check = 0, i;

  for (i = 0; i < inLen; i++)
  {
    check ^= inBuf;
  }
  check = ~check;
  return check;
}
u8 Write_App(u8 * Write_Data,u8 Write_Len)
{
    static u32 addr = MIN_USER_Start_ADDR;//得到flash地址
    u8 i = 0;
    for(i=3;i<(Write_Len-1);i++)
    {
      if(i<(Write_Len-1))
      {
        FLASH_ProgramByte(addr , USART_RX_BUF);  //把数据写入相应的存储地址
      }
      addr++;//为下次写入做准备
    }
    if(Write_Len<24)
    {
      EEPROM_Byte_Write(APP_BIT_ADDR,FLASHKEY);
      addr=MAIN_USER_Start_ADDR;//重置flash写地址
    }
    return i;

}
                                                   

void Memset()
{
  memset(USART_RX_BUF,0,USART_RX_STA);
  USART_RX_STA=0;
}
void main()
{
  u8 STR[]={0x7b,0x05,0xf2,0x03,0x70,'\r','\n','\0'};
  u32 i=0;
  disableInterrupts();   //关闭系统总中断
   GPIO_DeInit(GPIOD);
/* Port D in output push-pull 0 */
  GPIO_Init(GPIOD,GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
  GPIO_Init(PWR_HOLD_GPIO, PWR_HOLD_GPIO_Pin, GPIO_Mode_Out_PP_Low_Slow); //默认all电源为关 D0 推挽-输出低-高速
  GPIO_SetBits(PWR_HOLD_GPIO, PWR_HOLD_GPIO_Pin);
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); //内部时钟为1分频 = 16Mhz
  FLASH_Unlock(FLASH_MemType_Program);//MASS 密钥,解除FLASH的保护
  FLASH_Unlock(FLASH_MemType_Data);//MASS 密钥,解除EEPROM的保护
  FLASH_SetProgrammingTime(FLASH_ProgramTime_TProg); //设定编程时间为标准编程时间
  while(FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET);
  //如果用户代码更新完成标记存在  则表示当前已经有APP代码  直接运行
  if(FLASH_ReadByte(APP_BIT_ADDR+1)==0 && FLASH_ReadByte(MIN_USER_Start_ADDR)==0x82)//出厂首次烧录入口
  {
//    FLASH_ProgramByte(APP_BIT_ADDR , FLASHKEY);  //写入更新完成标志位
//    goto_app();  //运行APP
  }
  else if(FLASH_ReadByte(MIN_USER_Start_ADDR)==0x82 && FLASH_ReadByte(APP_BIT_ADDR)==FLASHKEY && FLASH_ReadByte(APP_BIT_ADDR+1)!=0)//关机重启设备入口
  {
//    goto_app();  //运行APP
  }
  else//更新APP入口
  {
//    if( FLASH_ReadByte(APP_BIT_ADDR)!=0x00)//标志位清空 这段是APP的
//    {
//      FLASH_EraseByte(APP_BIT_ADDR);
//    }
//    for(i=MAIN_USER_Start_ADDR;i<0x9FF0;i++)//限定地址不可超过0x9FF0,清空flash
//    {
//      FLASH_EraseByte(i);  //把数据写入相应的存储地址
//    }
  }
  enableInterrupts();   //使能系统总中断
  //等待USART1接收字符中断产生,中断服务函数在  stm8l15x_it.c文件里的 函数 INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
  UART1_Init(9600);//串口初始化
  UART1_TX_STR(STR);//接收第一帧数据
  while(1)  
  {  
    UART1_TX_STR(STR);//发送测试数据
    delay(1000);//短暂延迟
    i=0xFFFFF;
    while(i>10)
    {
      i--;
    };
    if(UPDATE_APP_OK)UPDATE_APP_OK++;//串口接收完成标志位
    if(UPDATE_APP_OK>5)//接收完成了
    {
      UPDATE_APP_OK=0;
      if((USART_RX_BUF[USART_RX_STA-1])==//CRC
         (XOR_Inverted_Check(USART_RX_BUF,USART_RX_STA-1)))
      {
        if(USART_RX_STA>5 && USART_RX_STA<=USART_RX_LEN)
        {
          if(Write_App(USART_RX_BUF,USART_RX_STA)==(USART_RX_LEN-1))
          {
            UART1_TX_STR(STR);//持续接收
          }
          else
          {
            Memset();
            STR[3]=0x05;
            STR[4]=0x76;
            UART1_TX_STR(STR);//go to app sending data
//            goto_app();//进入更新后的APP
          }
        }
      }
      Memset();
    }
  }
}[/mw_shl_code]


还有usart.c的代码

[mw_shl_code=c,true]#include "usart.h"
u8 USART_RX_BUF[USART_RX_LEN];
u16 USART_RX_STA=0;
u8 UPDATE_APP_OK = 0;
/******************************************************************************
**函数名称:void UART1_Init(unsigned int baudrate)
**功能描述:初始化USART模块
**入口参数:unsigned int baudrate  -> 设置串口波特率
**输出:无
******************************************************************************/
void UART1_Init(unsigned int baudrate)
{
  CLK_PeripheralClockConfig(CLK_Peripheral_USART1 , ENABLE); //使能USART1时钟
  USART_Init(USART1,                //设置USART1
            baudrate,               //波特率设置
            USART_WordLength_8b,    //数据长度设为8位
            USART_StopBits_1,       //1位停止位
            USART_Parity_No,        //无校验
            (USART_Mode_Rx | USART_Mode_Tx));  //设置为发送接收双模式
  
  USART_ITConfig(USART1, USART_IT_RXNE , ENABLE);
  USART_Cmd(USART1 , ENABLE);
}
//串口发送函数
void UART1_TX_STR(unsigned char * str)
{
  u16 STRLEN = 0;
  while(str[STRLEN] != '\0')
  {
    USART_SendData8(USART1 , str[STRLEN]);   
    while(USART_GetFlagStatus(USART1 , USART_FLAG_TXE) == 0);
    STRLEN++;
  }
}

/**
  * @brief USART1 RX / Timer5 Capture/Compare Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
  u8 Res=0;
  if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  {
    Res=USART_ReceiveData8(USART1);  //(USART1->DR);//读取接收到的数据
    USART_ClearITPendingBit(USART1,USART_IT_RXNE);   //清除中断标志位
    if(USART_RX_STA<USART_RX_LEN)
    {
      UPDATE_APP_OK=1;//接收到数据了 接收完成标志位
      USART_RX_BUF[USART_RX_STA] = Res;
      USART_RX_STA++;
    }
   }
}[/mw_shl_code]

usart.h的代码

[mw_shl_code=c,true]#ifndef __USART_H
#define        __USART_H
#include "stm8l15x.h"
#define USART_RX_LEN 24//可接收的数据长度
extern u8 UPDATE_APP_OK ;
extern u8 USART_RX_BUF[USART_RX_LEN];
extern u16 USART_RX_STA;
void UART1_Init(unsigned int baudrate);

void UART1_TX_STR(unsigned char * str);
#endif[/mw_shl_code]

这些代码都比较简单,就是根据通讯协议传输APP的烧录文件,一次写20个字节,小于20个则认为APP的程序已经是最后一帧
着重给大家讲讲那几个flash地址,我在eeprom写了两个地址,分别是0x1000和0x1001,0x1000是更新标志位,0x1001是出厂烧录标志位,
   这个位以后每更新一次程序我都会在APP中将他加1个,以此记录次数

下面截图部分通讯协议方便大家参考
6FTCZRB]DC4VAD$U@MFRQ0Y.png O{YA~YEKA16H[%@2Q@~7J2L.png
3.命令
蓝色为 MCU->HOST
红色为 HOST->MCU  

5.校验和
将前面各字节异或
6.APP 更新
发送更新命令后,原有的 app 将立马擦除,继而进入 bootloader 层, 然后发送 ok 以请求更
新数据,更新完毕后发送
go_to_App
如果发送的更新数据小于 20(不连协议帧),系统将认为这是最后一帧数据,平时数据必须等
20,如有刚好 20 个结束,可发送空参数  


可能有人会问,烧录文件发什么,这个根据你上位机来,什么方便发什么,IAR可以生成几种文件,方法自行百度

简单的给大家讲讲更新的思路,上位机请求,APP随机写eeprom中更新次数,清空更新完成标志位,重启单片机
  在boot中擦除APP程序,发送命令请求数据,写入数据完成继续发送,重复至更新完成,更新完成后将更新完成
  标志位写入,重定义中断向量表,跳转至APP

我在想要不要附上工程,最后决定附上boot工程,至于APP工程,有愿意相信楼主的可以加我QQ,1285973921,为了方便大家学习
  我用STM32F103C8T6写了个模拟上位机发送更新数据

实验1boot.rar (8.46 MB, 下载次数: 16695)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2020-10-26 17:38:57 | 显示全部楼层
之前上位机软件分享错了,重新发出链接  链接:https://pan.baidu.com/s/15eJgu9HdP1YzN9H24Yq2VQ
提取码:hc1t
复制这段内容后打开百度网盘手机App,操作更方便哦
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2020-4-21
在线时间
1 小时
发表于 2020-7-27 16:49:31 | 显示全部楼层
学习了,谢谢楼主
回复 支持 1 反对 0

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-3-28
在线时间
3 小时
发表于 2020-9-1 10:21:49 | 显示全部楼层
感谢!
回复 支持 1 反对 0

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2019-9-3 09:16:13 | 显示全部楼层
附上app工程   链接:https://pan.baidu.com/s/1JIrrLBuaUa2dzRrQdDXnfw
提取码:1mel
复制这段内容后打开百度网盘手机App,操作更方便哦
回复 支持 1 反对 0

使用道具 举报

26

主题

1533

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6365
金钱
6365
注册时间
2015-8-25
在线时间
1003 小时
发表于 2018-11-28 15:15:23 | 显示全部楼层
帮忙顶下
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-12-17
在线时间
9 小时
发表于 2018-12-19 14:10:54 | 显示全部楼层
请问楼主你的附件档案用的IAR是哪个版本?我打开不正常,可能版本太低了.
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2018-12-19 15:22:31 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2018-12-19 15:23:13 | 显示全部楼层
收藏了啊
回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2018-12-19 17:52:58 | 显示全部楼层
zhoulilin 发表于 2018-12-19 14:10
请问楼主你的附件档案用的IAR是哪个版本?我打开不正常,可能版本太低了.

7.3.1.0
回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2018-12-19 17:56:28 | 显示全部楼层
zhoulilin 发表于 2018-12-19 14:10
请问楼主你的附件档案用的IAR是哪个版本?我打开不正常,可能版本太低了.

回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2018-12-19 17:57:48 | 显示全部楼层
zhoulilin 发表于 2018-12-19 14:10
请问楼主你的附件档案用的IAR是哪个版本?我打开不正常,可能版本太低了.

C:\Users\Administrator\Desktop\GPRU1EW)Q$%5B@X{3_O%5D.png
回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2018-12-19 17:58:46 | 显示全部楼层
zhoulilin 发表于 2018-12-19 14:10
请问楼主你的附件档案用的IAR是哪个版本?我打开不正常,可能版本太低了.

回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2018-12-19 18:03:53 | 显示全部楼层
zhoulilin 发表于 2018-12-19 14:10
请问楼主你的附件档案用的IAR是哪个版本?我打开不正常,可能版本太低了.

我看属性里的详细信息版本号是7.3.1.0  但是我安装时安装包是的V1.301
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-12-17
在线时间
9 小时
发表于 2018-12-19 19:49:24 | 显示全部楼层
谢谢,用2.10.2的可以打开了.
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-10-5
在线时间
34 小时
发表于 2018-12-20 21:27:33 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2014-6-26
在线时间
74 小时
发表于 2018-12-27 11:34:58 | 显示全部楼层
你好楼主,你这个是不是必须要有一个上位机硬件和工程先把串口助手发送的BIN文件存下来,然后以20字节的间隔分N次发送给下位机进行更新?
如果将要更新程序的下位机与电脑端的串口助手直连,是不是就实现不了?串口助手都是将文件一次性发完。
回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2019-1-2 17:01:15 | 显示全部楼层
国行者 发表于 2018-12-27 11:34
你好楼主,你这个是不是必须要有一个上位机硬件和工程先把串口助手发送的BIN文件存下来,然后以20字节的间 ...

嗯,的模拟程序就是串口助手一次发给STM32,STM32在分包发给STM8,为什么要做分包呢,比如你的bin文件30k,你就得定义30k的数据长度,STM8没那么大内存去定义30k的数组的,如果你不定义数组串口发下来直接写flash,我试过9600波特率,会丢很多数据,意思就是falsh还没写完,新的数据又来了
回复 支持 反对

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2014-6-26
在线时间
74 小时
发表于 2019-1-4 14:13:45 | 显示全部楼层
momo最可爱 发表于 2019-1-2 17:01
嗯,的模拟程序就是串口助手一次发给STM32,STM32在分包发给STM8,为什么要做分包呢,比如你的bin文件30k ...

好的,多谢楼主。
回复 支持 反对

使用道具 举报

11

主题

66

帖子

0

精华

高级会员

Rank: 4

积分
643
金钱
643
注册时间
2018-4-17
在线时间
152 小时
发表于 2019-2-25 11:05:25 | 显示全部楼层
谢谢楼主,请问一下,IAP和APP都要使用中断时是怎么处理的
回复 支持 反对

使用道具 举报

1

主题

57

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1069
金钱
1069
注册时间
2018-3-8
在线时间
179 小时
发表于 2019-3-26 08:38:58 | 显示全部楼层
谢谢楼主,学习了
回复 支持 反对

使用道具 举报

0

主题

295

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2019-3-26
在线时间
9 小时
发表于 2019-4-10 09:00:43 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2019-4-12 17:46:45 | 显示全部楼层
STM32xpiggy 发表于 2019-2-25 11:05
谢谢楼主,请问一下,IAP和APP都要使用中断时是怎么处理的

单片机同一时间只做一件事 IAP和APP不会同一时间一起使用中断  重定义中断向量
回复 支持 反对

使用道具 举报

2

主题

57

帖子

0

精华

高级会员

Rank: 4

积分
532
金钱
532
注册时间
2014-3-3
在线时间
51 小时
发表于 2019-4-13 14:45:43 | 显示全部楼层
感谢,非常好的文章.楼主超级棒
回复 支持 反对

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2017-6-1
在线时间
26 小时
发表于 2019-5-16 20:45:52 | 显示全部楼层
楼主,你的串口是中断接收吧,那你APP里的中断受不受影响,我问下。
回复 支持 反对

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2017-6-1
在线时间
26 小时
发表于 2019-5-16 20:49:53 | 显示全部楼层
zxd74180 发表于 2019-5-16 20:45
楼主,你的串口是中断接收吧,那你APP里的中断受不受影响,我问下。

我的意思是从APP跳回到BL开启更新之后,再触发串口接收中断进入的是哪个。STM8有没有SYSTEM_RESET函数
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2019-4-27
在线时间
19 小时
发表于 2019-5-17 18:14:39 | 显示全部楼层
没毛病肯定顶你一下
回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2019-5-23 14:51:47 | 显示全部楼层
zxd74180 发表于 2019-5-16 20:45
楼主,你的串口是中断接收吧,那你APP里的中断受不受影响,我问下。

没有受到影响
回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2019-5-23 14:52:24 | 显示全部楼层
zxd74180 发表于 2019-5-16 20:49
我的意思是从APP跳回到BL开启更新之后,再触发串口接收中断进入的是哪个。STM8有没有SYSTEM_RESET函数

有复位函数  看门狗寄存器
回复 支持 反对

使用道具 举报

2

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
979
金钱
979
注册时间
2019-1-16
在线时间
220 小时
发表于 2019-5-28 16:39:19 | 显示全部楼层
收藏了,IAP 在线升级。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2017-8-13
在线时间
3 小时
发表于 2019-6-6 08:41:17 | 显示全部楼层
远程更新bootloader底层程序
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-6-13
在线时间
4 小时
发表于 2019-6-13 11:27:41 | 显示全部楼层
lvlv99 发表于 2019-6-6 08:41
远程更新bootloader底层程序

哈哈,老铁你真相了。ST官方有STM8的Bootloader源码和上位机部分源码,通信部分只提供给dll,boot源码支持stm8全系列A\F\S\L等等,STVD和IAR都行,汇编也有,上位机用的vs环境下C++写的。我看了下boot里uart是查询接收,APP中断和boot中断非独立,boot不能进行中断,感兴趣的可以去下来看看。
回复 支持 反对

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1665
金钱
1665
注册时间
2018-1-29
在线时间
159 小时
发表于 2019-8-5 14:31:06 | 显示全部楼层
感谢大佬分享!
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2013-7-25
在线时间
23 小时
发表于 2019-8-29 11:55:25 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1665
金钱
1665
注册时间
2018-1-29
在线时间
159 小时
发表于 2019-8-30 16:29:50 | 显示全部楼层
代码简洁,清晰易读,
就是.....
主机程序怎么编写? 能否给个例程? 还有APP编写时需要注意什么?能否给个例程?
回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2019-9-3 09:12:26 | 显示全部楼层
backup2k 发表于 2019-8-30 16:29
代码简洁,清晰易读,
就是.....
主机程序怎么编写? 能否给个例程? 还有APP编写时需要注意什么?能否给 ...

主机程序就是用XCOM发送bin文件给32,32把数据存起来,然后分包发送给STM8,可以加我qq发给你
回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2019-9-3 10:10:04 | 显示全部楼层
野指针 发表于 2019-6-13 11:27
哈哈,老铁你真相了。ST官方有STM8的Bootloader源码和上位机部分源码,通信部分只提供给dll,boot源码支 ...

仅供参考的喔  老铁有更好的代码可以贴出来的  我boot能否中断我没试过的  照理说是可以的 因为我每次上电中断向量是初始化的中断向量的,我boot不需要接收数据的,数据在app处理完的
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-6-9
在线时间
11 小时
发表于 2019-9-5 09:59:17 | 显示全部楼层
你的把更新的代码写入flash是在哪里啊?
回复 支持 反对

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1665
金钱
1665
注册时间
2018-1-29
在线时间
159 小时
发表于 2019-9-5 10:48:36 | 显示全部楼层
momo最可爱 发表于 2019-9-3 09:16
附上app工程   链接:https://pan.baidu.com/s/1JIrrLBuaUa2dzRrQdDXnfw
提取码:1mel
复制这段内容后 ...

感谢楼主分享,我有空用C语言写一个windows版本的主机端共享给大家!
回复 支持 反对

使用道具 举报

7

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-3-6
在线时间
38 小时
 楼主| 发表于 2019-9-10 12:14:03 | 显示全部楼层
backup2k 发表于 2019-9-5 10:48
感谢楼主分享,我有空用C语言写一个windows版本的主机端共享给大家!

顶  写好大家一起用
回复 支持 反对

使用道具 举报

8

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2017-1-14
在线时间
48 小时
发表于 2019-10-19 11:02:07 | 显示全部楼层
先顶,再学习,不懂之处,再来请教
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2017-9-1
在线时间
22 小时
发表于 2019-10-20 19:36:59 | 显示全部楼层
看不懂。先收藏。谢谢。
回复 支持 反对

使用道具 举报

1

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2019-10-19
在线时间
16 小时
发表于 2019-10-20 21:55:06 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2019-10-19
在线时间
16 小时
发表于 2019-10-21 00:35:01 | 显示全部楼层

收藏了,IAP 在线升级
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-3-7
在线时间
6 小时
发表于 2019-11-8 08:21:43 | 显示全部楼层

收藏了,IAP 在线升级!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-5-12
在线时间
3 小时
发表于 2019-11-27 14:12:50 | 显示全部楼层
Mark一下
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2019-12-10
在线时间
22 小时
发表于 2020-1-7 17:04:41 | 显示全部楼层
收藏的方式就是回复信息么
回复 支持 反对

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2018-7-10
在线时间
45 小时
发表于 2020-1-14 16:05:40 | 显示全部楼层
Mark一下
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-4-18
在线时间
1 小时
发表于 2020-4-18 07:14:09 | 显示全部楼层
Mark一下
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6661
金钱
6661
注册时间
2016-5-29
在线时间
909 小时
发表于 2020-4-24 09:28:18 | 显示全部楼层
学习了.也做了一个小于1K的BOOTLOADER,成功加载了APP.方法改进了一下..原理基本相同.
回复 支持 反对

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2020-3-12
在线时间
23 小时
发表于 2020-7-18 09:49:05 | 显示全部楼层
好东西,支持楼主
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-7-30
在线时间
3 小时
发表于 2020-7-31 11:32:04 | 显示全部楼层
这个必须再顶一下,感谢分享!!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 07:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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