本帖最后由 地瓜patch 于 2018-7-13 14:40 编辑
在写片内flash进行擦除的时候,调用库函数FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange);执行擦除操作时死在语句FLASH->CR |= FLASH_CR_STRT;
此语句前程序可以正常运行,此语句后死机。没有任何反应。求高手解答。//自己编写的写flash函数
void WriteFlash(uint16_t WCount)
{
uint16_t uwCount,i,j;
uint32_t uwStartSector = 0;
uint32_t uwAddress = 0;
__IO uint32_t uwData32 = 0;
__disable_irq();
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
uwStartSector = FLASH_Sector_11;
uwAddress = ADDR_FLASH_SECTOR_11;
uwCount=WCount;
if (FLASH_EraseSector(uwStartSector, VoltageRange_3) == FLASH_COMPLETE)
{
for(i=0;i<uwCount; )
{
if(FLASH_ProgramWord(uwAddress+4*i, Write_Flash_data)== FLASH_COMPLETE)
{ i++; }
}
}
FLASH_Lock();
__enable_irq();
}
//调用stm32f4的头文件"stm32f4xx_flash.h"里的块擦除库函数
FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange)
{
uint32_t tmp_psize = 0x0;
FLASH_Status status = FLASH_COMPLETE;
/* Check the parameters */
assert_param(IS_FLASH_SECTOR(FLASH_Sector));
assert_param(IS_VOLTAGERANGE(VoltageRange));
if(VoltageRange == VoltageRange_1)
{
tmp_psize = FLASH_PSIZE_BYTE;
}
else if(VoltageRange == VoltageRange_2)
{
tmp_psize = FLASH_PSIZE_HALF_WORD;
}
else if(VoltageRange == VoltageRange_3)
{
tmp_psize = FLASH_PSIZE_WORD;
}
else
{
tmp_psize = FLASH_PSIZE_DOUBLE_WORD;
}
/* Wait for last operation to be completed */
status = FLASH_WaitForLastOperation();
if(status == FLASH_COMPLETE)
{
/* if the previous operation is completed, proceed to erase the sector */
FLASH->CR &= CR_PSIZE_MASK;
FLASH->CR |= tmp_psize;
FLASH->CR &= SECTOR_MASK;
FLASH->CR |= FLASH_CR_SER | FLASH_Sector;
FLASH->CR |= FLASH_CR_STRT;//程序死在这一句
/* Wait for last operation to be completed */
status = FLASH_WaitForLastOperation();
/* if the erase operation is completed, disable the SER Bit */
FLASH->CR &= (~FLASH_CR_SER);
FLASH->CR &= SECTOR_MASK;
}
/* Return the Erase Status */
return status;
}
FLASH_CR_STRT根据数据手册的表述--------位 16 STRT:启动 (Start)
该位置 1 后可触发擦除操作。该位只能通过软件置 1,并在 BSY 位清零后随之清零。
已经按照6楼和 14.15楼老司机的指点,参考香水城的帖子【实战经验】KEIL中如何让程序在 RAM 中运行测试过,依旧死机。
下图是将对flash操作的所有相关函数放到ram中。
7月3日,现在将库函数FLASH_Status FLASH_EraseSector()中的 FLASH->CR |= FLASH_CR_STRT;注释掉了。竟然写flash成功了。
@香水城
最新进展,测试发现在uart3的初始化配置如下
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
将 uart3的RX语句GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;注释掉。
将库函数FLASH_Status FLASH_EraseSector()中的 FLASH->CR |= FLASH_CR_STRT;恢复。读写flash成功。
不明白串口3与flash有什么必然联系。uart3使用 DMA收发数据。
|
结贴了,细节请移步37楼