hqw 发表于 2019-11-21 20:08:03

STM32Cube_FW_F1_V1.8.0里的 flash 读写例程问题

请教下大家,附件是STM32Cube_FW_F1_V1.8.0\Projects\STM32F103RB-Nucleo\Examples\FLASH\FLASH_EraseProgram的例程:

问题1:
#define FLASH_USER_START_ADDR   ADDR_FLASH_PAGE_48   /* Start @ of user Flash area */
#define FLASH_USER_END_ADDR   ADDR_FLASH_PAGE_127 + FLASH_PAGE_SIZE   /* End @ of user Flash area */

#define DATA_32               ((uint32_t)0x12345678)




在main里:


HAL_FLASH_Unlock();

/* Erase the user Flash area
    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/

/* Fill EraseInit structure*/
EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;
EraseInitStruct.NbPages   = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;

if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
{
    /*
      Error occurred while page erase.
      User can add here some code to deal with this error.
      PAGEError will contain the faulty page and then to know the code error on this page,
      user can call function 'HAL_FLASH_GetError()'
    */
    /* Infinite loop */
    while (1)
    {
      /* Make LED2 blink (100ms on, 2s off) to indicate error in Erase operation */
      BSP_LED_On(LED2);
      HAL_Delay(100);
      BSP_LED_Off(LED2);
      HAL_Delay(2000);
    }
}

/* Program the user Flash area word by word
    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/

Address = FLASH_USER_START_ADDR;

while (Address < FLASH_USER_END_ADDR)
{
    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, DATA_32) == HAL_OK)
    {
      Address = Address + 4; //这里为什么不是Address = Address + 1; ?它不是一个地址就刚好存一个32bit的数吗?
    }                                    //如果看函数定义,HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
    else                              //就算uint64_t Data,也是只需要Address = Address + 2;(64bit 的数据要占两个地址)
    {
      /* Error occurred while writing data in Flash memory.
         User can add here some code to deal with this error */
      while (1)
      {
      /* Make LED2 blink (100ms on, 2s off) to indicate error in Write operation */
      BSP_LED_On(LED2);
      HAL_Delay(100);
      BSP_LED_Off(LED2);
      HAL_Delay(2000);
      }
    }
}



下面是函数的定义:这里没也看到要连着占4个地址,对于64bit的数,也没理由要占4个地址吧?
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
{
HAL_StatusTypeDef status = HAL_ERROR;
uint8_t index = 0;
uint8_t nbiterations = 0;

/* Process Locked */
__HAL_LOCK(&pFlash);

/* Check the parameters */
assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));

#if defined(FLASH_BANK2_END)
if(Address <= FLASH_BANK1_END)
{
#endif /* FLASH_BANK2_END */
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
#if defined(FLASH_BANK2_END)
}
else
{
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperationBank2(FLASH_TIMEOUT_VALUE);
}
#endif /* FLASH_BANK2_END */

if(status == HAL_OK)
{
    if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD)
    {
      /* Program halfword (16-bit) at a specified address. */
      nbiterations = 1U;
    }
    else if(TypeProgram == FLASH_TYPEPROGRAM_WORD)
    {
      /* Program word (32-bit = 2*16-bit) at a specified address. */
      nbiterations = 2U;
    }
    else
    {
      /* Program double word (64-bit = 4*16-bit) at a specified address. */
      nbiterations = 4U;
    }

    for (index = 0U; index < nbiterations; index++)
    {
      FLASH_Program_HalfWord((Address + (2U*index)), (uint16_t)(Data >> (16U*index)));

#if defined(FLASH_BANK2_END)
      if(Address <= FLASH_BANK1_END)
      {
#endif /* FLASH_BANK2_END */
      /* Wait for last operation to be completed */
      status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);

      /* If the program operation is completed, disable the PG Bit */
      CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
#if defined(FLASH_BANK2_END)
      }
      else
      {
      /* Wait for last operation to be completed */
      status = FLASH_WaitForLastOperationBank2(FLASH_TIMEOUT_VALUE);

      /* If the program operation is completed, disable the PG Bit */
      CLEAR_BIT(FLASH->CR2, FLASH_CR2_PG);
      }
#endif /* FLASH_BANK2_END */
      /* In case of error, stop programation procedure */
      if (status != HAL_OK)
      {
      break;
      }
    }
}

/* Process Unlocked */
__HAL_UNLOCK(&pFlash);

return status;
}


多谢大家的指点

大林林 发表于 2019-11-22 08:19:07

和你说一个最关键的东西,一个地址存一个字节8位数据,也就是32位的要占4个,你看内存图,32位的叫一个字,64位的叫双字注意看地址和数据长度

likang1202 发表于 2019-11-22 09:22:54

好像是整字擦除吧

mikecai 发表于 2019-11-22 10:13:22

如您觉得地址增量+4有问题:
您可以按增量+4 连续写入2个以上数据,
再按单个地址增量 读出来 看结果如何
页: [1]
查看完整版本: STM32Cube_FW_F1_V1.8.0里的 flash 读写例程问题