初级会员

- 积分
- 96
- 金钱
- 96
- 注册时间
- 2017-7-4
- 在线时间
- 14 小时
|
10金钱
使用STM32G0B1写内部的Flash时出现问题,代码:
#pragma arm section code = "RAMCODE"
uint32_t NorFlash_Write_ttu(uint16_t operateCmd, uint32_t startAddr, uint32_t * pPageDatas, uint16_t datasLen)
{
uint16_t writeCount = datasLen / 8; //因为datasLen传入的长度是固定1024(按byte算的),而实际写Flash是按64字节写入的,所以这里转换为uint64_t类型时的长度
uint16_t i;
uint8_t retry = 3;
HAL_StatusTypeDef status = HAL_OK;
// 清除Flash待处理标识
//__HAL_FLASH_CLEAR_FLAG(HAL_FLASH_GetError());
// 解锁Flash写
HAL_FLASH_Unlock();
// 检查BUSY状态
do
{
status = FLASH_WaitForLastOperation(10);
if((HAL_ERROR == status) || (--retry == 0))
{
//HAL_FLASH_Lock();
return HAL_FLASH_GetError();
}
}while(HAL_TIMEOUT == status);
// 擦除将要写入的地址页
if(operateCmd & 0x0002) //设标志判断是否需要擦除
{
FLASH_PageErase(FLASH_BANK_1, (startAddr - NORFLASH_START_ADDRESS) / NORFLASH_PAGE_SIZE);
retry = 3;
do
{
status = FLASH_WaitForLastOperation(10);
if((HAL_ERROR == status) || (--retry == 0))
{
//HAL_FLASH_Lock();
return HAL_FLASH_GetError();
}
}while(HAL_TIMEOUT == status);
// 注:擦除完成后控制寄存器(CR寄存器)的擦除使能位(PER位)不会自动清除,需要手动清除
CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
}
// 写入数据
for(i = 0; i < writeCount; ++i)
{
// 写入Flash,注意写入时是64位写入,i*2是因为pPageDatas是uint32_t类型(为了代码兼容)
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, startAddr + i * 8, *(uint64_t *)(pPageDatas+i*2)) != HAL_OK)
{
//HAL_FLASH_Lock();
return HAL_FLASH_GetError();
}
}
// 加锁FLASH
HAL_FLASH_Lock();
// 判断写入结果
return HAL_OK;
}
#pragma arm section
遇到的问题是,基于nucleo-g0b1re开发板,新建的工程实现这个写flash操作和一个串口输出log,每次起来后在HAL_FLASH_Unlock()之后,状态寄存器(SR)都会置位0x000000A0,即PGA编程对齐错误和PGSERR编程顺序错误;另外unlock()之后的FLASH_WaitForLastOperation()中清除SR寄存器语句之后,会置位成0x00040000,即CFGBSY 编程或擦除配置繁忙位置1,所以把HAL_FLASH_Lock()屏蔽了,执行这个会导致程序hard_fault
有在HAL_Init()和SystemClock_Config()处加断点查看SR寄存器,此时就已经是0x000400A0。有怀疑芯片坏了,但换芯片后仍旧有问题。
求教如何解决,或相关的代码
|
|