21ic电子技术开发论坛 单片机与嵌入式系统 德州仪器MCU 高波特率下串口0发送卡死
发新帖我要提问
返回列表
打印

高波特率下串口0发送卡死

[复制链接]
1500|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xqy281|  楼主 | 2016-1-26 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xqy281 于 2016-1-26 20:11 编辑

首先交代一下情况:


晶振14.7456mhz
串口0波特率:115200
看门狗:已开启,32ms,时钟源fSMCLK


串口发送函数:
/******************************UART发送字节函数*************************/
void Uart0Putchar(uchar c)
{
    while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
    UCA0TXBUF=c;
    IFG2 &= ~UCA0TXIFG;
}

void Usart0SendFrame(uchar *src, uchar len)
{
    uchar i;
   
    for(i=0;i<len;i++)
      {
          Uart0Putchar(src[i]);
      }
}
好了开始说事了!
情况是这样的:不断的主动发送24字节,
                        同时串口中断也在接受24个字节,
                        间隔1s这样的操作,大概15分钟后卡死在了发送完成等待处的代码。
<b>while (!(IFG2&UCA0TXIFG));</b>
然后我测量了一下板子上的情况是:晶振还在振,定时器还在走,外部中断也是正的。
疑惑的地方有两个:
第一为什么这样子操作会发送卡死?
第二为什么开了看门狗却没有复位,特么老子就是为了这个问题才加看门狗的!!


注:看门狗是有作用的,我特意验证过了,而且卡死的时候查看寄存器“WDTTMSEL”是置一的,那就证明在卡死发生前看门狗开始开着的,不存在关了看门狗再卡死的情况。

各位论坛大神啊!你们显灵的时候到了啊!!

不胜感激啊~~~~

相关帖子

沙发
xqy281|  楼主 | 2016-1-26 20:10 | 只看该作者
顶起

使用特权

评论回复
板凳
dirtwillfly| | 2016-1-27 11:23 | 只看该作者

不一定是程序的问题。
能运行15几分钟,说明程序没大问题,有问题的话也是堆栈溢出之类的。
也有可能是硬件或者环境的干扰等问题。看看这个时间点有什么硬件操作或变化

使用特权

评论回复
地板
angerbird| | 2016-1-27 13:13 | 只看该作者
关键是你这个时钟的频率太低了,不够用的。

使用特权

评论回复
5
xqy281|  楼主 | 2016-1-27 13:19 | 只看该作者
dirtwillfly 发表于 2016-1-27 11:23
不一定是程序的问题。
能运行15几分钟,说明程序没大问题,有问题的话也是堆栈溢出之类的。
也有可能是硬 ...

那看门狗不起作用哪又这么解释呢?

使用特权

评论回复
6
dirtwillfly| | 2016-1-27 14:15 | 只看该作者
xqy281 发表于 2016-1-27 13:19
那看门狗不起作用哪又这么解释呢?

不清楚啊。能上传完整代码看看吗?

使用特权

评论回复
7
xqy281|  楼主 | 2016-1-27 14:56 | 只看该作者
dirtwillfly 发表于 2016-1-27 14:15
不清楚啊。能上传完整代码看看吗?

传不了啊,公司的项目

使用特权

评论回复
8
smilingangel| | 2016-1-27 16:48 | 只看该作者
这个跟UART口的采用的时钟源有关系的。

使用特权

评论回复
9
xqy281|  楼主 | 2016-1-27 17:04 | 只看该作者
smilingangel 发表于 2016-1-27 16:48
这个跟UART口的采用的时钟源有关系的。

我测试了一下,一边主动发送一边中断接收,就会卡死
一直主动发送就没有卡死过

那请问跟时钟源有什么关系呢?

使用特权

评论回复
10
xqy281|  楼主 | 2016-1-28 15:35 | 只看该作者
dirtwillfly 发表于 2016-1-27 14:15
不清楚啊。能上传完整代码看看吗?

好了我知道为什么看门狗不起作用了,

正确的配置是这一句话 WDTCTL = WDT_MRST_32;

但我特么就写成了这句话  WDTCTL = WDT_MDLY_32;

好伤心啊

使用特权

评论回复
11
dirtwillfly| | 2016-1-28 16:03 | 只看该作者
xqy281 发表于 2016-1-28 15:35
好了我知道为什么看门狗不起作用了,

正确的配置是这一句话 WDTCTL = WDT_MRST_32;

继续加油啊,偶尔有点小问题是正常的

使用特权

评论回复
12
chuntian2016| | 2016-1-29 11:12 | 只看该作者
这个增大主频率的波特率的。

使用特权

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

本版积分规则

23

主题

71

帖子

1

粉丝
关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部