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

相关推荐
YHPsophie6 分钟前
ATGM331C-5T杭州中科微BDS/GNSS全星座定位授时模块应用领域
经验分享·笔记·单片机·信息与通信·交通物流
钡铼技术物联网关40 分钟前
Codesys 与 ARMxy ARM 工业控制器:工业控制的黄金组合
linux·运维·服务器·arm开发·硬件工程
Liii40341 分钟前
【ARM】Cache深度解读
java·arm开发·spring
Liii4031 小时前
【ARM】中断的处理
arm开发·arm
Archie_IT1 小时前
【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
arm开发·stm32·单片机·嵌入式硬件
辰哥单片机设计1 小时前
1×4矩阵键盘详解(STM32)
stm32·单片机·嵌入式硬件·矩阵·传感器
wmkswd1 小时前
CAN总线-STM32上CAN外设
stm32·单片机·嵌入式硬件
Ruohongxu1 小时前
LAN8720A-CP-TR-ABC QFN-24 以太网收发器芯片
单片机
努力看懂帖子2 小时前
关于STM32项目面试题02:ADC与DAC篇(输入部分NTC、AV:0-5V、AI:4-20mA和DAC的两个引脚)
嵌入式硬件
嵌入式大圣3 小时前
STM32 单片机最小系统全解析
stm32·单片机·嵌入式硬件