STM32 BootLoader 刷新项目 (六) 获取帮助-命令0x52
在嵌入式MCU软件开发中,通过串口进行人机交互是非常常见且重要的操作方式。获取帮助的命令通常用来向用户展示所有支持的交互指令及其使用方法。详细介绍如下:
获取帮助命令的作用
-
用户友好性:
- 提供易于理解的指令列表,使用户能够快速上手并有效使用系统。
- 帮助用户了解系统功能和正确的指令格式,避免误操作。
-
调试和开发:
- 开发者在调试阶段,可以通过帮助命令快速查看和测试所有可用指令。
- 帮助命令可以减少记忆负担,使开发过程更加高效。
-
维护和升级:
- 在系统维护和固件升级过程中,帮助命令可以确保新旧版本的指令一致性或明确说明变化,便于运维人员操作。
-
文档和支持:
- 帮助命令可以作为自动生成的文档,随时更新,确保文档和代码同步。
- 提供客户支持时,通过帮助命令可以快速了解用户操作是否正确。
获取帮助命令的实现和使用方法
假设我们有一个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 刷新项目 (三) 程序框架搭建及刷新演示