FLASH_FLAG_EOP标志位在多次操作后置位超时
通过SWD协议给STM32E103芯片烧写程序的时候发现,在烧写过程中,数据能发送出去(reveive_success_mark==1),读SR->FLASHBUSY也能置位,但是SR->FLASHEOP一直置位超时,跪求各位大神帮忙看一下是什么问题,感谢!!!下面是出问题部分的代码:
reveive_success_mark=0;
nRF51_return_Timeout=0;
TIM3_ENABLE(); //开定时器3,共25ms超时
do
{
reveive_success_mark=swd_write_block(addr,Send_buffer,TransMaxLen);
if(nRF51_return_Timeout>NUMdelay)
{
TIM3_DISABLE();
return ERROR_TIME_HALT;
}
}while(!(reveive_success_mark==1));
TIM3_DISABLE();
Delay_n_ms(500);
/*判断是否忙*/
reveive_success_mark=0;
nRF51_return_Timeout=0;
TIM3_ENABLE(); //开定时器3,共25ms超时
do
{
reveive_success_mark=swd_read_word(FLASH_SR,&val);
if(nRF51_return_Timeout>NUMdelay)
{
TIM3_DISABLE();
return ERROR_TIME_HALT;
}
}
while(!((reveive_success_mark==1)&&((val&FLASHBUSY)==FLASHREADY)));
TIM3_DISABLE();
Delay_n_ms(500);
/*判断是否成功操作*/
reveive_success_mark=0;
nRF51_return_Timeout=0;
TIM3_ENABLE(); //开定时器25ms
do
{
reveive_success_mark=swd_read_word(FLASH_SR,&val);
if(nRF51_return_Timeout>NUMdelay)
{
TIM3_DISABLE();
return ERROR_TIME_HALT;
(每次都会因超时进入此地方,加长超时无效)
}
}
while(!((reveive_success_mark==1)&&((val&FLASHEOP)==FLASHEOP)));
还有个奇怪的想象是,如果在keil5里用Jlink调试全速运行的话,大部分时候都会测试通过,但是一脱机自己运行的话,就会报错。 还有个奇怪的现象是,如果在keil里用jlink调试状态下全速运行,大部分时候都没问题,但是一脱机自己跑的话,就会出现错误。 EOP的意思是操作完成的意思啊,手册上是这样描述的 The end of the program operation is indicated by the EOP bit in the FLASH_SR register.
页:
[1]