fancy0411 发表于 2020-6-12 11:24:11

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)));                        

fancy0411 发表于 2020-6-12 13:58:40

还有个奇怪的想象是,如果在keil5里用Jlink调试全速运行的话,大部分时候都会测试通过,但是一脱机自己运行的话,就会报错。

fancy0411 发表于 2020-6-12 13:59:57

还有个奇怪的现象是,如果在keil里用jlink调试状态下全速运行,大部分时候都没问题,但是一脱机自己跑的话,就会出现错误。

butterflyspring 发表于 2020-6-28 17:42:28

EOP的意思是操作完成的意思啊,手册上是这样描述的 The end of the program operation is indicated by the EOP bit in the FLASH_SR register.
页: [1]
查看完整版本: FLASH_FLAG_EOP标志位在多次操作后置位超时