ARM单片机使用CAN总线部署BootLoader

1.引言

1.1.单片机开发BootLoader意义

单片机开发BootLoader的原因主要与其在嵌入式系统中的关键作用有关。BootLoader是硬件启动的引导程序,它在操作系统内核或用户应用程序运行之前执行。以下是单片机开发BootLoader的主要原因:

  1. 初始化硬件设备:当单片机上电或重启时,BootLoader会首先负责初始化计算机硬件设备,如处理器、内存、外设等。这些初始化操作确保系统硬件处于正确的状态,并为后续的操作做好准备。
  2. 加载操作系统:BootLoader通过读取存储设备上的指定位置(如非易失性存储器或硬盘的引导扇区)中的操作系统映像文件,将其加载到内存中。然后,它会将控制权转交给操作系统,使其开始执行。
  3. 提供启动选项:在某些单片机系统中,可能安装了多个操作系统或多个版本的操作系统。BootLoader可以提供一个菜单或交互界面,供用户选择要启动的操作系统。这使得用户可以在启动时选择不同的操作系统或配置[3]
  4. 支持固件更新(OTA功能):某些BootLoader还提供了固件更新(OTA功能),允许在运行时通过网络或其他方式下载和安装新的固件版本。这对于保持系统的最新状态、修复错误或添加新功能非常有用[3]
  5. 嵌入式系统的特殊需求:在嵌入式系统中,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禁用读保护。

注释:

  1. 当RDP(读保护)选项激活时,只有这个命令集可用。所有其他命令会被NACK,并且对设备没有效果。一旦RDP被移除,其他命令就会激活。
  2. 参考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处编程的内存位置。

通常,主机发送的是应用程序要跳转到的基本地址。

注意:

  1. 跳转到应用程序只有在用户应用程序正确设置向量表以指向应用程序地址时才能工作。
  2. Go命令的有效地址位于RAM或Flash存储器中(请参阅第3.1节以获取有关所用设备的有效内存地址的更多详细信息)。所有其他地址都被视为无效,并由设备发送NACK消息。
  3. 当将应用程序加载到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字节。

如果向选项字节区域发出写入内存命令,在写入新值之前会擦除所有选项,并在命令结束时,引导加载程序会生成系统复位以考虑选项字节的新配置。
注意:

  1. 写入RAM时,用户不得与引导加载程序固件使用的内存重叠。
  2. 在写保护扇区执行写入操作时不会返回错误。
    在这里插入图片描述
    注意:如果起始地址无效,设备会发送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

注意:

  1. DLC_1 + DLC_2 + … DLC_M 的总和最大为256
  2. 每次发送消息后,主机都会从设备接收ACK或NACK消息
  3. 引导加载程序不检查数据的标准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消息。

擦除内存命令规格:

  1. 引导加载程序接收一个包含N(要擦除的页数减1)的消息。N = 255是为全局擦除请求保留的。对于0 ≤ N ≤ 254,将擦除N + 1页。

  2. 引导加载程序接收(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消息并生成系统重置以考虑选项字节的新配置。

注意:

  1. 请参阅第3.1节以获取有关所用设备扇区大小的更多详细信息。
  2. 不会检查要保护的扇区总数和扇区号,这意味着即使传递了一个具有错误的要保护扇区数或错误的扇区号的命令,也不会返回错误。
  3. 如果执行了第二次写保护命令,则由第一次命令保护的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的开发和应用是确保单片机系统高效、安全运行的关键。本文的探讨不仅为开发者提供了宝贵的指导,也为单片机技术的应用进一步发展奠定了坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1451758.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

本地运行大语言模型(LLMs)

用例 像PrivateGPT、llama.cpp、Ollama、GPT4All、llamafile 等项目的流行度凸显了本地&#xff08;在您自己的设备上&#xff09;运行大型语言模型&#xff08;LLMs&#xff09;的需求。 这至少有两个重要的好处&#xff1a; 1.隐私&#xff1a;您的数据不会发送给第三方&a…

【odoo | XML-RPC】odoo外部API解读,实现跨系统间的通讯!

概要 文章注意对官方的XML-RPC进行解读实操&#xff0c;以python为例&#xff0c;给大家介绍其使用方式和调用方法。 内容 什么是odoo的外部API? Odoo 的外部 API 是一种允许外部应用程序与 Odoo 实例进行交互的接口。通过 API&#xff0c;可以执行各种操作&#xff0c;例如…

Determinant 一个翻译很不友好的名字 行列式 det(A)

Determinant 一个翻译很不友好的名字 行列式 det(A) flyfish determinant 美[dɪtɜːrmɪnənt] 英[dɪtɜːmɪnənt] adj. 决定性的n. 决定性因素 / <数>行列式 / 决定因素 / 方阵举一个最简单的例子说明行列式 假设有一个 2x2 矩阵 A&#xff1a; A ( 2 1 1 2…

React+TS前台项目实战(九)-- 全局常用组件弹窗Dialog封装

文章目录 前言Dialog公共弹窗组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局公共弹窗Dialog组件封装&#xff0c;将用到上篇封装的模态框Modal组件。有时在前台项目中&#xff0c;偶尔要用到一两个常用的组件&#xff0c;如 弹窗&#x…

问题(05)elementui 输入框里面禁止浏览器自动填充用户名密码、弹出浏览器历史密码提示框

问题描述 el-input&#xff0c;非密码框&#xff0c;在输入时&#xff0c; 问题1&#xff1a; 浏览器自动填充用户名密码。问题2&#xff1a;右边显示浏览器历史密码提示框。 问题解决 问题1&#xff1a;使用auto-complete"new-password" <input type"te…

11.3 Go 标准库的使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

大数据数据挖掘系统可视化设计艺术

1.系统背景 在我们实际进行数据挖掘研发过程中&#xff0c;为了验证某些算法在业务中的性能每次都需要去从头写代码&#xff0c;如果我们将我们研发的算法以模块化的思想封装起来&#xff0c;下次再使用的时候直接在系统中进行拖拉一下生成一个工作流&#xff0c;就能完成数据挖…

Advanced XUV Spectroscopy 成像采集设备的比较分析

设备简介 CCD-Andor&#xff1a; 类型&#xff1a;CCD相机 特点&#xff1a;高灵敏度、低噪声 应用&#xff1a;适用于弱光成像、高动态范围成像 sCMOS-PI&#xff1a; 类型&#xff1a;sCMOS相机&#xff08;Princeton Instruments&#xff09; 特点&#xff1a;高分辨率、…

cs与msf权限传递,以及mimikatz抓取win2012明文

cs传递shell给msf cs有一台上线主机&#xff1a; 1.msf开启监听&#xff1a; use exploit/multi/handler set payload windows/meterpreter/reverse_http&#xff08;注&#xff1a;这里是http,与cs上线的监听器一致&#xff09; set lhost 本机ip set lport 自己的端口号…

算法金 | 再见!!!K-means

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 今天我们来聊聊达叔 6 大核心算法之 —— k-means 算法。最早由斯坦福大学的 J. B. MacQueen 于 1967 年提出&#xff0c;后来经过许多…

GPT办公与科研应用、论文撰写、数据分析、机器学习、深度学习及AI绘图高级应用

原文链接&#xff1a;GPT办公与科研应用、论文撰写、数据分析、机器学习、深度学习及AI绘图高级应用https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247606667&idx3&sn2c5be84dfcd62d748f77b10a731d809d&chksmfa82606ccdf5e97ad1a2a86662c75794033d8e2e…

qmt量化交易策略小白学习笔记第31期【qmt编程之获取行业概念数据--如何获取概念成分股数据】

qmt编程之获取获取概念成分股数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取概念…

如何恢复红米手机中已删除的照片?(6种方法可用)

凭借出色的相机和实惠的价格&#xff0c;小米红米系列已成为全球知名品牌。然而&#xff0c;最近有些人抱怨他们在红米设备上丢失了许多珍贵的照片或视频&#xff0c;并希望弄清楚如何从小米手机中恢复已删除的照片。好吧&#xff0c;恢复小米设备上已删除的视频/照片并不难。只…

[Java基本语法] String类

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…

5.数据仓库与数据挖掘期末复习

ETL的含义Extract 、 Transformation、Load。ODS的全称Operational Data Store。 DW全称 Data WarehourseDM全称是Data Mart数据仓库数据抽取时所用到技术是增量、全量、定时、调度STAGE层作用是提供业务系统数据文件的临时存储ODS层作用ods提供业务系统细节数据长期沉淀MID层…

快速开发的UI框架:效率蹭蹭提高!!【送源码】

不知道各位用uniapp 开发移动端小程序或者网页&#xff0c;是否用UI框架。 我一般就用官方自带的&#xff0c;近期一个项目 用了uView, 感觉整体还不错&#xff0c;类似蚂蚁的风格。 特此推荐下&#xff0c;可以收藏一下&#xff0c;需要的时候记得来取哦&#xff01; 介绍 …

Java基础:Stream流和方法引用

一、Stream流 1.引言 Test&#xff1a;给定一个集合&#xff0c;如果想要筛选出其中以 "a" 开头且长度为3的元素&#xff0c;并添加到新集合中去&#xff0c;最后遍历打印&#xff0c;如何实现&#xff1f; public class Test {public static void main(String[] …

车载以太网测试

一、车载以太网的发展 IEEE&#xff1a; 电气与电子工程师协会&#xff0c;其中IEEE802.3工作小组致力于推进以太网相关标准的制定与完善&#xff0c;其发展主要经过一下三个阶段: 1.诊断/程序更新 2.智驾座舱 3.主干网 二、车载以太网协议&#xff08;OSI七层模型&#x…

老爷机带不动影视后期?云桌面了解一下

从黑白到彩色&#xff0c;从默片到有声&#xff0c;从2D到3D&#xff0c;影视工业经过百余年的演变&#xff0c;每一步技术的提升都试图让影视艺术更接近“真实”。电影特效技术的诞生&#xff0c;更是为影视作品的真实感实现了一次巨大的飞跃。 但有一部分影视人&#xff0c;…

1996-2023年各省社会消费品零售总额数据

1996-2023年各省社会消费品零售总额数据 1、时间&#xff1a;1996-2023年 2、来源&#xff1a;国家统计局、各省年鉴 3、指标&#xff1a;社会消费品零售总额 4、范围&#xff1a;31省 5、缺失情况&#xff1a;无缺失 6、指标解释&#xff1a; 社会消费品零售总额指企业…