STM32 CANbootloader 升级功能设计开发(3)主要逻辑功能实现
8708
free-jdx 2020-11-25 11:41:22

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个
时间排序
内容存在敏感词
手气红包
    0 条记录 第 0 /
    相关专栏
    置顶时间设置
    结束时间
    删除原因
    • 广告/SPAM
    • 恶意灌水
    • 违规内容
    • 文不对题
    • 重复发帖
    打赏作者
    易百纳技术社区
    free-jdx
    您的支持将鼓励我继续创作!
    打赏金额:
    ¥1 易百纳技术社区
    ¥5 易百纳技术社区
    ¥10 易百纳技术社区
    ¥50 易百纳技术社区
    ¥100 易百纳技术社区
    支付方式:
    微信支付
    支付宝支付
    易百纳技术社区 微信支付
    易百纳技术社区
    打赏成功!

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

    举报反馈

    举报类型

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

    详细说明

    审核成功

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

    审核失败

    失败原因
    备注
    Loading...
    易百纳技术社区
    确定要删除此文章、专栏、评论吗?
    确定
    取消
    易百纳技术社区
    每周任务
      去完成
      活动规则
      易百纳技术社区
      升级提醒
      升级

      恭喜您的社区称号由 升级为 “社区游民”

      同时为了感谢您对社区的支持,我们将送出xxx礼品一份, 记得领取哦~

      升级提醒
      易百纳技术社区

      惊喜礼包

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

      小包子的红包

      恭喜发财,大吉大利

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

        avatar