STM32
直播中

李艺银

7年用户 938经验值
私信 关注
[问答]

用STM9S003F3做IAP升级,写APP程序到APP地址区时有字节没有写成功的原因 ?

用STM9S003F3做IAP升级, 用IAR编译器,ST提供的库函数,稍加改写,以块编程的方式(64Byte),去写FLASH, 现在是流程可以跑通,但是在写APP程序到APP地址区时,发现有字节没有写成功,请帮忙分析,谢谢。

下面贴上我的块写程序:

IN_RAM(void userFLASH_ProgramBlock(uint16_t BlockAddr, uint8_t *Buffer))
{
  uint16_t Count;
  
  /* Point to the first block address */
  /* Standard programming mode */ /*No need in standard mode */
  FLASH->CR2 |= FLASH_CR2_PRG;
  FLASH->NCR2  = (uint8_t)(~FLASH_NCR2_NPRG);
   
  /* Copy data bytes from RAM to FLASH memory */
  for(Count = 0; Count < FLASH_BLOCK_SIZE; Count++)
  {
    *((PointerAttr uint8_t *) (MemoryAddressCast)BlockAddr + Count) = ((uint8_t)(Buffer[Count]));
  }
}

回帖(1)

张波

3 天前
在分析这个问题之前,我们需要了解一些关于STM9S003F3和IAP(In-Application Programming)升级的基本信息。STM9S003F3是一款8位微控制器,具有内置的Flash存储器,可以进行IAP升级。IAP升级是一种在应用程序运行期间更新Flash存储器的技术,这使得设备可以在不重新启动的情况下进行固件更新。

根据您提供的代码片段,您正在尝试使用块编程方式(64字节)将APP程序写入APP地址区。您提到在写入过程中,有些字节没有成功写入。为了分析这个问题,我们需要考虑以下几个可能的原因:

1. 地址对齐问题:确保BlockAddr和Buffer指针都是64字节对齐的。如果地址没有正确对齐,可能会导致写入失败。

2. 写入时序问题:在写入Flash时,需要遵循特定的时序要求。请检查您的代码是否遵循了STM9S003F3的数据手册中关于Flash编程时序的要求。

3. 中断影响:在写入Flash期间,如果有中断发生,可能会影响写入过程。确保在写入过程中禁用所有非关键中断,以避免干扰。

4. 电源电压问题:Flash编程需要足够的电源电压。请检查您的电源电压是否稳定且在规定的范围内。

5. 写入保护:检查您的设备是否启用了某些写入保护功能,这可能会阻止Flash写入。

6. 代码错误:仔细检查您的代码,确保没有逻辑错误或遗漏。例如,确保您正确地设置了FLASH_CR2寄存器,以及其他与Flash编程相关的寄存器。

7. 硬件问题:如果以上所有可能性都排除了,那么可能是硬件问题。您可以尝试使用另一块STM9S003F3芯片进行测试,以确定问题是否与硬件有关。

为了更准确地诊断问题,您可以尝试以下步骤:

1. 使用ST提供的库函数进行单字节编程,而不是块编程。这可以帮助您确定问题是否与块编程有关。

2. 在写入每个字节后,立即读取并验证该字节是否已正确写入。这可以帮助您确定写入失败的具体位置。

3. 使用调试器或逻辑分析仪检查与Flash编程相关的寄存器和信号,以获取更多关于写入过程的信息。

4. 如果可能,尝试在不同的STM9S003F3芯片上重复实验,以排除硬件问题。

5. 查阅STM9S003F3的数据手册和IAR编译器文档,以确保您正确地使用了所有相关功能和选项。

希望这些建议能帮助您找到问题的根源并解决它。祝您好运!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分