STM32 写Flash进入HardFault_Handler,一次解决经验分享

问题描述:
在执行写flash操作(以下函数)的时候,

FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{
  FLASH_Status status = FLASH_COMPLETE;

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

  /* Wait for last operation to be completed */
  status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
  
  if(status == FLASH_COMPLETE)
  {
    /* If the previous operation is completed, proceed to program the new data */
    FLASH->CR |= FLASH_CR_PG;
  
    *(__IO uint16_t*)Address = Data;

    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
    
    /* Disable the PG Bit */
    FLASH->CR &= ~FLASH_CR_PG;
  } 
  
  /* Return the Program Status */
  return status;
}

调试进入硬件错误!

void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

检查了一下程序,写flash的时候,擦除的扇区没有代码。内存堆栈也没有溢出。

调用写flash程序的时候是用指针调用的

FLASH_ProgramHalfWord(addr, *pData);

*pData指向的是定义的一个全局变量数组 unit16_t A[32];

在束手无策的情况下,抱着尝试一下的心态,
在unit16_t A[32]后面加上了,attribute((at(0x20000500)));问题就解决了。
虽然搞不清楚什么情况,但是的确是有效的!

你可能感兴趣的:(技术经验)