1.引言
1.1.单片机开发BootLoader意义
单片机开发BootLoader的原因主要与其在嵌入式系统中的关键作用有关。BootLoader是硬件启动的引导程序,它在操作系统内核或用户应用程序运行之前执行。以下是单片机开发BootLoader的主要原因:
- 初始化硬件设备:当单片机上电或重启时,BootLoader会首先负责初始化计算机硬件设备,如处理器、内存、外设等。这些初始化操作确保系统硬件处于正确的状态,并为后续的操作做好准备。
- 加载操作系统:BootLoader通过读取存储设备上的指定位置(如非易失性存储器或硬盘的引导扇区)中的操作系统映像文件,将其加载到内存中。然后,它会将控制权转交给操作系统,使其开始执行。
- 提供启动选项:在某些单片机系统中,可能安装了多个操作系统或多个版本的操作系统。BootLoader可以提供一个菜单或交互界面,供用户选择要启动的操作系统。这使得用户可以在启动时选择不同的操作系统或配置[3]。
- 支持固件更新(OTA功能):某些BootLoader还提供了固件更新(OTA功能),允许在运行时通过网络或其他方式下载和安装新的固件版本。这对于保持系统的最新状态、修复错误或添加新功能非常有用[3]。
- 嵌入式系统的特殊需求:在嵌入式系统中,BootLoader的作用尤为重要。由于嵌入式系统通常没有像BIOS那样的固件程序,整个系统的加载启动任务就完全由BootLoader来完成。
总之,BootLoader是单片机系统启动的关键环节,它负责初始化硬件、加载操作系统,并为系统提供启动选项和固件更新等附加功能。这些功能使得单片机能够更灵活、更可靠地运行,满足各种应用需求。
1.2.BootLoader的主要功能
1.2.1. 系统启动与硬件初始化
在单片机系统中,BootLoader是系统上电或重启后首先执行的程序。它扮演着系统启动的“先锋”角色,负责进行一系列的硬件初始化操作。这些操作包括但不限于:
- 时钟系统初始化:设置单片机的时钟源和时钟频率,确保单片机以正确的速度运行。
- 内存初始化:配置单片机的内存系统,包括RAM、ROM或其他存储设备的初始化。
- 外设接口初始化:激活和配置单片机的外设接口,如GPIO、UART、SPI、I2C等。
- 中断系统初始化:设置中断向量表,确保系统能够正确响应外部和内部中断。
这些初始化步骤是确保单片机系统能够稳定、可靠运行的基础。
1.2.2. 加载与启动操作系统或应用程序
在完成硬件初始化后,BootLoader的另一个关键任务是加载并启动操作系统或用户应用程序。这通常涉及以下步骤:
- 读取映像文件:从非易失性存储器(如Flash、EEPROM等)中读取操作系统或应用程序的映像文件。
- 校验映像文件的完整性:通过校验和、CRC或其他方法验证映像文件的完整性,确保没有被篡改或损坏。
- 加载到内存:将映像文件加载到单片机的RAM中,准备执行。
- 跳转执行:将控制权转交给加载的程序,使其开始执行。
1.2.3. 提供用户交互与多系统支持
在某些复杂的单片机应用中,可能需要支持多个操作系统或应用程序的启动。此时,BootLoader可以提供一个简单的用户交互界面(如通过UART接口),让用户选择想要启动的系统或应用。这种灵活性在开发、调试或现场维护过程中非常有用。
1.2.4. 固件更新与远程管理
随着物联网(IoT)的兴起,远程更新和管理单片机固件变得越来越重要。BootLoader可以集成OTA(Over-the-Air)更新功能,允许通过无线网络或其他通信方式接收并安装新的固件版本。这不仅简化了固件更新的过程,还使得单片机系统能够持续接收安全更新和新功能。
1.2.5. 安全性与可靠性考虑
在设计和实现BootLoader时,安全性和可靠性是重要考虑因素。例如,可以通过加密和签名机制来确保固件映像的完整性和真实性,防止恶意软件的注入。此外,BootLoader还可以实现故障恢复机制,如在固件更新失败时回滚到之前的版本。
单片机开发BootLoader不仅是为了满足系统启动和硬件初始化的基本需求,还是为了实现多系统支持、远程管理、安全性和可靠性等高级功能。这些功能共同构成了现代单片机系统稳健、灵活和可维护的基石。
1.3.CAN总线简介
CAN总线是一种由Bosch公司在1986年开发的通信协议,最初用于汽车电子系统,现已广泛应用于工业自动化、医疗设备等多个领域。它支持多主控制,具有较高的实时性和可靠性,采用差分信号传输,具有较强的抗干扰能力。
CAN总线的通信原理基于仲裁机制,当多个设备同时发送数据时,通过仲裁决定数据传输的优先级。其消息结构包括帧起始、仲裁场、控制场、数据场、CRC校验和帧结束等部分。此外,CAN总线具备错误检测和处理能力,能够确保数据传输的准确性。
CAN总线的应用场景非常广泛,它不仅在汽车电子领域中用于发动机控制单元、ABS系统等,也在工业自动化中控制PLC与传感器之间的通信。此外,医疗设备、智能家居、船舶控制系统等也采用CAN总线进行数据交换,显示出其在多种环境中的适用性和灵活性。随着技术的进步,CAN总线也在不断地进行改进和扩展,以适应更广泛的应用需求。
2. ARM单片机BootLoader
2.1. BootLoader流程
当系统进入内存引导模式且ARM设备(基于Arm®内核)完成配置后,引导加载器代码会等待在CANx_Rx引脚上接收到一个帧。一旦检测到该帧,CAN引导加载器固件将立即启动以检查外部时钟频率。
图2展示了检查外部时钟频率的流程图。
2.2.CAN设置
ARM单片机的CAN模块兼容2.0A和2.0B(主动)规范,支持高达1 Mbit/s的比特率。它能够发送和接收带有11位标识符的标准帧以及带有29位标识符的扩展帧。
图3展示了仅使用标准标识符的CAN帧结构。
对于当前应用,CAN的设置如下:
- 标识符类型:使用标准标识符(非扩展)
- 比特率:初始时设置为125 kbps;在运行时,可以通过速度控制命令调整至最高1 Mbps。
发送设置(从ARM单片机到主机):
- 发送邮箱0:启用
- 发送邮箱1和发送邮箱2:禁用
- 发送标识符:包括(0x00, 0x01, 0x02, 0x03, 0x11, 0x21, 0x31, 0x43, 0x63, 0x73, 0x82, 0x92)
接收设置(从主机到ARM单片机):
- 同步字节:0x79位于RX标识符中,而不是数据字段。
- RX标识符:根据接收到的命令确定(0x00, 0x01, 0x02, 0x03, 0x11, 0x21, 0x31, 0x43, 0x63, 0x73, 0x82, 0x92)
- 错误检查:如果CAN_ESR寄存器中的错误字段(位[6:4])不是000b,则消息将被丢弃,并向主机发送NACK(否定应答)信号。
- FIFO溢出处理:在FIFO溢出的情况下,消息将被丢弃,并向主机发送NACK信号。
- 数据长度:传入消息可以包含1到8个字节的数据。
注意:CAN引导加载器固件一次仅支持一个节点,因此不支持CAN网络管理功能。
2.3.引导加载程序命令集
表2列出了支持的命令,本部分将对每个命令进行描述。
表2:CAN bootloader命令
命令名称 | 命令代码 | 命令描述 |
---|---|---|
获取版本和允许的命令(1) | 0x00 | 获取当前bootloader版本和支持的命令列表。当RDP(读保护)选项激活时,只有这个命令集可用。所有其他命令会被NACK,并且对设备没有效果。一旦RDP被移除,其他命令就会激活。 |
获取版本和读保护状态(1) | 0x01 | 获取bootloader版本和Flash存储器的读保护状态。 |
获取芯片ID(1) | 0x02 | 获取芯片ID。 |
速度设置 | 0x03 | 速度命令允许改变CAN运行时的波特率。 |
读取内存(2) | 0x11 | 从应用程序指定的地址开始,读取最多256字节的内存。 |
跳转到用户应用程序(2) | 0x21 | 跳转到位于内部Flash存储器或SRAM中的用户应用程序代码。 |
写入内存(2) | 0x31 | 从应用程序指定的地址开始,向RAM或Flash存储器写入最多256字节。 |
擦除Flash存储器(2) | 0x43 | 擦除一个或所有Flash存储器扇区。 |
启用写保护 | 0x63 | 为一些扇区启用写保护。 |
禁用写保护 | 0x73 | 禁用所有Flash存储器扇区的写保护。 |
启用读保护(1) | 0x82 | 启用读保护。 |
禁用读保护(1) | 0x92 | 禁用读保护。 |
注释:
- 当RDP(读保护)选项激活时,只有这个命令集可用。所有其他命令会被NACK,并且对设备没有效果。一旦RDP被移除,其他命令就会激活。
- 参考ARM单片机的数据手册了解这些命令有效的内存空间。
通信安全
每个数据包要么被接受(ACK响应),要么被丢弃(NACK响应):
- ACK消息 = 0x79
- NACK消息 = 0x1F
2.3.1. 获取命令
获取命令允许主机获取bootloader的版本和支持的命令。当bootloader接收到此命令时,它将bootloader版本和支持的命令代码传输给主机。
图4:get指令:主机端
主机发送的消息如下:
命令消息:标准ID(Std ID) = 0x00,数据长度码(DLC) = ‘不重要’。
ARM单片机发送消息的流程如下:
- 消息1: 标准ID(Std ID)= 0x00, 数据长度(DLC)= 1, 数据 = 0x79 - ACK(确认消息)
- 消息2: 标准ID = 0x00, DLC = 1, 数据 = N = 12 = 要发送的字节数减1(1 ≤ N + 1 ≤ 256)
- 消息3: 标准ID = 0x00, DLC = 1, 数据 = bootloader版本(0 < 版本号 ≤ 255)
- 消息4: 标准ID = 0x00, DLC = 1, 数据 = 0x00 - 获取命令
- 消息5: 标准ID = 0x00, DLC = 1, 数据 = 0x01 - 获取版本和读保护状态命令
- 消息6: 标准ID = 0x00, DLC = 1, 数据 = 0x02 - 获取芯片ID命令
- 消息7: 标准ID = 0x00, DLC = 1, 数据 = 0x03 - 速度设置命令
- 消息8: 标准ID = 0x00, DLC = 1, 数据 = 0x11 - 读取内存命令
- 消息9: 标准ID = 0x00, DLC = 1, 数据 = 0x21 - 跳转到用户应用程序命令
- 消息10: 标准ID = 0x00, DLC = 1, 数据 = 0x31 - 写入内存命令
- 消息11: 标准ID = 0x00, DLC = 1, 数据 = 0x43 - 擦除内存命令
- 消息12: 标准ID = 0x00, DLC = 1, 数据 = 0x63 - 启用写保护命令
- 消息13: 标准ID = 0x00, DLC = 1, 数据 = 0x73 - 禁用写保护命令
- 消息14: 标准ID = 0x00, DLC = 1, 数据 = 0x82 - 启用读保护命令
- 消息15: 标准ID = 0x00, DLC = 1, 数据 = 0x92 - 禁用读保护命令
- 消息16: 标准ID = 0x00, DLC = 1, 数据 = 0x79 - ACK(确认消息)
请注意,消息2中的"N"表示将要发送的字节数减1,这个值的范围是1到255(不包含1和包含256)。这意味着实际要发送的字节数是"N + 1",并且这个数值不能超过256。
2.3.2 获取版本和读取保护状态命令
获取版本和读取保护状态命令用于获取引导加载程序的版本和读取保护状态。当引导加载程序接收到这个命令时,它会向主机发送下面描述的信息(版本和两个值为0x00的虚拟字节)。
主机发送的消息如下:
命令消息:标准ID(Std ID) = 0x01,数据长度码(DLC) = ‘不重要’。
确认消息(ACK Message)包含:标准ID(Std ID) = 0x01,DLC = 1,数据 = 0x79 - ACK
ARM单片机发送的消息如下:
消息1:标准ID(Std ID) = 0x01,DLC = 1,数据 = ACK
- 说明:STM32发送了一个确认消息(ACK),表示它已经接收到了之前的命令或请求。
消息2:标准ID(Std ID) = 0x01,DLC = 1,数据[0] = bootloader版本(0 < 版本 ≤ 255),
示例:0x10 = 版本1.0
- 说明:STM32发送了一个消息,其中包含了引导加载程序(bootloader)的版本信息。在这个例子中,版本是以一个字节的十六进制形式发送的,0x10代表版本1.0。
消息3:可选消息1:标准ID(Std ID) = 0x01,DLC = 2,数据 = 0x00(byte1和byte2)
- 说明:STM32发送了一个可选的消息,这个消息有两个数据字节,但在这个特定的例子中,两个字节的值都是0x00。这可能是一个保留消息或用于将来扩展的消息,具体取决于通信协议的定义。
消息4:标准ID(Std ID) = 0x01,DLC = 1,数据 = ACK
- 说明:再次,STM32发送了一个确认消息(ACK),可能是在发送了版本信息或可选消息之后,以确认这些消息已被发送或处理。这有助于确保通信的完整性和可靠性。
2.3.3 获取ID命令
获取ID命令用于获取芯片ID(标识符)的版本。当引导加载程序接收到该命令时,它会将产品ID发送给主机。-
主机发送的消息如下:
命令消息:标准ID(Std ID) = 0x02,数据长度码(DLC) = ‘不重要’。
确认消息(ACK Message)包含:标准ID(Std ID) = 0x02,DLC = 1,数据 = 0x79 - 表示ACK
ARM单片机按照以下方式发送字节:
消息1:标准ID(Std ID) = 0x02,DLC = 1,数据 = ACK(对于当前消息和ACKs之外的DLC)
消息2:标准ID(Std ID) = 0x02,DLC = N(字节数 - 1。对于STM32,N = 1),数据 = PID(产品ID),其中字节0是MSB(最高有效位),字节N是产品ID的LSB(最低有效位)
消息3:标准ID(Std ID) = 0x02,DLC = 1,数据 = ACK = 0x79
2.3.4 速度命令
速度命令允许改变CAN运行时的波特率。这个命令仅在CAN作为正在使用的外设时才可用。
如果CAN接收到正确的消息但设置新波特率的操作失败,系统会生成一个重置,从而防止其进入或离开初始化模式。
主机发送的消息如下:
命令消息:标准ID = 0x03,DLC = 0x01,数据[0] = XXh,其中XXh根据要设置的波特率取以下值:
0x01:波特率 = 125 kbps
0x02:波特率 = 250 kbps
0x03:波特率 = 500 kbps
0x04:波特率 = 1 Mbps
ARM单片机发送字节的方式如下:
消息 1:标准ID = 0x03,DLC = 1,数据[0] = ACK = 0x79(如果接收到的消息正确,则使用旧的波特率;否则数据[0] = NACK = 0x1F)
消息 2:标准ID = 0x03,DLC = 1,数据[0] = ACK = 0x79(使用新的波特率)
2.3.5 读取内存命令
读取内存命令用于从RAM、Flash存储器以及信息块(系统内存或选项字节区域)中的任何有效内存地址读取数据。
当引导加载程序接收到读取内存命令时,它开始验证消息的内容:
- 命令的ID是否正确
- 读取保护(ReadOutProtection)是否被禁用或启用
- 要读取的地址是否有效
如果消息内容正确,则发送一个ACK消息,否则发送一个NACK消息。
在发送ACK消息后,它开始通过(N+1)条消息/8(因为每条消息包含8个字节)将所需的数据((N + 1)个字节)传输给应用程序,从接收到的地址开始。
主机发送的消息如下:
命令消息:
标准ID = 0x11,DLC = 0x05,data[0] = 0xXX:地址的最高有效位… data[3] = 0xYY:地址的最低有效位,data[4] = N:要读取的字节数(其中 0 < N ≤ 255)。
ARM单片机发送消息的方式如下:
ACK 消息:如果命令的内容正确,则标准ID = 0x11,DLC = 1,data[0] = ACK;否则 data[0] = NACK
数据消息 (N+1) / 8:标准ID = 0x11,DLC = 字节数,data[0] = 0xXX… data[字节数 - 1] = 0xYY
(注:这里 (N+1) / 8 表示数据消息可能会被分割成多个消息发送,每个消息包含8个字节的数据,直到发送完所有请求的数据。)
ACK 消息:在发送完所有请求的数据后,再次发送一个确认消息,标准ID = 0x11,DLC = 1,data[0] = ACK。
2.3.6 运行命令
运行命令用于执行下载的代码或应用程序指定的任何其他代码,通过跳转到指定的地址来实现。当引导加载程序接收到运行命令时,它会检查消息是否包含以下有效信息:
-
命令的ID是否正确
-
读取保护(ReadOutProtection)是否被禁用或启用
-
分支目标地址是否有效(data[0] 是地址的最高有效位(MSB),data[3] 是地址的最低有效位(LSB))
如果消息内容正确,它会发送一个ACK消息,否则发送一个NACK消息。
在发送ACK消息给应用程序之后,引导加载程序固件会执行以下操作: -
将引导加载程序所使用的外设寄存器初始化为其默认的复位值。
-
初始化用户应用程序的主栈指针。
-
跳转到接收到的‘地址 + 4’处所编程的内存位置(对应于应用程序的复位处理程序的地址)。
例如,如果接收到的地址是0x0800 0000,引导加载程序将跳转到在地址0x0800 0004处编程的内存位置。
通常,主机发送的是应用程序要跳转到的基本地址。
注意:
- 跳转到应用程序只有在用户应用程序正确设置向量表以指向应用程序地址时才能工作。
- Go命令的有效地址位于RAM或Flash存储器中(请参阅第3.1节以获取有关所用设备的有效内存地址的更多详细信息)。所有其他地址都被视为无效,并由设备发送NACK消息。
- 当将应用程序加载到RAM并跳转到它时,必须配置程序以使用偏移量运行,以避免与引导加载程序固件使用的第一个区域重叠(请参阅第2.3.1节以获取有关所用设备的RAM偏移量的更多详细信息)。
主机发送字节的方式如下:
运行命令消息:标准ID = 0x21,DLC = 0x04,data[0] = 0xXX:地址的最高有效位(MSB),…data[3] = 0xYY 地址的最低有效位(LSB)。
ARM单片机发送消息的方式如下:
确认消息(ACK message):
- 标准ID(Std ID)为 0x21
- 数据长度码(DLC)为 1
- 如果命令内容正确,则数据字段的第一个字节(data[0])为 ACK
- 否则,数据字段的第一个字节(data[0])为 NACK
2.3.7 写入内存命令
写入内存命令用于将数据写入RAM、Flash存储器或选项字节区域的任何有效内存地址(参见注释)。当引导加载程序接收到写入内存命令时(消息数据长度为5个字节,data[0]是地址的最高有效位(MSB),data[3]是地址的最低有效位(LSB),data[4]是要接收的数据字节数),它会检查接收到的地址。对于选项字节区域,起始地址必须是选项字节区域的基地址(参见注释),以避免意外写入该区域。
注意:请参阅第3.1节以获取所用设备的有效内存地址的更多详细信息。
如果接收到的地址有效,引导加载程序会发送一个ACK消息,否则会发送一个NACK消息并中止命令。当地址有效时,引导加载程序:
- 接收用户数据(N个字节),因此设备会接收N/8条消息(每条消息包含8个数据字节)
- 从接收到的地址开始将用户数据编程到内存中
- 在命令结束时,如果写入操作成功,引导加载程序会发送ACK消息;否则,它会向应用程序发送NACK消息并中止命令
ARM单片机要写入的数据块的最大长度为256字节。
如果向选项字节区域发出写入内存命令,在写入新值之前会擦除所有选项,并在命令结束时,引导加载程序会生成系统复位以考虑选项字节的新配置。
注意:
- 写入RAM时,用户不得与引导加载程序固件使用的内存重叠。
- 在写保护扇区执行写入操作时不会返回错误。
注意:如果起始地址无效,设备会发送NACK消息来拒绝该命令。
主机发送消息的方式如下:
命令消息:标准ID = 0x31,DLC = 0x05,data[0] = 0xXX: 地址的最高有效位(MSB),…, data[3] = 0xYY: 地址的最低有效位(LSB),data[4] = N-1(要写入的字节数减1),0 < N ≤ 255)。
然后主机发送N/8条消息
数据消息:标准ID = 0x31,DLC_1 = 1到8,data = byte_11, … byte_18…
数据消息_M:标准ID = 0x04,DLC_M = 1到8,data = byte_m1, …, byte_M8
注意:
- DLC_1 + DLC_2 + … DLC_M 的总和最大为256
- 每次发送消息后,主机都会从设备接收ACK或NACK消息
- 引导加载程序不检查数据的标准ID,因此可以使用从0h到0xFF的任何ID。建议使用0x04。
STM32发送消息的方式如下:
ACK消息:标准ID = 0x31,DLC = 1,如果命令内容正确,则data[0] = ACK,否则data[0] = NACK。
每次接收到消息后,如果命令内容正确,设备会发送一个ACK,否则发送一个NACK。但是,如图17所述,在接收到所有“数据消息”(N/8条消息)并将数据临时写入RAM后,如果消息内容没有损坏,引导加载程序会在请求的地址(Flash内存、RAM或选项字节)写入N个字节。然后,如果写入操作成功完成,设备会向主机发送一个ACK消息。
换句话说,在发送N/8条消息后,主机会连续收到两个ACK;第一个ACK是设备在正确接收到N/8条消息的最后一个后发送的,第二个ACK是在正确地将N/8条消息写入请求的地址后发送的。
2.3.8 擦除内存命令
擦除内存命令允许主机擦除Flash内存页。当引导加载程序接收到擦除内存命令且ROP(只读保护)被禁用时,它会向主机发送ACK消息。在发送ACK消息后,引导加载程序检查data[0]是否等于0xFF,如果是这种情况,则开始全局内存擦除操作,并在完成后发送ACK消息。否则(data[0]不等于0xFF),引导加载程序会根据主机定义开始擦除内存页(或多个页),并在每页擦除后发送一个ACK或NACK消息。
擦除内存命令规格:
-
引导加载程序接收一个包含N(要擦除的页数减1)的消息。N = 255是为全局擦除请求保留的。对于0 ≤ N ≤ 254,将擦除N + 1页。
-
引导加载程序接收(N + 1)个字节,每个字节包含一个页码。
注意:对写保护扇区执行擦除操作时不会返回错误。
主机发送消息的方式如下:
ID包含命令类型(0x43):
总擦除消息:标准ID = 0x43,DLC = 0x01,数据 = 0xFF。
按扇区擦除消息:标准ID = 0x43,DLC = 0x01到0x08,数据 = 参见产品数据手册。
在按页擦除的情况下,每次发送消息后,主机都会从设备接收ACK或NACK消息。
ARM单片机发送消息的方式如下:
ACK消息:标准ID = 0x43,DLC = 1,如果命令内容正确且ROP(只读保护)未激活,则data[0] = ACK,否则data[0] = NACK。
2.3.9 写保护命令
写保护命令用于启用对部分或全部Flash内存扇区的写保护。当引导加载程序接收到写保护命令时,如果ROP(只读保护)未启用,则向主机发送ACK消息;否则,发送NACK消息。
在发送ACK字节后,引导加载程序等待从应用程序接收Flash内存扇区代码。
在写保护命令结束时,引导加载程序发送ACK消息并生成系统重置以考虑选项字节的新配置。
注意:
- 请参阅第3.1节以获取有关所用设备扇区大小的更多详细信息。
- 不会检查要保护的扇区总数和扇区号,这意味着即使传递了一个具有错误的要保护扇区数或错误的扇区号的命令,也不会返回错误。
- 如果执行了第二次写保护命令,则由第一次命令保护的Flash内存扇区将变得不受保护,并且仅第二次写保护命令中传递的扇区将受到保护。
主机发送消息的方式如下:
命令消息:标准ID = 0x63,DLC = 0x01,data[0] = N(其中 0 < N ≤ 255)。
命令消息:标准ID = 0x63,DLC = 0x01…08,data[0] = N(其中 0 < N ≤ 255)。
每次发送消息后,主机都会从设备接收ACK或NACK消息。
ARM单片机发送消息的方式如下:
ACK消息:如果命令内容正确且ROP(只读保护)未激活,则标准ID = 0x63,DLC = 1,data[0] = ACK;否则data[0] = NACK。
2.3.10 取消写保护命令
取消写保护命令用于禁用所有Flash内存扇区的写保护。当引导加载程序接收到取消写保护命令时,如果ROP(只读保护)未启用,则向主机发送ACK消息;否则,发送NACK消息。在发送ACK消息后,引导加载程序会禁用所有Flash内存扇区的写保护。
在取消写保护命令结束时,引导加载程序发送ACK消息并生成系统重置以考虑选项字节的新配置。
主机发送的消息如下:
命令消息:标准ID = 0x73,DLC = 0x01,数据 = 00。
ARM单片机发送的消息如下:
ACK消息:如果命令内容正确且ROP(只读保护)未激活,则标准ID = 0x73,DLC = 1,data[0] = ACK;否则data[0] = NACK。
2.3.11 读保护命令
读保护命令用于启用Flash内存的读取保护。当引导加载程序接收到读保护命令时,如果ROP(只读保护)未启用,则向主机发送ACK消息;否则,发送NACK消息。在发送ACK消息后,引导加载程序会启用Flash内存的读取保护。
在读保护命令结束时,引导加载程序发送ACK消息并生成系统重置以考虑选项字节的新配置。
主机发送的消息如下:
命令消息:标准ID = 0x82,DLC = 0x01,data[0] = 00。
ARM单片机发送的消息如下:
ACK消息:标准ID为0x82,DLC为1,如果命令内容正确且ROP(只读保护)未激活,则data[0]为ACK,否则data[0]为NACK。
2.3.12 读取消保护命令
读取消保护命令用于禁用Flash内存的读取保护。当引导加载程序接收到读取消保护命令时,它会向主机发送ACK消息。在发送ACK消息后,引导加载程序会擦除所有Flash内存扇区,并禁用整个Flash内存的读取保护。如果擦除操作成功,引导加载程序会停用RDP(读取保护)。
在读取消保护命令结束时,引导加载程序会发送一个ACK消息并生成系统重置以考虑选项字节的新配置。
主机发送的消息如下:
命令消息:标准ID = 0x92,DLC = 0x01,数据 = 00。
ARM单片机发送的消息如下:
ACK消息:如果命令内容正确且ROP(只读保护)未激活,则标准ID = 0x92,DLC = 1,data[0] = ACK;否则data[0] = NACK。
3. 总结和展望
本文深入探讨了单片机开发中BootLoader的关键作用、主要功能以及CAN总线通信的基础,并对ARM单片机BootLoader的实现细节进行了详尽的描述。
3.1 BootLoader的重要性和功能
BootLoader作为单片机系统启动的核心,承担着初始化硬件设备、加载操作系统、提供启动选项、支持固件的OTA更新以及满足嵌入式系统特殊需求的重任。它不仅确保了系统的稳定和可靠运行,还通过提供多系统支持、远程管理和安全性保障,增强了系统的灵活性和可维护性。
3.2 CAN总线通信
CAN总线以其多主控制、高实时性、强抗干扰能力和错误检测处理机制,在汽车电子、工业自动化、医疗设备等领域发挥着重要作用。随着技术的发展,CAN总线不断改进和扩展,以适应更广泛的应用需求。
3.3 ARM单片机BootLoader
ARM单片机BootLoader的流程、CAN设置和命令集得到了细致的阐释。从BootLoader的启动、外部时钟频率的检查,到CAN模块的配置,再到丰富的命令集,包括获取版本、读取保护状态、芯片ID、速度设置、内存读写、跳转执行、擦除操作以及写保护等,每一环节都体现了对细节的严格把控和对安全的高度重视。
3.4 安全性和可靠性
安全性和可靠性是BootLoader设计的重中之重。通过加密、签名机制确保固件的完整性,故障恢复机制如回滚到旧版本,以及对写保护和读保护的精细控制,BootLoader为单片机系统的安全稳定运行提供了坚实保障。
3.5 展望
随着物联网和智能设备的发展,BootLoader的角色愈发重要。它不仅作为系统启动的第一道门槛,更是系统更新、维护和安全管理的关键环节。未来,BootLoader将更加智能化、安全化,以适应不断变化的技术需求和市场环境。
综上所述,BootLoader的开发和应用是确保单片机系统高效、安全运行的关键。本文的探讨不仅为开发者提供了宝贵的指导,也为单片机技术的应用进一步发展奠定了坚实的基础。