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函数,没发现特别的地方。请大神指教!!!@正点原子
一周热门 更多>