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 命令,这里就不累述了,比较简单

4. 添加强制刷机功能

原因:这里主要是用于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);

STM32 CANbootloader 升级功能开发(3)逻辑功能开发相关推荐

  1. 瀑布式开发、迭代式开发、螺旋开发、敏捷开发四种开发模式的区别

    1.瀑布模型是由W.W.Royce在1970年最初提出的软件开发模型,瀑布模型式是最典型的预见性的方法,严格遵循预先计划的需求分析.设计.编码.集成.测试.维护的步骤顺序进行. 步骤成果作为衡量进度的 ...

  2. 开发模式(敏捷开发,瀑布式开发,螺旋型开发,迭代开发,devOps开发)

    一. 敏捷开发 以人为核心.迭代.循序渐进的开发方式 简化文档,提取文档重点,主要在于人与人之间的沟通, 对开发产品进行迭代,最终完成开发. 迭代:迭代是指把一个复杂且开发周期很长的开发任务,分解为很 ...

  3. IM开发宝典:史上最全,微信各种功能参数和逻辑规则资料汇总

    1.引言 IM应用的初学者们,在补全了各种基础技术知识后(如果您仍不具备这些知识,建议马上阅读<新手入门一篇就够:从零开发移动端IM>),在动手编码实践时,很多时候纠结的并不是功能该如何实 ...

  4. 002 第一季SpringBoot2核心技术-核心功能:配置文件、Web开发(原生组件)、数据访问、单元测试、指标监控、原理解析:@Value、命令行参数、手动获取bean、自定义starter

    三.核心技术之- ->核心功能 1. 配置文件 1.1 文件类型 1.1.1 properties 同以前的properties用法 优先级高于yml的方式. 1.1.2 yaml 1) 简介 ...

  5. matlab 编arm_Matlab将实现STM32的代码生成、调试及建模功能

    ARM.意法半导体(ST)与MATHWORKS携手实现支持STM32微控制器的代码生成.调试及建模功能 引用来自:http://www.chinaaet.com/article/index.aspx? ...

  6. SAP UI5 应用开发教程之四十八 - 如何在 SAP UI5 应用里开发条形码扫描功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  7. NET开发邮件发送功能的全面教程(含邮件组件源码)(

    天,给大家分享的是如何在.NET平台中开发"邮件发送"功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下. AD:2013云计算架构师峰会精彩课程曝光 ...

  8. .NET开发邮件发送功能的全面教程(含邮件组件源码)

    今天,给大家分享的是如何在.NET平台中开发"邮件发送"功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知识 2 ...

  9. [转].NET开发邮件发送功能的全面教程(含邮件组件源码)

    转载自http://www.cnblogs.com/heyuquan/p/net-batch-mail-send-async.html 今天,给大家分享的是如何在.NET平台中开发"邮件发送 ...

最新文章

  1. 重温目标检测--Fast R-CNN
  2. JAVA学习day05
  3. MATLAB报错:未定义函数或变量
  4. 网摘精灵教程:网站流量爆涨的时空隧道
  5. linux删去分区的文件夹,如何恢复 Linux 分区下误删的文件?
  6. 鸿蒙开发-在JS中获取hml页面中Input输入的值
  7. DeleteDC() 与 ReleaseDC() 的区别 [转]
  8. LeetCode 696. Count Binary Substrings
  9. rockycapture_RockyCapture航线规划软件介绍文档
  10. 云服务器的主要用途是什么?
  11. Params属性的用法 (beginner)
  12. java源程序编译的结果_java源程序编译后
  13. Object C语法
  14. ps修改图片上文字的几种方法 图+文
  15. insert overwrite出现Table insclause-0 has 9 columns, but query has 10 columns.
  16. ros_多消息同步回调(Synchronizer)
  17. BGP简介-如何配置 EBGP(外部 BGP)
  18. android 锁机代码‘’,android手机锁机txt代码
  19. 终于解决了Chrome:“喔唷,崩溃啦“
  20. Cathy学习Java——GUI与正则表达式

热门文章

  1. Radon变换(Matlb)
  2. 【全年汇总】2023年CCF计算机图形学与多媒体会议截稿时间汇总(持续更新)
  3. 从ReentrantLock到AQS
  4. 2834: 小凯的书架
  5. Python解决抓取内容乱码问题(decode和encode解码)
  6. 阿里云服务器和域名购买教程
  7. SpringSecurity认证案例
  8. 液晶屏偏光片的选用规则?
  9. 交换机的各种工作模式
  10. ElasticSearch painless脚本实现自定义打分排序