打印
[STM32F0]

STM32F030F4P6的串口挺奇怪的。。。

[复制链接]
6072|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
diweo|  楼主 | 2014-9-5 11:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void USART1_IRQHandler(void)
{
        uint8_t tmpData;
        if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
        {
                USART_SendData(USART1, UsartControlBlock.TxBuffer[UsartControlBlock.IndexPointer_Tx++]);
                UsartControlBlock.isSending = TRUE;
                if(UsartControlBlock.IndexPointer_Tx == USART_BUFFER_SIZE_TX)
                {
                        UsartControlBlock.IndexPointer_Tx = 0;
                        UsartControlBlock.isSending = FALSE;
                        USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
                }
        }

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                tmpData = USART_ReceiveData(USART1);

                if(UsartControlBlock.isRxFrameStarted == FALSE)
                {
                        if(tmpData == FRAME_HEAD)
                        {
                                UsartControlBlock.isRxFrameStarted = TRUE;
                                UsartControlBlock.RxBuffer[UsartControlBlock.IndexPointer_Rx++] = tmpData;
                        }
                } else
                {
                        UsartControlBlock.RxBuffer[UsartControlBlock.IndexPointer_Rx++] = tmpData;
                        if(UsartControlBlock.IndexPointer_Rx == USART_BUFFER_SIZE_RX)
                        {
                                UsartControlBlock.isDataProcessPending = TRUE;
                                UsartControlBlock.isRxFrameStarted = FALSE;
                        }
                }
        }
}
串口的发送和接收都使能,发送是周期性的。
进入调试模式,在接收中断里面if(UsartControlBlock.isRxFrameStarted == FALSE)这一行设个断点。

问题现象:
如果接了外部设备,比如连接到电脑,打开串口助手,通信正常,程序运行不会中断;
但是把线断开之后,程序马上停在断点上,发现tmpData 就是上一次发送出去的值。点击‘运行’,程序又停在断点上,tmpData也是上一次发送出去的值。。。
把线连接上,再 点击‘运行’,程序还会再停一次,再 点击‘运行’,程序就连续运行不会中断了。

查看参考手册,发现有个“单线半双工通讯”模式,TX 和RX 引脚在芯片在内部是连在一起的。把这个模式禁用,问题依旧。

有没有朋友碰到过类似情况啊?






沙发
mmuuss586| | 2014-9-5 12:34 | 只看该作者

会不会线连接的有问题;

先改成接收中断,发送不中断方式,先试验成功;
逐步查找原因;

使用特权

评论回复
板凳
diweo|  楼主 | 2014-9-5 15:51 | 只看该作者
设备有2块板,大板用的STM32F103的,小板用的STM32f030的。
正常工作时,F030周期性发送数据给F103。偶尔F103会发个命令帧给F030,这样小板就执行指定的特殊操作。
原来挺正常的,触摸屏上按一下,F103转发命令,F030马上就响应了,触摸屏的显示数据马上变化。但是最近发现按触摸屏不灵敏了,有时候一按就行,不过大多数时候要按几次之后才有响应。
然后我调试小板程序的时候发现它会自己发给自己。我分析是它发给自己的数据和F103发过来的数据混了,然后主循环里面校验失败,所以不执行动作。
线连接没变过,应该不是它问题。

使用特权

评论回复
地板
搞IT的| | 2014-9-5 22:25 | 只看该作者
先改成接收中断,发送不中断方式,。。

使用特权

评论回复
5
pattywu| | 2014-9-5 22:41 | 只看该作者
同志哥,变量UsartControlBlock.IndexPointer_Rx是怎么处理的?
仔细检查一下。

使用特权

评论回复
6
bbstr| | 2014-9-5 23:42 | 只看该作者
别用单步调试中断,可以用一个串口输出log 调试另外一个串口

使用特权

评论回复
7
diweo|  楼主 | 2014-9-6 10:57 | 只看该作者
搞IT的 发表于 2014-9-5 22:25
先改成接收中断,发送不中断方式,。。

发送改成DMA方式,接收用中断,还是这样。

使用特权

评论回复
8
搞IT的| | 2014-9-8 21:26 | 只看该作者
diweo 发表于 2014-9-6 10:57
发送改成DMA方式,接收用中断,还是这样。

哎,我也不知道了,你只有多尝试看看啊

使用特权

评论回复
9
diweo|  楼主 | 2014-9-20 11:07 | 只看该作者
原来做的板子电源布局有点问题,猜想会对串口有影响。重新做了块板子,结果还是这样。
好在这个问题影响不大,可以用别的方法弥补一下。
以后有时间再慢慢研究了。

使用特权

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

本版积分规则

4

主题

1220

帖子

4

粉丝