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

相关推荐
hairenjing11234 小时前
使用 Mac 数据恢复从 iPhoto 图库中恢复照片
windows·stm32·嵌入式硬件·macos·word
模拟IC攻城狮6 小时前
华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)
嵌入式硬件·华为·硬件架构·芯片
IT B业生6 小时前
51单片机教程(六)- LED流水灯
单片机·嵌入式硬件·51单片机
一枝小雨6 小时前
51单片机学习心得2(基于STC89C52):串口通信(UART)
单片机·嵌入式硬件·51单片机
IT B业生7 小时前
51单片机教程(一)- 开发环境搭建
单片机·嵌入式硬件·51单片机
u0101526588 小时前
STM32F103C8T6学习笔记2--LED流水灯与蜂鸣器
笔记·stm32·学习
海绵波波1079 小时前
Webserver(4.8)UDP、广播、组播
单片机·网络协议·udp
好想有猫猫9 小时前
【51单片机】串口通信原理 + 使用
c语言·单片机·嵌入式硬件·51单片机·1024程序员节
云卓科技9 小时前
无人车之路径规划篇
人工智能·嵌入式硬件·算法·自动驾驶
stm 学习ing11 小时前
C语言 循环高级
c语言·开发语言·单片机·嵌入式硬件·算法·嵌入式实时数据库