STM32 BootLoader 刷新项目 (六) 获取帮助-命令0x52

STM32 BootLoader 刷新项目 (六) 获取帮助-命令0x52

在嵌入式MCU软件开发中,通过串口进行人机交互是非常常见且重要的操作方式。获取帮助的命令通常用来向用户展示所有支持的交互指令及其使用方法。详细介绍如下:

获取帮助命令的作用

  1. 用户友好性

    • 提供易于理解的指令列表,使用户能够快速上手并有效使用系统。
    • 帮助用户了解系统功能和正确的指令格式,避免误操作。
  2. 调试和开发

    • 开发者在调试阶段,可以通过帮助命令快速查看和测试所有可用指令。
    • 帮助命令可以减少记忆负担,使开发过程更加高效。
  3. 维护和升级

    • 在系统维护和固件升级过程中,帮助命令可以确保新旧版本的指令一致性或明确说明变化,便于运维人员操作。
  4. 文档和支持

    • 帮助命令可以作为自动生成的文档,随时更新,确保文档和代码同步。
    • 提供客户支持时,通过帮助命令可以快速了解用户操作是否正确。

获取帮助命令的实现和使用方法

假设我们有一个MCU系统,该系统通过串口接收指令并执行对应操作。下面是一个典型的帮助命令实现和使用示例:

1. 串口指令集

常见的指令集可能包括以下几类:

  • 系统信息指令
  • 配置指令
  • 操作指令
  • 状态查询指令
2. 获取帮助的指令定义

通常,获取帮助的命令会定义为简短且易记的字符串,例如 HELP?HELP LIST

3. 示例指令及其功能
主机发送 命令码 BootLoader回复 备注
BL_GET_VER 0x51 BootLoader版本号(1 byte) 从MCU中读BootLoader的版本号
BL_GET_HELP 0x52 所有支持的命令码(10 bytes) 列出BootLoader支持的所有命令
BL_GET_CID 0x53 Chip identification number(2 bytes) 读芯片的识别号
BL_GET_RDP_STATUS 0x54 返回芯片读保护等级(1 byte) 读行骗Flash的读保护等级
BL_GO_TO_ADDR 0x55 返回成功或错误(1 byte) BL跳转固定地址
BL_FLASH_ERASE 0x56 返回成功或错误(1 byte) 指定擦除扇区
BL_MEM_WRITE 0x57 返回成功或错误(1 byte) 在不同内存写数据
BL_EN_R_W_PROTECT 0x58 返回成功或错误(1 byte) 使能读/写保护
BL_MEM_READ 0x59 主机请求的内存内容长度 TO DO
BL_READ_SECTOR_STATUS 0x5A 所有Sector状态 读所有扇区的保护状态
BL_OTP_READ 0x5B OTP contents TO DO
BL_DIS_R_W_PROTECT 0x5C 返回成功或错误(1 byte) 该命令用于禁用用户Flash的不同扇区的读写保护功能。该命令将保护状态恢复为默认状态。
4. 获取帮助命令的输出示例

用户输入 2 后,系统通过串口返回所有支持的指令及其简要说明。示例如下:

python 复制代码
 BL_GET_VER                            --> 1
 BL_GET_HLP                            --> 2
 BL_GET_CID                            --> 3
 BL_GET_RDP_STATUS                     --> 4
 BL_GO_TO_ADDR                         --> 5
 BL_FLASH_MASS_ERASE                   --> 6
 BL_FLASH_ERASE                        --> 7
 BL_MEM_WRITE                          --> 8
 BL_EN_R_W_PROTECT                     --> 9
 BL_MEM_READ                           --> 10
 BL_READ_SECTOR_P_STATUS               --> 11
 BL_OTP_READ                           --> 12
 BL_DIS_R_W_PROTECT                    --> 13
 BL_MY_NEW_COMMAND                     --> 14
 MENU_EXIT                             --> 0

下面是上位机的命令菜单:

5. 获取帮助命令的实现代码示例

在Python代码中,获取帮助命令的实现可能如下:

c 复制代码
    print("\n +==========================================+")
    print(" |               Menu                       |")
    print(" |         STM32F4 BootLoader v1            |")
    print(" +==========================================+")

  
    
    print("\n   Which BL command do you want to send ??\n")
    print("   BL_GET_VER                            --> 1")
    print("   BL_GET_HLP                            --> 2")
    print("   BL_GET_CID                            --> 3")
    print("   BL_GET_RDP_STATUS                     --> 4")
    print("   BL_GO_TO_ADDR                         --> 5")
    print("   BL_FLASH_MASS_ERASE                   --> 6")
    print("   BL_FLASH_ERASE                        --> 7")
    print("   BL_MEM_WRITE                          --> 8")
    print("   BL_EN_R_W_PROTECT                     --> 9")
    print("   BL_MEM_READ                           --> 10")
    print("   BL_READ_SECTOR_P_STATUS               --> 11")
    print("   BL_OTP_READ                           --> 12")
    print("   BL_DIS_R_W_PROTECT                    --> 13")
    print("   BL_MY_NEW_COMMAND                     --> 14")
    print("   MENU_EXIT                             --> 0")
    
        #command_code = int(input("\n   Type the command code here :") )

    command_code = input("\n   Type the command code here :")

    if(not command_code.isdigit()):
        print("\n   Please Input valid code shown above")
    else:
        decode_menu_command_code(int(command_code))

    input("\n   Press any key to continue  :")
    purge_serial_port()

通过这种方式,用户可以通过输入帮助命令获取系统支持的所有指令及其使用方法,从而更好地与系统进行交互。

在终端窗口中输入需要执行指令的数字,即可通过上位机将指令发给MCU,让MCU执行相应的命令,执行完后MCU在发送是否执行成功的反馈。

下述是MCU侧的程序,如果正确收到上位机发过来的指令,则通过switch case代码选择0x52指令,给上位机回复支持的Support Commands,至此获取帮助指令的教程结束。

c 复制代码
uint8_t supported_commands[] = {
                               BL_GET_VER ,
                               BL_GET_HELP,
                               BL_GET_CID,
                               BL_GET_RDP_STATUS,
                               BL_GO_TO_ADDR,
                               BL_FLASH_ERASE,
                               BL_MEM_WRITE,
                               BL_READ_SECTOR_P_STATUS} ;

/*Helper function to handle BL_GET_HELP command
 * Bootloader sends out All supported Command codes
 */
void bootloader_handle_gethelp_cmd(uint8_t *pBuffer)
{
    printmsg("BL_DEBUG_MSG:bootloader_handle_gethelp_cmd\n");

	//Total length of the command packet
	uint32_t command_packet_len = bl_rx_buffer[0]+1 ;

	//extract the CRC32 sent by the Host
	uint32_t host_crc = *((uint32_t * ) (bl_rx_buffer+command_packet_len - 4) ) ;

	if (! bootloader_verify_crc(&bl_rx_buffer[0],command_packet_len-4,host_crc))
	{
        printmsg("BL_DEBUG_MSG:checksum success !!\n");
        bootloader_send_ack(pBuffer[0],sizeof(supported_commands));
        bootloader_uart_write_data(supported_commands,sizeof(supported_commands) );

	}else
	{
        printmsg("BL_DEBUG_MSG:checksum fail !!\n");
        bootloader_send_nack();
	}

}

往期文章请参考:

STM32 BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建

STM32 BootLoader 刷新项目 (二) 方案介绍

STM32 BootLoader 刷新项目 (三) 程序框架搭建及刷新演示

STM32 BootLoader 刷新项目 (四) 通信协议

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51

相关推荐
-Springer-4 小时前
STM32 学习 —— 个人学习笔记5(EXTI 外部中断 & 对射式红外传感器及旋转编码器计数)
笔记·stm32·学习
LS_learner4 小时前
树莓派(ARM64 架构)Ubuntu 24.04 (Noble) 系统 `apt update` 报错解决方案
嵌入式硬件
来自晴朗的明天5 小时前
16、电压跟随器(缓冲器)电路
单片机·嵌入式硬件·硬件工程
钰珠AIOT5 小时前
在同一块电路板上同时存在 0805 0603 不同的封装有什么利弊?
嵌入式硬件
代码游侠5 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
代码游侠16 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
xuxg200518 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT20 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen20 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制