单片机程序调试点滴(一)

单片机用了很多年,也做过很多案例,有做心得笔记的习惯,以此分享给大家。

实例调试中经常会犯一些低级的错误,写此系列,供大家参考:

一 、灵动微MM32F103+串口点对点激光雷达实现摩托车后测距系统

       项目采用上海灵动微的MM32F103 M3芯片,用串口1~3,连接3个点对点的激光模块,实现到魔托车正后方与后左右两边各30度的测距,目的是在后方10米内出现车子等障碍物时,根据障碍物的距离,前后指示灯做出闪光等警示动作,提醒后车及摩托车手注意。

程序调试过程中出现以下问题:

      1.程序总是出现收到数据延后,查程序,用DMA,中断等方式接收都是这样,后来用中断接收发现,程序总是进入if(UART_GetITStatus(UART1, UART_IT_ERR)  != RESET),说明串口出现大量错误,用逻辑分析仪采集,发现串口数据是对的,只是将采集频率用1M去采集,显示雷达发出的数据帧错误,2M就不会,怀疑雷达的TIMER不准,问厂家,雷达内没有用晶振,且这边主板上也没有用晶振,两边误差一加起来,可能就超过了串口的允许误差,为了验证这个问题,工作时将芯片加热,果然更严重,将波特率改为9600,有会所改善,但还是不能解决这个问题,将主板重新设计,加上晶振,这个问题解决。

     此问题的最终原因是,芯片与LED指示灯是同一块板子上,指示灯又很多,指示灯点亮时,板子很快就会发热,热了后,MCU内部的振荡器会出现偏差,导致串口波特率误差太大,不断出现数据错误,所以以加晶振来解决。

    心得:对于类似于串口通信这种对时钟精度较严格的应用,最好还是使用晶振,以免以后出现问题。

   

2.改过后的主板,串口不出错,但工作一段时间,随机出现死机,用仿真器仿真,死机后停止程序,发现程序停在以下,出现HarkFault

同时发现,雷达照近距离物体,所有灯全亮时,很快出现这个问题,于是将串口与DMA全部DISABLE掉,只是LED灯工作,加热芯片,马上死机,但仿真器出现以下

怀凝是不是所有IO上的总电流太大,因为所有IO规格不能大于25MA,查电路图发现IO驱动LED的电阻,有4个错成1K,这4路就有17MA的电流,将这些电阻改为10K,工作一下午,再也没有出现HarkFault,问题解决。

心得:所有指示灯有28颗LED,这时就要考虑所有IO上的总电流不能超过芯片的规格值,本例问题出在有4个LED灯的限流电阻出错,造成IO总电流超限,出现莫名其妙的错误。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值