STM32 CANbootloader 升级功能开发(3)逻辑功能开发
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.瀑布模型是由W.W.Royce在1970年最初提出的软件开发模型,瀑布模型式是最典型的预见性的方法,严格遵循预先计划的需求分析.设计.编码.集成.测试.维护的步骤顺序进行. 步骤成果作为衡量进度的 ...
- 开发模式(敏捷开发,瀑布式开发,螺旋型开发,迭代开发,devOps开发)
一. 敏捷开发 以人为核心.迭代.循序渐进的开发方式 简化文档,提取文档重点,主要在于人与人之间的沟通, 对开发产品进行迭代,最终完成开发. 迭代:迭代是指把一个复杂且开发周期很长的开发任务,分解为很 ...
- IM开发宝典:史上最全,微信各种功能参数和逻辑规则资料汇总
1.引言 IM应用的初学者们,在补全了各种基础技术知识后(如果您仍不具备这些知识,建议马上阅读<新手入门一篇就够:从零开发移动端IM>),在动手编码实践时,很多时候纠结的并不是功能该如何实 ...
- 002 第一季SpringBoot2核心技术-核心功能:配置文件、Web开发(原生组件)、数据访问、单元测试、指标监控、原理解析:@Value、命令行参数、手动获取bean、自定义starter
三.核心技术之- ->核心功能 1. 配置文件 1.1 文件类型 1.1.1 properties 同以前的properties用法 优先级高于yml的方式. 1.1.2 yaml 1) 简介 ...
- matlab 编arm_Matlab将实现STM32的代码生成、调试及建模功能
ARM.意法半导体(ST)与MATHWORKS携手实现支持STM32微控制器的代码生成.调试及建模功能 引用来自:http://www.chinaaet.com/article/index.aspx? ...
- SAP UI5 应用开发教程之四十八 - 如何在 SAP UI5 应用里开发条形码扫描功能试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- NET开发邮件发送功能的全面教程(含邮件组件源码)(
天,给大家分享的是如何在.NET平台中开发"邮件发送"功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下. AD:2013云计算架构师峰会精彩课程曝光 ...
- .NET开发邮件发送功能的全面教程(含邮件组件源码)
今天,给大家分享的是如何在.NET平台中开发"邮件发送"功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1) 邮件基础理论知识 2 ...
- [转].NET开发邮件发送功能的全面教程(含邮件组件源码)
转载自http://www.cnblogs.com/heyuquan/p/net-batch-mail-send-async.html 今天,给大家分享的是如何在.NET平台中开发"邮件发送 ...
最新文章
- 重温目标检测--Fast R-CNN
- JAVA学习day05
- MATLAB报错:未定义函数或变量
- 网摘精灵教程:网站流量爆涨的时空隧道
- linux删去分区的文件夹,如何恢复 Linux 分区下误删的文件?
- 鸿蒙开发-在JS中获取hml页面中Input输入的值
- DeleteDC() 与 ReleaseDC() 的区别 [转]
- LeetCode 696. Count Binary Substrings
- rockycapture_RockyCapture航线规划软件介绍文档
- 云服务器的主要用途是什么?
- Params属性的用法 (beginner)
- java源程序编译的结果_java源程序编译后
- Object C语法
- ps修改图片上文字的几种方法 图+文
- insert overwrite出现Table insclause-0 has 9 columns, but query has 10 columns.
- ros_多消息同步回调(Synchronizer)
- BGP简介-如何配置 EBGP(外部 BGP)
- android 锁机代码‘’,android手机锁机txt代码
- 终于解决了Chrome:“喔唷,崩溃啦“
- Cathy学习Java——GUI与正则表达式