STM32 CANbootloader 升级功能设计开发(3)主要逻辑功能实现

free-jdx 2020-11-25 11:41:22 9335
1. 前言

最后这部分内容,主要是一些逻辑关键功能;
例如,

  • bootloader如何调整到app地址段执行?
  • 如何解析CAN数据?
  • 如何防止CAN设备变砖?
2. bootloader跳转app功能实现

app起始地址0x8004000
bootloader的烧写地址仍是0x08000000

(1)修改app程序相关设置

keil软件编译时需要修改烧写地址成8004000

keil进入Linker点击“edit”,修改源码改为0x08004000

(2)bootloader跳转接口实现

    if(*((uint32_t *)EXE_FLAG_START_ADDR)== EXE_FLASH_MAGICNUMBER )
    {
        JumpToApplication(START_ADDR);
    }

接口实现如下:
注意: 跳转之前必须清楚外设状态,避免外设初始化冲突

void CAN_BOOT_JumpToApplication(uint32_t Addr)
{
  static pFunction Jump_To_Application;
  __IO uint32_t JumpAddress; 
  /* Test if user code is programmed starting from address "ApplicationAddress" */
  if (((*(__IO uint32_t*)Addr) & 0x2FFE0000 ) == 0x20000000)
  { 
    /* Jump to user application */
    JumpAddress = *(__IO uint32_t*) (Addr + 4);
    Jump_To_Application = (pFunction) JumpAddress;
    __set_PRIMASK(1);
    /* Initialize user application's Stack Pointer */
    __set_MSP(*(__IO uint32_t*)Addr);

    /*must reset£¬or can not succeed to jump to App/UpBootloader*/
    MX_CAN_DeInit();
    MX_GPIO_DeInit();
    HAL_DeInit();

    Jump_To_Application();
  }
}

(3)app程序设置部分

  • 重定位中断向量表

  • 开启所有中断

  • 复位RCC

进入main函数时,设置如下:

    SCB->VTB = 0x08004000;

    __set_PRIMASK(0);

    HAL_RCC_DeInit();
3. CAN命令解析

(1)通过CAN接收中断设置的标志位进行判断

    if(CanRxFlag){
      CAN_ExecutiveCmd(&RxBuf);
      CanRxFlag = 0;
    }

(2)CAN cmd定义

CBL_CMD_LIST CMD_List = 
{
  .Erase = 0x00,      //擦除
  .WriteInfo = 0x01,  //设置参数
  .Write = 0x02,      //写数据
  .Check = 0x03,      //检测节点是否在线
  .SetBaudRate = 0x04,    //设置波特率
};

具体如何解析CAN 命令,这里就不累述了,比较简单

3. 添加强制刷机功能

原因:这里主要是用于CAN设备如果出现系统错误,无法正常进入bootloader之后,变成砖

方法: 进入bootloader会响应一个上位机的强制刷机命令,如果接收到,就强制擦除环境变量,然后强制进入bootloader,避免成砖;

实现如下:

    do
    {
        HAL_Delay(1);
        i++;
        if (CanRxFlag)
        {
            if (0x84 ==RxBuf.StdId)
            {
                {
                    HAL_FLASH_Unlock();
                    FLASH_PageErase(APP_START_ADDR);
                    HAL_FLASH_Lock();
                    break;
                }
            }           
        }
        if(1000 < i)
        {
            break;
        }
    }
    while (1);
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
free-jdx
红包 73 17 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区