关于STM32G070RBTx单片机使用HAL库往flash写数据的过程中死机问题

文章讲述了在使用STM32G070RBTx单片机时,遇到的关于FLASH写入数据过程中的问题,涉及强转类型、数据包处理和大小端影响。作者首先描述了原始问题,然后提出将数据先存入uint64_t并调整数组顺序,最后发现是由于栈顶地址判断中的大小端问题导致的失败。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.单片机型号:STM32G070RBTx

2.出现的问题

        根据库函数FLASH_If_Write()的使用,我们分析往flash写数据的过程是把uint8_t 类型的数据(p_data)以地址的形式强转成uint64类型的,在一包128字节的数据时一次存储8位,存16次(packet_size/8),下边是原本的逻辑代码,程序卡死在下面框起来的位置:

定义ramsource变量为:uint32_t ;

3. 解决

        选择换一种思路,把传过来的数据先存到uint64_t类型的数据中,然后把数组传过去,代码片段如下所示:

<think>好的,我需要帮助用户了解STM32G431单片机的Bootloader的使用和实现。首先,根据用户提供的引用资料,特别是引用[2]、[3]、[4],这些内容提到了使用STM32CubeMX创建Bootloader、串口IAP功能以及项目纪实。用户可能想知道具体步骤、原理和实际应用。 首先,我应该解释Bootloader的基本概念,这是用户可能需要的背景知识。根据引用[1],Bootloader是初始化硬件和加载操作系统的程序,所以需要说明其在单片机中的作用,比如固件更新。 接下来,实现原理部分,需要结合引用[3],提到Bootloader的原理是将程序下载到Flash,接收数据后跳转。这里需要详细说明内存分区,包括Bootloader区域和APP区域,以及中断向量表的偏移。这部分可能需要涉及技术细节,如地址分配和中断处理。 然后是具体实现步骤,引用[2]和[4]都提到了使用STM32CubeMX创建工程,所以需要分步骤说明如何配置时钟、串口、Flash等模块。特别是时钟配置和串口通信的设置,因为这是IAP的关键。同时,代码部分需要提到接收数据Flash和跳转函数,可能还需要示例代码片段。 另外,引用[3]提到上位机的开发,比如用LabVIEW,但用户可能更关注单片机端的实现,所以这部分可以简要提及,或者作为相关扩展问题。 注意事项方面,需要强调地址对齐、中断向量表偏移和电源稳定性,这些是实际应用中容易出错的地方。引用[3]中的项目纪实可能提到这些常见问题,所以需要总结出来。 最后,生成相关问题,根据用户可能的后续疑问,比如优化方法、不同通信方式、调试技巧等,结合引用中的内容,提出相关问题。 需要确保回答结构清晰,分点说明,并且正确引用来源。同时,注意使用中文,数学公式和代码块按照要求格式化,但在这个问题中可能涉及较少数学内容,更多是代码示例。要检查LaTeX语法是否正确,但可能这里用到的机会不多。最后,确保回答真实可靠,基于提供的引用资料,不添加未提及的信息。</think>### STM32G431单片机Bootloader使用与实现指南 #### 一、Bootloader基础概念 Bootloader是存储在单片机Flash起始地址的小程序,负责接收新固件、入指定地址并跳转执行[^1]。其核心功能包括: 1. 初始化硬件(如串口、时钟) 2. 通过通信接口接收数据包 3. 将数据Flash指定区域 4. 验证数据完整性 5. 跳转到应用程序执行 #### 二、实现原理 1. **内存分区**(以512KB Flash为例): ``` $$ \begin{array}{|c|c|} \hline \text{0x0800 0000 - 0x0800 7FFF} & \text{Bootloader区域(32KB)} \\ \hline \text{0x0800 8000 - 0x0807 FFFF} & \text{APP应用程序区域(480KB)} \\ \hline \end{array} $$ ``` 2. **中断向量表偏移**:需在APP程序中设置`SCB->VTOR`寄存器,例如: ```c SCB->VTOR = FLASH_BASE | 0x8000; // 偏移32KB ``` #### 三、具体实现步骤(基于STM32CubeMX) **步骤1:创建Bootloader工程** 1. 在CubeMX中选择STM32G431型号 2. 配置系统时钟至170MHz(最大主频)[^4] 3. 启用USART1(波特率建议115200) 4. 配置Flash分页(Page size=2KB) 5. 生成MDK-ARM工程 **步骤2:关键代码实现** ```c // Flash入函数 HAL_FLASH_Unlock(); FLASH_EraseInitTypeDef erase; erase.TypeErase = FLASH_TYPEERASE_PAGES; erase.Page = 0x80; // 起始页 erase.NbPages = 240; // 总页数 uint32_t error; HAL_FLASHEx_Erase(&erase, &error); // 数据入(示例) for(int i=0; i<data_len; i+=8) { HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, APP_ADDRESS + i, *(uint64_t*)(data+i)); } HAL_FLASH_Lock(); // 跳转函数 void JumpToApp(void) { typedef void (*pFunction)(void); pFunction AppStart = (pFunction)(*(__IO uint32_t*)(APP_ADDRESS + 4)); __set_MSP(*(__IO uint32_t*)APP_ADDRESS); AppStart(); } ``` **步骤3:生成APP工程** 1. 修改链接脚本(.ld文件): ```c MEMORY { FLASH (rx) : ORIGIN = 0x08008000, LENGTH = 480K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K } ``` 2. 在main函数初始化时设置中断向量表: ```c SCB->VTOR = FLASH_BASE | 0x8000; ``` #### 四、上位机开发要点 1. 数据分包格式建议: ``` [0xAA][数据长度(2B)][数据包序号(2B)][数据(nB)][CRC32(4B)] ``` 2. 使用YModem协议或自定义简单协议 3. 支持断点续传(记录最后成功包号) #### 五、注意事项 1. Flash入前必须擦除,擦除操作以页为单位[^2] 2. 跳转前关闭所有中断 3. Bootloader与APP的时钟配置需一致 4. 保留2KB空间用于存储升级标志位 5. 使用硬件看门狗防止死机
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小白菜123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值