问题描述:
在执行写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)));问题就解决了。
虽然搞不清楚什么情况,但是的确是有效的!