当前位置: 首页 > news >正文

扁平化设计网站 国内闵行区网页设计公司

扁平化设计网站 国内,闵行区网页设计公司,最火的网络推广平台,新2代理网址STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56 1. STM32F407 BootLoader 中的 Flash 擦除功能详解 在嵌入式系统中#xff0c;BootLoader 的设计是非常关键的部分#xff0c;它负责引导主程序的启动、升级以及安全管理。而在 STM32F407 等 MCU 上实现 BootLoaderBootLoader 的设计是非常关键的部分它负责引导主程序的启动、升级以及安全管理。而在 STM32F407 等 MCU 上实现 BootLoaderFlash 操作则是其中的核心功能之一。本文将重点介绍 STM32F407 上的 Flash 擦除功能并给出实现过程和注意事项。 一、STM32F407 Flash 结构概述 STM32F407 芯片采用 Cortex-M4 内核内置 Flash 存储用于程序和数据存储。STM32F407 的 Flash 大小为 512KB分为若干个扇区Sector每个扇区的大小并不相同 扇区 0 到 316KB 每扇区扇区 464KB扇区 5 到 11128KB 每扇区 这种不同大小的扇区设计适合不同的应用需求比如小容量扇区用于存储配置数据大容量扇区用于存储固件。 二、Flash 擦除的原理 Flash 擦除是将 Flash 中的某个扇区的数据重置为 0xFF。由于 Flash 的物理特性写操作只能将位设置为 0而擦除操作将位恢复为 1。因此在更新 Flash 数据时通常需要先擦除再写入。 在 STM32F407 中Flash 擦除只能以扇区为单位进行这意味着无法擦除扇区中的部分数据。每次擦除扇区时整个扇区的数据都会被清空。 三、Flash 擦除的操作流程 在 STM32F407 的 BootLoader 中实现 Flash 擦除一般需要遵循以下步骤 解锁 Flash 控制寄存器在进行任何 Flash 操作之前需要解锁 Flash 的写保护功能。等待 Flash 空闲检查 Flash 状态寄存器确保没有其他操作正在进行。启动扇区擦除设置目标扇区并启动擦除命令。等待擦除完成监控状态寄存器中的 BSY 位等待擦除操作完成。锁定 Flash 控制寄存器完成操作后将 Flash 锁定以防止误操作。 四、Flash 擦除实现代码 以下是 STM32F407 上实现 Flash 擦除的代码示例。本文假设使用了 STM32 标准外设库便于调用硬件寄存器。 #include stm32f4xx.h/*** brief 擦除 Flash 指定扇区* param sector 要擦除的扇区编号* retval 0 表示成功-1 表示失败*/ int Flash_EraseSector(uint8_t sector) {// 解锁 Flash 控制寄存器FLASH_Unlock();// 等待 Flash 空闲while (FLASH_GetStatus() FLASH_BUSY);// 擦除操作FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);FLASH_Status status FLASH_EraseSector(sector, VoltageRange_3);// 等待擦除完成if (status ! FLASH_COMPLETE){FLASH_Lock();return -1; // 擦除失败}// 锁定 Flash 控制寄存器FLASH_Lock();return 0; // 擦除成功 }五、代码详解 FLASH_Unlock()此函数用于解锁 Flash 控制寄存器以允许擦除和写入操作。FLASH_GetStatus()用于检查 Flash 是否处于忙碌状态。擦除操作会占用一定的时间必须等待 Flash 空闲后才能继续。FLASH_ClearFlag()清除可能出现的错误标志位确保擦除操作不会受到之前错误的影响。FLASH_EraseSector()这是 STM32 库中的擦除函数输入参数为扇区编号和电压范围STM32F4 系列通常使用 VoltageRange_3。FLASH_Lock()操作完成后锁定 Flash 控制寄存器以防止意外操作。 六、Flash 擦除的注意事项 擦除单位在 STM32F407 中Flash 擦除只能以扇区为单位进行无法进行字节或页的擦除。因此设计 BootLoader 时要合理分配数据的存储位置避免不必要的擦除操作。电压范围擦除 Flash 时电源电压必须在一定范围内低电压下可能导致擦除失败甚至损坏 Flash。STM32F407 提供了多种电压模式通常选择 VoltageRange_3 即可。错误处理Flash 擦除失败可能会出现各种错误例如写保护、编程错误等。建议在擦除操作前后清除并检查错误标志。数据备份在擦除前备份必要的数据。在 BootLoader 中进行固件更新时最好将旧固件暂时保存至其他存储介质中以应对擦除或写入失败的情况。上电时间Flash 擦除时间较长尤其是 128KB 扇区因此在设计 BootLoader 时需要考虑电源的持续供电能力避免中途掉电。 2. BootLoader Flash划分 由下图可以看出本BootLoader的Flash的划分其中划给BootLoader为32KB从0x0800 0000-0x0800 7FFF占用Sector 0-1两个段。App应用程序占用0x0800 8000-0x080F FFFF总共10个Sector。 下面是BootLoader的跳转过程关于具体的跳转过程可以参考上一篇文章 STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55 3. 0x56命令介绍–Flash擦除 在本篇文章我们的主要是介绍0x56的命令这个命令主要是在BootLoader中擦除指定Flash Sector的命令。 通过上位机发送8 Byte的数据其中第1 Byte为整个数据的长度第2Byte为指令码第3 Byte为要擦除Flash的起始Sector序号第4 Byte是擦除Sector的长度第5-8 Byte为前6个Byte的CRC校验值。上位机通过串口UART发送给下位机下位机回复地址是否擦除成功的标志。 下面是发送命令过程中上位机与BootLoader之间的交互。 4. Flash擦除命令程序设计 下面我们来进行程序设计下面是读取上位机指令并解析指令的过程通过switch case判断执行哪种命令。目前通过上位机执行BL_FLASH_ERASE指令然后执行bootloader_handle_flash_erase_cmd(bl_rx_buffer)函数。 下面是代码的详细注释和分析 bootloader_uart_read_data 函数 该函数用于从主机接收命令数据并调用相应的处理函数来执行命令。它是 BootLoader 的核心输入接口通过 UART 接收主机的命令并根据命令类型分发到对应的处理函数。 void bootloader_uart_read_data(void) {uint8_t rcv_len 0;// 打印调试信息提示接收到命令printmsg_Host(BL_DEBUG_MSG: Receive CMD\n\r);// 无限循环持续接收命令并处理while (1){// 将 LED2 熄灭表示进入命令接收状态HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);// 清空接收缓冲区防止残留数据干扰memset(bl_rx_buffer, 0, 200);// 读取命令包的第一个字节即命令的长度字段HAL_UART_Receive(C_UART, bl_rx_buffer, 1, HAL_MAX_DELAY);// 获取命令包长度长度字节位于第一个字节rcv_len bl_rx_buffer[0];// 根据命令包长度读取剩余的字节HAL_UART_Receive(C_UART, bl_rx_buffer[1], rcv_len, HAL_MAX_DELAY);// 根据命令码执行相应的命令处理函数switch (bl_rx_buffer[1]){case BL_GET_VER:// 处理获取版本命令bootloader_handle_getver_cmd(bl_rx_buffer);break;case BL_GET_HELP:// 处理获取帮助命令bootloader_handle_gethelp_cmd(bl_rx_buffer);break;case BL_GET_CID:// 处理获取芯片 ID 命令bootloader_handle_getcid_cmd(bl_rx_buffer);break;case BL_GET_RDP_STATUS:// 处理获取读保护状态命令bootloader_handle_getrdp_cmd(bl_rx_buffer);break;case BL_GO_TO_ADDR:// 处理跳转到地址命令bootloader_handle_go_cmd(bl_rx_buffer);break;case BL_FLASH_ERASE:// 处理 Flash 擦除命令bootloader_handle_flash_erase_cmd(bl_rx_buffer);break;default:// 未知命令打印调试信息printmsg(BL_DEBUG_MSG: Invalid command code received from host \n);break;}} }初始化和循环函数会无限循环等待主机发送的命令并进行解析。数据接收首先读取一个字节的长度字段然后根据这个长度读取完整的命令数据。命令解析通过 switch 语句解析命令码并调用相应的处理函数。错误处理如果命令码不在预期范围内打印调试信息。 bootloader_handle_flash_erase_cmd 函数 该函数处理 BL_FLASH_ERASE 命令通过接收到的参数执行 Flash 擦除操作。 void bootloader_handle_flash_erase_cmd(uint8_t *pBuffer) {uint8_t erase_status 0x00;printmsg(BL_DEBUG_MSG: bootloader_handle_flash_erase_cmd\n);// 获取命令包的总长度uint32_t command_packet_len bl_rx_buffer[0] 1;// 从命令包中提取主机发送的 CRC32 值uint32_t host_crc *((uint32_t *)(bl_rx_buffer command_packet_len - 4));// 验证接收到的数据包的 CRC 校验if (!bootloader_verify_crc(bl_rx_buffer[0], command_packet_len - 4, host_crc)){// 如果校验成功printmsg(BL_DEBUG_MSG: checksum success !!\n);// 发送 ACK 响应确认命令长度为 1 字节bootloader_send_ack(pBuffer[0], 1);// 打印擦除信息初始扇区和扇区数量printmsg(BL_DEBUG_MSG: initial_sector: %d, no_of_sectors: %d\n, pBuffer[2], pBuffer[3]);// 熄灭 LED 表示擦除操作开始HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);// 调用 execute_flash_erase 执行擦除操作传入初始扇区和扇区数量erase_status execute_flash_erase(pBuffer[2], pBuffer[3]);// 重新点亮 LED 表示擦除操作完成HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);// 打印擦除操作的状态printmsg(BL_DEBUG_MSG: flash erase status: %#x\n, erase_status);// 发送擦除状态回主机bootloader_uart_write_data(erase_status, 1);}else{// 如果 CRC 校验失败发送 NACK 响应printmsg(BL_DEBUG_MSG: checksum fail !!\n);bootloader_send_nack();} }参数解析和 CRC 校验从命令包中提取 CRC 值并进行校验确保数据完整性。发送 ACK 或 NACK根据 CRC 校验结果发送确认或拒绝响应。擦除操作如果校验通过提取擦除操作的初始扇区和扇区数量然后调用 execute_flash_erase 函数执行擦除操作。状态回传擦除完成后将操作状态通过 UART 返回给主机。 execute_flash_erase 函数 execute_flash_erase 函数负责执行 Flash 的具体擦除操作支持部分扇区擦除和全片擦除。 uint8_t execute_flash_erase(uint8_t sector_number, uint8_t number_of_sector) {// STM32F407 芯片共有 12 个扇区0 到 11// 如果 sector_number 0xff表示全片擦除FLASH_EraseInitTypeDef flashErase_handle;uint32_t sectorError;HAL_StatusTypeDef status;// 如果指定的扇区数量超过有效范围返回无效扇区if (number_of_sector 11)return INVALID_SECTOR;// 检查扇区号是否有效if ((sector_number 0xFF) || (sector_number 11)){// 判断是否全片擦除if (sector_number (uint8_t)0xFF){flashErase_handle.TypeErase FLASH_TYPEERASE_MASSERASE;}else{// 部分扇区擦除// 计算剩余可擦除的扇区数uint8_t remaining_sector 12 - sector_number;if (number_of_sector remaining_sector){number_of_sector remaining_sector;}flashErase_handle.TypeErase FLASH_TYPEERASE_SECTORS;flashErase_handle.Sector sector_number;flashErase_handle.NbSectors number_of_sector;}// 设置擦除银行STM32F4 系列有两个 Flash Bank选取 Bank 1flashErase_handle.Banks FLASH_BANK_1;// 解锁 Flash 寄存器允许擦除操作HAL_FLASH_Unlock();// 设置电压范围适应 STM32F4 的工作电压范围flashErase_handle.VoltageRange FLASH_VOLTAGE_RANGE_3;// 执行擦除操作传入擦除配置和错误记录变量status (uint8_t)HAL_FLASHEx_Erase(flashErase_handle, sectorError);// 锁定 Flash 控制寄存器防止误操作HAL_FLASH_Lock();return status; // 返回擦除操作的状态}return INVALID_SECTOR; // 如果无效扇区返回无效状态 }全片和部分擦除函数支持全片擦除sector_number 0xFF和从指定扇区开始的部分擦除。擦除范围检查确保扇区数量不超过剩余的可擦除范围。解锁和锁定在擦除操作前解锁 Flash 控制寄存器擦除完成后重新锁定。电压范围设置设置为 FLASH_VOLTAGE_RANGE_3适配 STM32F4 的工作电压。状态返回返回擦除状态以便调用方确认擦除是否成功。 总结 bootloader_uart_read_data从 UART 接收命令解析命令码并调用对应的命令处理函数。bootloader_handle_flash_erase_cmd处理 Flash 擦除命令进行 CRC 校验 5. 实战演练 下面是上位机的命令菜单通过在终端调用Python脚本然后在终端输入下位机连接的串口号即可进入命令界面目前可支持如下命令 下面我们执行命令–7执行BL_FLASH_ERASE即为在BootLoader中执行Flash擦除命令0x56第一步输入要开始擦除的Sector起始段第二步输入擦除Sector的长度最后BootLoader向上位机返回是否擦除成功的Status。 下面我们来看Flash擦除命令是否擦除成功用STM32CubeProgrammer工具用ST-LINK连接Debug口上一步中我们擦除的Sector 3的Flash这里面我们输入Sector 2的起始地址0x0800 C000可以看出全部擦除为FF。至此Flash擦除命令已经讲完。 6. 结论 Flash 擦除是 STM32F407 BootLoader 设计中的重要环节它为固件更新和数据存储提供了基础。本文详细介绍了 Flash 擦除的原理和实现方法并提供了相关代码和注意事项。在实际应用中设计人员可以根据需要将擦除功能整合至 BootLoader 的主流程中确保系统的可靠性和可升级性。 希望本篇文章能为读者在 STM32F407 的 BootLoader 开发中提供一些帮助若有疑问欢迎交流讨论。 7. 系列文章 STM32 BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建 STM32 BootLoader 刷新项目 (二) 方案介绍 STM32 BootLoader 刷新项目 (三) 程序框架搭建及刷新演示 STM32 BootLoader 刷新项目 (四) 通信协议 STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51 STM32 BootLoader 刷新项目 (六) 获取帮助-命令0x52 STM32 BootLoader 刷新项目 (七) 获取芯片ID-0x53 STM32 BootLoader 刷新项目 (八) 读取Flash保护ROP-0x54 STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55
http://www.dnsts.com.cn/news/134082.html

相关文章:

  • 百度推广会帮你做网站不seo网站自动发布外链工具
  • 前端如何做响应式网站织梦网站怎样做seo
  • 中文网站什么意思下载软件的网址
  • 南京 外贸网站建设网站开发asp软件有哪些
  • 深圳做网站(信科网络)建设一个导航网站
  • 建筑工程培训有哪些seo站长工具查询系统
  • 响应式网站建设服务商做网站要用写接口
  • 织梦做泰文网站在线设计家装
  • 网站充值记账凭证怎么做专业做网站的软件
  • 无忧网站模板dede世界杯网站模板
  • 17做网站广州沙河电商平面设计前景如何
  • 昌平知名的网站制作建设报价遨游建设网站
  • 泰来县城乡建设局网站杭州公司建设网站制作
  • 网站接入网方式uemo网站平台建设
  • 免费网站建设品牌好列举网站建设的SEO策略
  • 国内vps做网站要备案吗网页前端培训
  • 怎么用记事本做网站莱州网站建设案例
  • 银川建网站网络公司品牌推广
  • 如何做品牌网站设计网络营销市场
  • 北京怀柔做网站管理运营的公司个人英文网站设计
  • 最专业的营销网站建设海外房产网站建设
  • 网站备案免费吗网站链接推广怎么做
  • 虚拟主机可以做几个网站做的网站如何全屏
  • 网站域名实名证明wordpress搭电影网站
  • 龙岩做网站开发价格网页设计素材怎么保存到文件夹
  • 重庆免费网站建站模板宁波seo外包推广
  • 哈尔滨网站提升排名志丹网站建设
  • 网站怎么做运营推广怎么自己做游戏软件
  • 网站网络推广策略和电子商务怎么建个人网页
  • 做网站商城前景怎么样成都网站建设哪家