STM32F103常见问题分析与解决

说明:自2017年8月份开始,再次进入到研发团队,逐步开始用51系列单片机做产品,后续主要将51更新成STM32。本文主要针对日常使用STM32F103所遇到的问题进行梳理总结,包括硬件部分、软件部分、调试部分等,通过“问题描述”、“问题预测”、“解决方案”、“小结”这几方面对遇到问题并解决问题的过程进行记录和分析,将进行持续更新。日常使用的STM32F103主要是VET6和C8T6两款。

一、硬件部分

1、关于下载过程出错的现象,提示”RDDI-DAP Error”。

  • 问题描述

    物联网网关电路板调试过程使用SWD下载方式,出现SWD时而能下载时而不能下载的现象。打开options选项可以到debug下面的SW Device中显示“RDDI-DAP Error”。

  • 问题预测

    ①有多次下载时,将其切换到BOOT0:BOOT1=1:1状态下载正常,预测是BOOT位设置对其有影响。即是代码中不小心关闭了JLINK和SWD调试模式,只能通过串口下载或将BOOT位切换为11时使用SWD下载。
    ②取下WIFI模块后和串口调试助手模块后,下载正常,预测是串口对SWD产生了影响。即是电路信号干扰或数据冲突。
    ③但以上两种方式并不是屡试不爽,很多时候更改BOOT位,取下串口有关模块依旧不能正常下载。

  • 解决方案

    在以上两种意外情况都同时发生的状态下,考虑硬件方面的焊接问题,可能因为对电路板的操作增大了焊接不稳定性。仔细观察电路板并补焊后解决问题。

  • 小结
    出现异常与不稳定性时,应该首先考虑虚焊问题,这个问题简单但容易被忽略,而且产生了之后难以判断。所以与硬件相关的异常情况应该先考虑硬件稳定性。

2、关于按键检测出现的不稳定现象。

  • 问题描述
    网关配置过程需要实现按键检测功能,但在程序实现按键检测后,出现手触摸、上电,接电线等操作讲直接触发低电平。

  • 问题预测
    ①程序出错;
    ②I/O口损坏;
    ③上/下拉电路不正确。

  • 解决方案
    在I/O口检测的功能方面,如果是低电平触发,则应该将GPIO的模式设置为输入模式,而且是上拉输入模式。仔细看代码配置,将IO口配置成了浮空输入,即没有上拉或下拉的状态,是一种不确定状态,所以单片机会时不时检测到低电平触发。

  • 小结

    ①首先,STM32的GPIO总共有8种工作模式:(标准库)

  • 输入
    浮空输入(GPIO_Mode_IN_FLOATING)
    上拉输入(GPIO_Mode_IPU)
    下拉输入(GPIO_Mode_IPD)
    模拟输入(GPIO_Mode_AIN)

  • 输出
    开漏输出(GPIO_Mode_Out_OD)
    推挽输出(GPIO_Mode_Out_PP)
    复用开漏输出(GPIO_Mode_AF_OD)
    复用推挽输出(GPIO_Mode_AF_PP)

②各类模式的理解

  • 浮空:没有上/下拉电阻;
  • 上拉:有IO口内部上拉电阻,初始化后默认高电平;
  • 下拉:有IO口内部下拉电阻,初始化后 默认低电平;
  • 模拟输入:可用于采集模拟信号。
  • 开漏:相当于三极管集电极,内部控制一个MOSFET导通或关闭,只能输出低电平,要输出高电平需要加外部上拉。电流吸收能力强,可以用外部上拉匹配不同电平。缺点是上拉电阻会引起时延。
  • 推挽:常用的一种模式。内部由两个三极管或MOSFET控制,一个三极管或MOSFET导通另一个便关端,且两个管子承载相位相反,各负责正负半周期,构成完整信号。满足了负载功率和开关速度。重在理解“推挽”二字。
  • 复用功能:开启复用功能并对其设置输入输出功能时使用。例如串口的输出功能,一般采用复用推挽输出。另外,使用自带IIC、SPI功能时也会用到。

二、软件部分

1、关于下载程序后,需要按复位按钮才能正常运行程序的问题。

  • 问题描述:
    下载程序后,一开始用SWD自动复位启动程序没有发现问题,后来调试完毕拔掉SWD接线后,重新开机代码不能运行,只有手动将单片机RESET(复位)接地后才能正常运行。

  • 问题预测:
    遇到问题后,一开始没有相关经验, 在网上找了很多资料,一方面是说在串口下载的时候,勾选了“编程到FLASH”一项,以至于在从内部存储器启动的时候无法运行;另一方面是说在FRAM没有进行初始化,需要进行一定的延时等等。但尝试后依旧无效,并且没有找到根源。

  • 问题解决
    此问题出现过两次,通过与正常程序的对比,发现第一次是将延时函数的初始化放到了时钟配置初始化函数的前面,导致延时函数无效,在初次运行程序时就会卡在第一个延时的地方。第二次是MP3模块上电初始化需要一定的延时,而单片机未等到模块初始化就跑完了代码,导致程序卡在MP3部分或根本忽略掉MP3模块。

  • 小结
    根据网上的经验和个人经验,首先排除硬件如虚焊、晶振不起振等原因,在软件方面出现这种问题的原因可能有以下几种:
    ①若是用串口下载,注意下载代码的存储区是否与BOOT配置不对应;若是SWD或JLINK下载,注意下载器的RESET是否一直处于有效状态。
    ②确定时钟配置是否正确,且在其他功能函数之前,注意配置顺序,比如中断配置、延时函数、外设配置等。
    ③检查外设模块,是否需要待其进行硬件本身初始化,如射频模块、音频播放、液晶屏、外设RAM等。
    2、使用strcat连接字符串出现乱码

  • 问题描述:
    使用strcat连接两个字符串后并通过串口打印出来,结果出现连接不完整或重复等现象。

  • 问题预测:
    初步估计是函数使用不当,因为该函数只能连接两个字符串。

  • 问题解决:
    修改字符串长度(数组长度)后,问题解决。

  • 小结:
    很多乱码问题都是由内存分配不当引起的,内存不足或发生重叠即可能发生数据乱码现象,所以在对内存进行操作的时候要重点考虑内存分配问题。
    同时注意C语言的字符串实际上都是字符型的数组形式,只是以不同的方式来操作。

三、调试部分

在使用串口调试的时候,常会采用一种方法,如图:


(至2018年2月11日)


猜你喜欢

转载自blog.csdn.net/u010834669/article/details/79312658
今日推荐