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

相关推荐
yutian06062 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
析木不会编程5 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
枯无穷肉9 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名6779 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式科普10 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
嵌入式大圣10 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室10 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费10 小时前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件
qq_3975623112 小时前
MPU6050 , 设置内部低通滤波器,对于输出数据的影响。(简单实验)
单片机
liyinuo201712 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范