Flash擦除失败,求指教

2019-07-21 04:25发布

void TIM1_Init(void)
{
        TIM_ClockConfigTypeDef sClockSourceConfig;


        //HAL_TIM_Base_DeInit(&TIM1_Handler);//加这句代码导致Flash擦除失败
        TIM1_Handler.Instance = TIM1; //通用定时器 2
        TIM1_Handler.Init.Prescaler = 0; //分频系数,不分频72MHz
        TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
        TIM1_Handler.Init.Period=0xFFFF; //自动装载值
        TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //时钟分频银子
        HAL_TIM_Base_Init(&TIM1_Handler);

        //设置位外部时钟2模式
        sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
        sClockSourceConfig.ClockPolarity = TIM_ETRPOLARITY_NONINVERTED;
        sClockSourceConfig.ClockPrescaler = TIM_ETRPRESCALER_DIV1;
        sClockSourceConfig.ClockFilter = 0x0;
        HAL_TIM_ConfigClockSource(&TIM1_Handler, &sClockSourceConfig);
        __HAL_TIM_SET_COUNTER(&TIM1_Handler,0);
        HAL_TIM_Base_Start(&TIM1_Handler);
        /**/
}



/********************************
*函数功能:Flash按页写入
*传入参数age_Addr页首地址,*pBuffer写入的数据
*传出参数:无
*返回值:0:写Flash正确1:地址超出范围,2:地址不是页首地址,3:擦除页失败
*********************************/
u8 STMFLASH_Page_Write_Double_Word(u32 Page_Addr,u64 *pBuffer)       
{
        u32 Page_error;
        FLASH_EraseInitTypeDef FlashEraseInit;
        u8 sta;
        //TIM2_Disable();
       
        if(Page_Addr<STM32_FLASH_BASE||(Page_Addr>=(STM32_FLASH_BASE+STM_SECTOR_SIZE*STM32_SECTOR_NUM)))
        {
                printf("age_Addr = %X ",Page_Addr);
                printf("地址超出范围 ");
                return 1;//非法地址
        }
        else if(((Page_Addr-STM32_FLASH_BASE)%STM_SECTOR_SIZE) != 0)
                {
                        printf("非页首地址 ");
                        return 2;//非法地址
                }

        HAL_FLASH_Unlock();             //解锁       

        FlashEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;       //擦除类型,扇区擦除
        FlashEraseInit.Banks = FLASH_BANK_1;   //位于哪个块
        FlashEraseInit.Page = STMFLASH_Get_Page_Num(Page_Addr);  //擦除哪个扇区
        FlashEraseInit.NbPages = 1;       //一次只擦除一个扇区
        sta = HAL_FLASHEx_Erase(&FlashEraseInit,&age_error);
        printf("sta = %d ",sta);
        if(sta != HAL_OK)
        {
                printf("擦除页失败 ");
                return 3;
        }
       
        FLASH_WaitForLastOperation(FLASH_WAITETIME);            //等待上次操作完成


        STMFLASH_Write_Double_Word(Page_Addr,pBuffer,STM_PAGE_SIZE);//写入整个扇区  

        HAL_FLASH_Lock();//上锁
        //TIM2_Enable();
        return 0;
}

现象是这样的:
HAL_TIM_Base_DeInit(&TIM1_Handler);加上这句代码之后,Flash擦除失败sta = 1;
注释掉HAL_TIM_Base_DeInit(&TIM1_Handler);这句代码之后,Flash擦除成功sta = 0;

虽然是解决我的问题了,但是不知其所以然,想搞明白导致擦除失败的根本原因。这两者之间
到底有什么关联点呢?研究了下DeInit函数,没发现特别的地方。请大神指教!!!@正点原子


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
lvkanger
1楼-- · 2019-07-21 09:37
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-07-21 14:22
帮顶
午夜狼嚎
3楼-- · 2019-07-21 15:34
你定时器中断里面是不是影响了擦写
lvkanger
4楼-- · 2019-07-21 16:13
 精彩回答 2  元偷偷看……

一周热门 更多>