技术专栏
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 命令,这里就不累述了,比较简单
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);
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
73
17
评论
打赏
- 分享
- 举报
评论
0个
手气红包
暂无数据
相关专栏
-
浏览量:3079次2020-11-21 16:48:04
-
浏览量:11854次2020-11-19 14:50:49
-
浏览量:2064次2020-08-03 11:21:38
-
浏览量:3036次2022-08-04 15:07:03
-
浏览量:1257次2023-07-14 21:50:29
-
2020-08-11 11:58:23
-
浏览量:1940次2020-08-03 11:18:53
-
浏览量:5033次2021-08-06 10:08:01
-
浏览量:802次2023-04-20 08:54:12
-
浏览量:1839次2019-06-27 15:56:35
-
浏览量:3129次2020-11-19 09:43:25
-
浏览量:4358次2021-08-20 16:38:06
-
2020-07-11 17:58:22
-
浏览量:3013次2020-11-16 09:27:48
-
浏览量:4462次2021-08-31 13:39:07
-
浏览量:1661次2020-12-12 23:36:24
-
浏览量:1766次2020-03-09 11:45:20
-
浏览量:1734次2020-11-12 10:53:19
-
浏览量:2319次2020-08-17 11:44:38
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注