[STM32F0]

swd仿真设置哪里出了问题

[复制链接]
1463|21
手机看帖
扫描二维码
随时随地手机跟帖
dengdc|  楼主 | 2018-5-28 14:52 | 显示全部楼层 |阅读模式
我的CPU是stm32f030,使用swd方式仿真调试,使用的仿真器是jlink,在调试UART时,只要uart口有数据进来,我设置断点暂停程序,然后再点全速运行后,程序就不停的进UART中断,但是我reset之后全速跑,不暂停程序是没有问题的。不知道swd仿真设置哪里出了问题?
heweibig| | 2018-5-28 14:54 | 显示全部楼层

仿真毕竟不是真实的,所以你全速正常跑正常才最要紧,看你说的是正常跑没有问题,有问题的是仿真,那还担心个锤子啊。

使用特权

评论回复
wuhany| | 2018-5-28 14:55 | 显示全部楼层

中断程序,加上溢出处理看看;

使用特权

评论回复
jiahy| | 2018-5-28 14:56 | 显示全部楼层

也许是有时效性较高的函数,你调试后中断了,然后系统就认为超时了。

使用特权

评论回复
dengdc|  楼主 | 2018-5-28 14:57 | 显示全部楼层

因为我仿真有些程序需要用到uart进来的程序,但是一旦设置断点调试其他子程序时,程序就死了。。。那后续没法调试了呢。

使用特权

评论回复
dengdc|  楼主 | 2018-5-28 14:59 | 显示全部楼层

只有一个UART中断和一个定时中断而已,我把UART的波特率设置为9600bps,还是不行。。。。真不知道怎么整的了?

使用特权

评论回复
dengdc|  楼主 | 2018-5-28 15:00 | 显示全部楼层
如果全速跑,UART不会产生OVERRUN ERROR,但是如果设置了中断,就会产生这个错误标识,然后会进入UART中断。。。。

使用特权

评论回复
dengdc|  楼主 | 2018-5-28 15:01 | 显示全部楼层
应该解决了这个问题,是由于CPU的UART_CR3中的OVRDIS没有打开,所以就一直在判断接收buf是否有数据溢出。
OVRDIS: Overrun Disable
This bit is used to disable the receive overrun detection.
0: Overrun Error Flag, ORE, is set when received data is not read before receiving new data.
1: Overrun functionality is disabled. If new data is received while the RXNE flag is still set
the ORE flag is not set and the new received data overwrites the previous content of the
USARTx_RDR register.
This bit can only be written when the USART is disabled (UE=0).
而且一定要在USART不打开的前提下关闭。仿真的时候把这个设置bit设置为1了,就可以继续断点执行了。

使用特权

评论回复
dengdc|  楼主 | 2018-5-28 15:02 | 显示全部楼层
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_OverrunDetectionConfig(USART1,USART_OVRDetection_Disable);        
USART_Cmd(USART1, ENABLE);

使用特权

评论回复
wuhany| | 2018-5-28 15:03 | 显示全部楼层
断点调试只是作为一个辅助手段,只要你的代码能够顺利执行就行了

使用特权

评论回复
jiahy| | 2018-5-28 15:05 | 显示全部楼层
程序初始化有点问题把

使用特权

评论回复
lizye| | 2018-5-28 15:07 | 显示全部楼层
做开发以实际的运行为准,因为你的产品不是运行在调试模式下,调试模式只是开发过程中的一个可选的验证方式,但是不是必须的

使用特权

评论回复
kangzj| | 2018-5-28 15:11 | 显示全部楼层

ARM调试理念是非侵入的,实际上各家真正实现的时候有时候可能没考虑到一些细节,或者懒得去修改,造成调试时候仿真器的访问会影响寄存器值。  STM32L152遇到过,具体忘了,有个寄存器标志位好像是读后自动清除的,KEIL只要打开外设窗口就不行,因为打开了窗口调试器会读对应值去更新电脑显示,程序就读不到对应位了。 后面用自己写的SWD接口频繁读也验证了。        其他非ARM核的芯片,也难免会在哪个地方有这样的细节疏忽,我们用户改不了芯片,只能尽量避开这些玩意。

使用特权

评论回复
shimx| | 2018-5-28 15:12 | 显示全部楼层
我也遇到过这个问题,原因是:使能了接收中断,那么ORE中断也同时被开启了。数据寄存器溢满,将接收到的无用数据丢弃。
程序上加上一下代码,问题解决:
if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断
    {
        USART_ReceiveData(USART1);
    }

使用特权

评论回复
jiaxw| | 2018-5-28 15:13 | 显示全部楼层

OVRDIS: Overrun Disable接收溢出判断关闭位

使用特权

评论回复
spark周| | 2018-5-28 15:13 | 显示全部楼层

his bit can only be written when the USART is disabled (UE=0).
而且一定要在USART不打开的前提下关闭。仿真的时候把这个设置bit设置为1了,就可以继续断点执行了。

使用特权

评论回复
liliang9554| | 2018-5-28 15:14 | 显示全部楼层

是不是因为使能了接收中断,ORE中断也同时被开启了

使用特权

评论回复
午夜粪车| | 2018-5-28 15:17 | 显示全部楼层

数据寄存器溢满中断一般用不到吧,初始化就不使能是不是可以避免这个问题

使用特权

评论回复
zhaoxqi| | 2018-5-28 15:18 | 显示全部楼层
我有时候也会碰到类似的情况。我感觉是因为USART接收数据是异步的,CPU被中断后,USART的部分硬件电路仍在工作,所以CPU再恢复的时候,可能会导致中断标志位不能清除,所以就一直进中断。所以设断点调试的时候要特别小心。

使用特权

评论回复
heweibig| | 2018-5-28 15:19 | 显示全部楼层
你使能接收中断的时候,就自动使能溢出中断,你可以在初始化的时候,特意将ORE中断关掉试试。当实时通信(一般单片机要跑好几个小时的情况),都会出现这个情况。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

892

主题

13885

帖子

7

粉丝