赞
踩
单片机开发BootLoader的原因主要与其在嵌入式系统中的关键作用有关。BootLoader是硬件启动的引导程序,它在操作系统内核或用户应用程序运行之前执行。以下是单片机开发BootLoader的主要原因:
总之,BootLoader是单片机系统启动的关键环节,它负责初始化硬件、加载操作系统,并为系统提供启动选项和固件更新等附加功能。这些功能使得单片机能够更灵活、更可靠地运行,满足各种应用需求。
在单片机系统中,BootLoader是系统上电或重启后首先执行的程序。它扮演着系统启动的“先锋”角色,负责进行一系列的硬件初始化操作。这些操作包括但不限于:
这些初始化步骤是确保单片机系统能够稳定、可靠运行的基础。
在完成硬件初始化后,BootLoader的另一个关键任务是加载并启动操作系统或用户应用程序。这通常涉及以下步骤:
在某些复杂的单片机应用中,可能需要支持多个操作系统或应用程序的启动。此时,BootLoader可以提供一个简单的用户交互界面(如通过UART接口),让用户选择想要启动的系统或应用。这种灵活性在开发、调试或现场维护过程中非常有用。
随着物联网(IoT)的兴起,远程更新和管理单片机固件变得越来越重要。BootLoader可以集成OTA(Over-the-Air)更新功能,允许通过无线网络或其他通信方式接收并安装新的固件版本。这不仅简化了固件更新的过程,还使得单片机系统能够持续接收安全更新和新功能。
在设计和实现BootLoader时,安全性和可靠性是重要考虑因素。例如,可以通过加密和签名机制来确保固件映像的完整性和真实性,防止恶意软件的注入。此外,BootLoader还可以实现故障恢复机制,如在固件更新失败时回滚到之前的版本。
单片机开发BootLoader不仅是为了满足系统启动和硬件初始化的基本需求,还是为了实现多系统支持、远程管理、安全性和可靠性等高级功能。这些功能共同构成了现代单片机系统稳健、灵活和可维护的基石。
CAN总线是一种由Bosch公司在1986年开发的通信协议,最初用于汽车电子系统,现已广泛应用于工业自动化、医疗设备等多个领域。它支持多主控制,具有较高的实时性和可靠性,采用差分信号传输,具有较强的抗干扰能力。
CAN总线的通信原理基于仲裁机制,当多个设备同时发送数据时,通过仲裁决定数据传输的优先级。其消息结构包括帧起始、仲裁场、控制场、数据场、CRC校验和帧结束等部分。此外,CAN总线具备错误检测和处理能力,能够确保数据传输的准确性。
CAN总线的应用场景非常广泛,它不仅在汽车电子领域中用于发动机控制单元、ABS系统等,也在工业自动化中控制PLC与传感器之间的通信。此外,医疗设备、智能家居、船舶控制系统等也采用CAN总线进行数据交换,显示出其在多种环境中的适用性和灵活性。随着技术的进步,CAN总线也在不断地进行改进和扩展,以适应更广泛的应用需求。
当系统进入内存引导模式且ARM设备(基于Arm®内核)完成配置后,引导加载器代码会等待在CANx_Rx引脚上接收到一个帧。一旦检测到该帧,CAN引导加载器固件将立即启动以检查外部时钟频率。
图2展示了检查外部时钟频率的流程图。
ARM单片机的CAN模块兼容2.0A和2.0B(主动)规范,支持高达1 Mbit/s的比特率。它能够发送和接收带有11位标识符的标准帧以及带有29位标识符的扩展帧。
图3展示了仅使用标准标识符的CAN帧结构。
对于当前应用,CAN的设置如下:
发送设置(从ARM单片机到主机):
接收设置(从主机到ARM单片机):
注意:CAN引导加载器固件一次仅支持一个节点,因此不支持CAN网络管理功能。
表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 | 禁用读保护。 |
注释:
获取命令允许主机获取bootloader的版本和支持的命令。当bootloader接收到此命令时,它将bootloader版本和支持的命令代码传输给主机。
图4:get指令:主机端
主机发送的消息如下:
命令消息:标准ID(Std ID) = 0x00,数据长度码(DLC) = ‘不重要’。
ARM单片机发送消息的流程如下:
请注意,消息2中的"N"表示将要发送的字节数减1,这个值的范围是1到255(不包含1和包含256)。这意味着实际要发送的字节数是"N + 1",并且这个数值不能超过256。
获取版本和读取保护状态命令用于获取引导加载程序的版本和读取保护状态。当引导加载程序接收到这个命令时,它会向主机发送下面描述的信息(版本和两个值为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
消息2:标准ID(Std ID) = 0x01,DLC = 1,数据[0] = bootloader版本(0 < 版本 ≤ 255),
示例:0x10 = 版本1.0
消息3:可选消息1:标准ID(Std ID) = 0x01,DLC = 2,数据 = 0x00(byte1和byte2)
消息4:标准ID(Std ID) = 0x01,DLC = 1,数据 = ACK
获取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
速度命令允许改变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(使用新的波特率)
读取内存命令用于从RAM、Flash存储器以及信息块(系统内存或选项字节区域)中的任何有效内存地址读取数据。
当引导加载程序接收到读取内存命令时,它开始验证消息的内容:
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。
运行命令用于执行下载的代码或应用程序指定的任何其他代码,通过跳转到指定的地址来实现。当引导加载程序接收到运行命令时,它会检查消息是否包含以下有效信息:
命令的ID是否正确
读取保护(ReadOutProtection)是否被禁用或启用
分支目标地址是否有效(data[0] 是地址的最高有效位(MSB),data[3] 是地址的最低有效位(LSB))
如果消息内容正确,它会发送一个ACK消息,否则发送一个NACK消息。
在发送ACK消息给应用程序之后,引导加载程序固件会执行以下操作:
将引导加载程序所使用的外设寄存器初始化为其默认的复位值。
初始化用户应用程序的主栈指针。
跳转到接收到的‘地址 + 4’处所编程的内存位置(对应于应用程序的复位处理程序的地址)。
例如,如果接收到的地址是0x0800 0000,引导加载程序将跳转到在地址0x0800 0004处编程的内存位置。
通常,主机发送的是应用程序要跳转到的基本地址。
注意:
确认消息(ACK message):
写入内存命令用于将数据写入RAM、Flash存储器或选项字节区域的任何有效内存地址(参见注释)。当引导加载程序接收到写入内存命令时(消息数据长度为5个字节,data[0]是地址的最高有效位(MSB),data[3]是地址的最低有效位(LSB),data[4]是要接收的数据字节数),它会检查接收到的地址。对于选项字节区域,起始地址必须是选项字节区域的基地址(参见注释),以避免意外写入该区域。
注意:请参阅第3.1节以获取所用设备的有效内存地址的更多详细信息。
如果接收到的地址有效,引导加载程序会发送一个ACK消息,否则会发送一个NACK消息并中止命令。当地址有效时,引导加载程序:
ARM单片机要写入的数据块的最大长度为256字节。
如果向选项字节区域发出写入内存命令,在写入新值之前会擦除所有选项,并在命令结束时,引导加载程序会生成系统复位以考虑选项字节的新配置。
注意:
主机发送消息的方式如下:
命令消息:标准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
注意:
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条消息写入请求的地址后发送的。
擦除内存命令允许主机擦除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。
写保护命令用于启用对部分或全部Flash内存扇区的写保护。当引导加载程序接收到写保护命令时,如果ROP(只读保护)未启用,则向主机发送ACK消息;否则,发送NACK消息。
在发送ACK字节后,引导加载程序等待从应用程序接收Flash内存扇区代码。
在写保护命令结束时,引导加载程序发送ACK消息并生成系统重置以考虑选项字节的新配置。
注意:
命令消息:标准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。
取消写保护命令用于禁用所有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。
读保护命令用于启用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。
读取消保护命令用于禁用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。
本文深入探讨了单片机开发中BootLoader的关键作用、主要功能以及CAN总线通信的基础,并对ARM单片机BootLoader的实现细节进行了详尽的描述。
BootLoader作为单片机系统启动的核心,承担着初始化硬件设备、加载操作系统、提供启动选项、支持固件的OTA更新以及满足嵌入式系统特殊需求的重任。它不仅确保了系统的稳定和可靠运行,还通过提供多系统支持、远程管理和安全性保障,增强了系统的灵活性和可维护性。
CAN总线以其多主控制、高实时性、强抗干扰能力和错误检测处理机制,在汽车电子、工业自动化、医疗设备等领域发挥着重要作用。随着技术的发展,CAN总线不断改进和扩展,以适应更广泛的应用需求。
ARM单片机BootLoader的流程、CAN设置和命令集得到了细致的阐释。从BootLoader的启动、外部时钟频率的检查,到CAN模块的配置,再到丰富的命令集,包括获取版本、读取保护状态、芯片ID、速度设置、内存读写、跳转执行、擦除操作以及写保护等,每一环节都体现了对细节的严格把控和对安全的高度重视。
安全性和可靠性是BootLoader设计的重中之重。通过加密、签名机制确保固件的完整性,故障恢复机制如回滚到旧版本,以及对写保护和读保护的精细控制,BootLoader为单片机系统的安全稳定运行提供了坚实保障。
随着物联网和智能设备的发展,BootLoader的角色愈发重要。它不仅作为系统启动的第一道门槛,更是系统更新、维护和安全管理的关键环节。未来,BootLoader将更加智能化、安全化,以适应不断变化的技术需求和市场环境。
综上所述,BootLoader的开发和应用是确保单片机系统高效、安全运行的关键。本文的探讨不仅为开发者提供了宝贵的指导,也为单片机技术的应用进一步发展奠定了坚实的基础。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。