STM32
直播中

半导体开发

10年用户 875经验值
擅长:可编程逻辑
私信 关注
[问答]

通过SWD协议给STM32E103芯片烧写程序,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)));                        


回帖(1)

张超

2024-4-12 16:05:28
问题可能出在以下几个方面:

1. SWD通信问题:请确保SWD通信连接正常,没有任何松动或接触不良的情况,可以重新连接检查一遍。

2. STM32芯片配置问题:确认你的芯片已正确配置为SWD模式,而不是其它调试模式。

3. 芯片状态问题:确保芯片没有进入保护模式,或被其他程序占用。你可以尝试先擦除整个flash,在开始烧写烧录文件之前,确保芯片flash完全清空。

4. 烧写工具问题:尝试不同的烧写工具,或者使用官方提供的官方ST-LINK/V2烧写器进行烧写。

5. 代码问题:在烧写过程中,可能会发生意外情况,例如无法正确接收数据,字节顺序错误等。你可以尝试重新审查和调整代码以确保正确发送和接收数据。

6. 超时设置问题:你可以尝试增加超时时间或调整超时设置,以适应慢速烧写过程。

希望以上几点能帮到你,祝你成功解决问题!如还有其他问题,请随时追问。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分