stm32的串口5接485,115200波特率导致死机,9600却没事,求助!!

2019-12-27 18:59发布

本帖最后由 guxingganyue 于 2012-11-22 09:34 编辑

如题,我用stm32f103VET6的串口5和485通信,串口每次向485发送150字节,上位机每个1秒发一条命令,串口收到后就向485发送150字节

目前的现象是115200波特率的话,单片机会死机(lcd屏幕不刷新了),但是定时器中断还能触发(led灯在闪烁),26秒后内部狗复位,一切恢复正常

上位机继续发命令,不到3分钟的时间单片机死了

但是我用9600的波特率通信,1秒发一次命令,测试了1个晚上机器也没有死机

1、单片机和上位机间的连线不是很长,就2米左右,485芯片为:max3485,贵的那种
2、stm32外接8M晶振,系统跑72M

下面是485的连接图:请高手指教

注:把那个120欧姆的电阻去掉与否现象一样

111.png (38.89 KB, 下载次数: 0) 下载附件 2012-11-22 09:32 上传

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
37条回答
zzfei90
1楼-- · 2019-12-30 10:10
我感觉你再开个定时器,每次开始接收数据的时候打开定时器开始计数,如果超时还没有接收完的话就把这包数据丢弃了,要不然,可能会使接收到的数据乱
guxingganyue
2楼-- · 2019-12-30 15:24
本帖最后由 guxingganyue 于 2012-11-22 12:03 编辑
guxingganyue 发表于 2012-11-22 10:13
电脑发送:X2000S1234567Y,其中X Y是协议的头,尾。2000S是固定不变的,1234567是一个机器的7位ID号
串口 ...


9楼的中断优先级描述的不清楚,下面是清楚的
  1. void NVIC_Configuration(void)
  2. {
  3.     NVIC_InitTypeDef NVIC_InitStructure;
  4.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  5.     // Enable the Timer1 Interrupt
  6.     NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;         //向量地址设置,定时器1更新中断
  7.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //设定Timer1的抢占式优先级
  8.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //设定Timer1的响应优先级
  9.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //使能
  10.     NVIC_Init(&NVIC_InitStructure);                            //初始化

  11.     //使能串口5接收中断
  12.     NVIC_InitStructure.NVIC_IRQChannel =UART5_IRQn;            //向量地址设置,外部中断
  13.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //设定外部中断的抢占式优先级
  14.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;         //设定外部中断的响应优先级
  15.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //使能
  16.     NVIC_Init(&NVIC_InitStructure);

  17.     // Enable the PA8 exit Interrupt
  18.     NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;         //向量地址设置,外部中断
  19.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //设定外部中断的抢占式优先级
  20.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;         //设定外部中断的响应优先级
  21.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //使能
  22.     NVIC_Init(&NVIC_InitStructure);
  23.    
  24.     //使能串口4接收中断
  25.     NVIC_InitStructure.NVIC_IRQChannel =USART4_IRQn;           //向量地址设置,外部中断
  26.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //设定外部中断的抢占式优先级
  27.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //设定外部中断的响应优先级
  28.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //使能
  29.     NVIC_Init(&NVIC_InitStructure);
  30. }
复制代码
guxingganyue
3楼-- · 2019-12-30 18:45
dadatou 发表于 2012-11-22 10:43
问题就在这里的可能性相当大.你的定时器的优先级比串口还高,当串口的波特率比较高的时候,你如何保证可靠 ...

好的,我试试
dadatou
4楼-- · 2019-12-30 19:53
 精彩回答 2  元偷偷看……
dadatou
5楼-- · 2019-12-31 00:52
guxingganyue 发表于 2012-11-22 12:17
好的,我试试

怎么样啊?楼主,问题解决了要上来跟大家分享一下啊.
buliaoqqlp
6楼-- · 2019-12-31 04:32
9600能运行说明不是硬件问题了,楼主的程序肯定有问题,需要多加磨练。

一周热门 更多>