基于CAN总线的STM32F103 Bootloader设计说明

1 设计目的

根据芜湖铂科新能源科技自身企业发展需要,开发一款基于ST公司STM32F103系列低成本通用MCU(具体开发用型号STM32F103C8T6微处理器,后续可扩展到同系列其他芯片)的CAN总线bootloader,方便应用程序的刷写。CAN设备采用周立功CAN卡(USBCAN-II、CAN-E-U、CAN-2E-U)。
本bootloader设计兼容使用沈阳广成 CAN卡。
本bootloader对存储器适当修改后可以用于STM32F103其他系列芯片。

2 专有信息

2.1 STM32F103

STM32F103 是意法半导体(ST)公司推出的一款基于 ARM Cortex-M3 内核的中低端32位微控制器。其主要特点如下:
高性能:ARM32位的Cortex-M3内核,最高工作频率可达72MHz;运算能力出色:支持单周期乘法和硬件除法,提高了数学运算的效率,对于需要大量数学计算的应用场景非常有帮助,比如信号处理、图像处理等。
丰富的资源:包括2个I2C接口(支持 SMBus/PMBus)、3个USART接口(支持ISO7816接口、LIN、IRDA接口和调制解调控制)、2个SPI接口(18M位/秒)、CAN接口(2.0B主动)、USB2.0全速接口等。
定时器资源充足:多达8个定时器,其中3个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入;还有1个16位带死区控制和紧急刹车、用于电机控制的PWM高级控制定时器;以及2个看门狗定时器(独立的和窗口型的)和1个系统时间定时器(24位自减型计数器)。定时器可用于实现定时任务、脉冲宽度调制(PWM)输出、频率测量等功能,在电机控制、电源管理等领域有广泛应用。
数模转换功能强大:内置2个12位模数转换器,1μs转换时间,多达16个输入通道,转换范围为0至3.6V,并且具有双采样和保持功能以及温度传感器。
电源管理灵活:供电范围宽:2.0-3.6V 的电源供电;低功耗模式多样:具有睡眠、停机和待机等多种低功耗模式,可以有效地降低系统的功耗,延长设备的续航时间,对于对功耗要求较高的应用场景非常重要,比如物联网设备、智能手表等。
易于开发:ST公司提供了完善的开发工具和文档支持。
STM32F103 系列微控制器广泛应用于智能家居、工业自动化、医疗设备、智能仪表、消费电子、汽车电子等各种嵌入式系统领域。

2.2 CAN总线

CAN总线的全称为控制器局域网络(Controller Area Network,CAN),是一种可以利用多物理介质传输数据的多主方式串行通信总线,如双绞线、光纤等,其中最为常用的是双绞线。CAN总线上的两条信号线分别被称为“CAN_H”和“CAN_L”,其使用方式是差分电压传送。

2.3 Bootloader

嵌入式系统引导加载程序(Bootloader)是BSP的一部分,是嵌入式系统上电后运行的第一段软件代码,是整个系统执行的第一步。Bootloader依赖于具体的嵌入式硬件结构,核心功能是操作系统引导(boot)和加载(load),此外还可以支持简单的用户命令交互、操作系统启动参数设置、系统自检和硬件调试等功能。Bootloader通常会存放在被称为boot ROM的非易失性的存储器(通常是NOR Flash ROM)中,可以存储操作系统映像、应用程序代码和用户配置数据等信息。
在汽车电子和工业控制应用中,常常需要设计基于CAN总线的Bootloader,用来实现对封装好外壳的ECU等控制器升级,而不用对控制器进行拆卸、拆解等,破环控制器的封装结构。方便系统的软件升级和维护。

2.4 编程方式

STM32F103将应用程序固化到片上Flash主要有二种方式:在电路编程(In Circuit Programing,ICP)、和在应用编程(In Application Programing,IAP)。其中,ICP是指在微控制器安装在用户应用电路板上时,使用JTAG协议、SWD协议或引导加载程序对其闪存进行编程的能力;IAP是一种在用户程序运行时对微控制器闪存重新编程的能力。本设计实现IAP,即在应用编程。参考手册上定义如下:
在这里插入图片描述

3 方案概述

本设计为基于STM32F103芯片,定制开发的在应用编程(IAP)Bootloader软件,由上位机程序,bootloader引导程序(也可称二次bootloader程序)和应用程序3部分组成。上位机为CAN刷写控制和操作界面,编程数据传输媒介为CAN总线,即上位机驱动CAN卡通过CAN向芯片传输flash文件,bootloader引导程序接收flash文件,并执行对flash的刷写工作,实现对芯片应用程序的更新。
其上位机采用VC++编写,以Windows应用的方式呈现。Bootloader引导程序在STM32CubeIDE 1.14.1中编码及编译,以C源码的方式呈现。用户应用也在STM32CubeIDE 1.14.1中编码,以C源码的方式作为应用示例呈现,作为应用开发的参考。

4 开发资源

4.1 硬件资源

STM32F103开发板或功能板(本开发基于BMS功能板实现)
ST-LINK仿真调试器
周立功USB-E-miniCAN卡、广成USBCAN-ICAN卡(兼容,在上位机上修改驱动)

4.2 软件资源

STM32CubeMX、STM32CubeIDE(用来开发嵌入式代码)
基于CubeIDE的最小系统代码框架【可以通过STM32CubeMX自动生成】+CAN驱动程序+flash驱动程序【可采用HAL库】
Visual Studio 2010(用来开发上位机)

4.3 其他资源

其它bootloader参考程序(如基于STM32G473的bootloader、基于S32K144的bootloader、基于F28335的bootloader)、电源、调试电脑、数据监测电脑和CAN卡。

4.4 参考资料

ST官网《RM0440 Reference manual STM32G4 series advanced Arm®-based 32-bit MCUs》2019~2024
《STM32G4入门与电机控制实战》 许少伦 2023-11-01
《嵌入式系统原理及应用—基于ARMCortex-M4体系结构》 杨永杰 许鹏 2018
《基于S32K148的车辆网关CANBootloader开发与实现》 袁锋、张伟等 2021
《STM32F0实战:基于HAL库开发》 高显升 2018

5 设计实现

5.1 核心思路

在线升级的核心思想是通过bootloader程序(bootloader引导程序,在STM32F103芯片中,因其内嵌Embedbed bootloader,可以称为二次Bootloader程序)更新程序(应用程序),这两个程序是相互独立的工程,被分别固化在STM32F103片上Flash的不同区间,为避免造成程序运行紊乱,需要对这两个程序所在的存储空间进行合理分配。
特别说明:本bootloader底层程序将不使用Embedbed bootloader区域(也称为自举程序),直接跳转到flash地址执行二次Bootloader程序。
在这里插入图片描述
片上Flash的空间分配,通过在开发环境中设置完成。初步地址分配如下:
Bootloader存放的地址初步分配为0x0800_0000~0x0800_4FFF,大小为20kB。
应用程序存放的地址初步分配为0x0800_5000~0x0800_FFFF,大小为44kB。
以上地址分配,开发完成后进一步优化空间
STM32 FLASH区域划分,不同芯片有差异
固件完成后,根据固件大小的实际情况,尽量降低bootloader的代码空间的大小。如以下的分配方案:

5.2 芯片内核资源分析

二次Bootloader程序通过仿真器烧录,且固化在芯片中,一般不需要更改。如需更改,需要使用仿真器再次烧录。应用程序可通过CAN总线多次重复烧录,不需要调试器。

5.2.1 时钟树(RM page47)

在这里插入图片描述
时钟可以在Cube MX中配置,本设计采用8MHz HSE时钟作为CAN时钟源。配置BxCAN时钟为72MHz。

5.2.2 看门狗

本bootloader程序不使能看门狗

5.2.3地址空间(参考RM page82 category 3)

更详细的地址空间,见参考手册。总的来说,地址分配如下:
SRAM 空间为:0x2000_0000 ~ 0x2000_4FFF (20kB)
FLASH 空间为:0x0800_0000 ~ 0x0800_FFFF (64kB,1kB一扇区)
在这里插入图片描述
地址空间可根据bootlaoder的代码进一步优化。
STM32F103C8片上有64kB嵌入式FLASH存储器。每扇区1kB。用户可对其中任意一个扇区擦除、编程和校验,而其他扇区不变。

5.2.4 CAN驱动模块

STM32F103C8T6只有1路CAN,为CAN1。本设计采用CAN1实现bootlaoder数据传输。
CAN模块的设计通过cube_MX实现。
使用CAN模块主要是实现:
1、初始化(重点在时钟设置、波特率和邮箱配置);
2、发送函数;
3、接收函数;
4、CAN接收中断服务函数。

波特率设置:设置波特率为500kpbs。
波特率公式:
在这里插入图片描述
在CAN时钟为72MHz的情况下:
1000kpbs: 预分频=3;SWJ=1;SEG1 = 7;SEG2 = 4 ((SEG1+ SEG2+1)预分频2)=72
500kpbs: 预分频=3;SWJ=1;SEG1 =15;SEG2 =8 ((SEG1+ SEG2+1)预分频2)=144
250kpbs: 预分频=6;SWJ=1;SEG1 =15;SEG2 =8 ((SEG1+ SEG2+1)预分频2)=288
注意:1、记得开启CAN外设时钟。

5.2.5 Flash驱动模块

参考《相关文档》里的相关描述,在cubeMX中配置。
需要注意几点
【1、 flash时钟】
【2、 擦除和编程函数的调用】
【3、 Flash编程字节顺序】

5.2.6 中断向量

外设中断向量表起始地址:0x08005004。中断向量需要在APP中修改。

5.2.7 编译和链接设置

在DL中设置分配IAP的地址空间,分配boot引导程序的存储空间为:

在这里插入图片描述

在开发环境中设置分配应用的地址空间,分配APP程序的存储空间为:

在这里插入图片描述

在开发环境中设置输出文件

输出HEX文件或S19文件【可正常输出,输出格式为S37】,本开发输出S19文件.srec。

5.3 启动分析

STM32系列的MCU上电启动后会自动跳转到0x08000000地址开始执行,其内部通过一张“中断向量表”来响应中断。程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序进行复位,复位完成后跳转到我们的main函数。

5.4 中断响应过程

5.4.1 原生应用中断响应过程

在没有bootloader的应用中,STM32“中断向量表”的起始地址是0x08000004,当中断来临,STM32的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。

5.4.2 Bootloader应用的中断响应过程

在具有bootloader的程序中,STM32复位后,还是从0x08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到IAP的main函数,新程序的复位中断向量起始地址为0x08000004+N+M),跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的main函数。
在main函数执行过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址 0x08000004中断向量表处,而不是新程序的中断向量表,程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中; 在执行完中断服务程序后,程序返回main 函数继续运行。

5.5 bootloader流程分析

基于CAN总线的bootloader升级流程

5.6 系统组成框架

bootloader系统组成
boot loader软件框图

6 软件设计

6.1 上位机设计

上位机端软件首先读取.srec文件,通过解析.srec文件内容,将其拆分为多条数据帧结构。上位机端软件与mcu端软件通过CAN总线进行通讯。
上位机端软件向MCU端软件发送的每帧数据都带有校验和,当MCU端程序接收到该帧数据后,通过校验和对接收数据进行确认。确认完毕后,MCU端软件将确认帧发送给上位机端软件,上位机端软件收到MCU端发送的确认帧后,再向MCU端软件发送下一帧数据;当上位机软件将全部数据发送完毕后,上位机端软件向MCU端软件发送数据的总长度,MCU端软件将该总长度与接收到的数据长度进行比较,将比较结果发送给上位机端软件,完成了整个数据的总校验。参考界面如下:
上位机与STM32G4系列兼容,不单独开发

6.2 bootloader软件设计

MCU端软件主要包括引导程序主要为二次bootloader程序,用来和上位机软件进行CAN总线通讯接收MCU程序可执行代码文件,并将接收到的可执行代码文件烧写到FLASH中,而且会在系统上电复位后会判断是执行FLASH烧写工作还是运行用户应用程序工作;
在这里插入图片描述

为保证接收数据的准确性和完整性,MCU端软件在接收数据的过程中,不执行对RAM或FLASH操作的相关代码;同时,关闭其他的外部中断,仅响应CAN总线接收中断,保证了数据接收的实时性。此外,MCU端软件将接收到的数据存储在外扩的FLASH中,等接收完全部数据后,再进行程序的烧写,防止在接收数据过程中出现意外而导致系统程序不能正常工作。
FLASH的烧写工作也是MCU端软件需要实现的重要功能。在擦除或读写FLASH之前,必须先执行相应的命令字序列,即在指定的FLASH地址处写入指定的指令代码。
向FLASH的指定地址中写入数据,需要四个总线周期。前两个是解锁周期,第三个是建立编程命令,最后一个周期完成向编程地址中写入编程数据。待写入的数据为.srec文件内容。
在这里插入图片描述

6.3 应用程序设计

应用程序软件需要对地址和输出文件进行配置,以确定地址分配和编程文件输出。代码部分不用特别处理。应用程序关注的重点:
【1、 LD文件对地址的分配】
【2、 中断向量的重定位】

7 设计总结

1、在开发环境上,使用STM32CubeIDE进行嵌入式软件开发是趋势。
2、bootloader的开发,可以形成系列化的平台方案,在具体的板级平台上做适应性修改。
3、开发过程应多测试,尽量少的使用flash资源。

STM32F103是意法半导体(STMicroelectronics)公司生产的一款32位微控制器。它内置了一个特殊的引导程序,称为Bootloader。这个引导程序能够在启动时加载不同的固件应用程序。 STM32F103Bootloader允许用户可以通过不同的通信接口(如串口、USB等)将新的固件下载到微控制器中。这个功能十分有用,因为不需要依赖外部编程器或调试器,我们可以通过简单的配置和通信设备,即可更新固件。 通过STM32F103Bootloader,我们可以进行以下操作: 1. 固件更新:使用PC上的编程工具,我们可以利用串口或USB接口将新的固件下载到STM32F103中。 2. 故障恢复:如果应用程序发生故障导致无法正常启动,我们可以通过Bootloader重新下载正确的固件,使微控制器恢复工作。 3. 自适应启动:在启动过程中,Bootloader可以检测外部设备或接口状态,然后相应地选择启动哪个固件,并根据需要引导到正确的应用程序。 在使用STM32F103Bootloader时,我们需要遵循特定的协议和通信规范,同时确保固件应用程序的正确性和稳定性。此外,需要注意的是,Bootloader和应用程序的共存需要合理的地址分配和内存布局,以避免冲突。 总之,STM32F103Bootloader为我们提供了一种方便快捷的方式来更新固件、故障恢复和自适应启动。这个功能对于需要频繁更新应用程序或具备灵活性和可靠性要求的项目非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值