2019年STM32F103调试笔记

1、现象:在做远程升级时,程序从备份区域读取到APP区域并校验成功之后,程序执行到GPRS模块时,始终在执行设置模块的第一句话。

   原因分析:原来以为和GPRS模块有关系,后来分析发现程序没有进入串口中断,进而发现是由于没有给串口中断设置偏移量(NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);在中断优先级配置处设置),

  总结:发现问题,不要着急,从问题的根源通过串口/LED灯一步一步打印分析。

2、现象:在做远程升级时,串口接收到APP数据之后校验不通过。

   分析原因:第一  校验函数不对(传参有错),第二 读取Flash数据时,读的数据个数不对。

  总结:写代码时自己挖的坑,冷静。

3、现象:远程控制器项目用GPRS联网MQTT注册不上去

   原因分析:通过网络调试助手,让设备连接到本地网络,观察设备发送的注册数据,发现数据最后两个字节不稳定。反推终于发现定义的数组太小。

   总结:写代码时没有理解清楚前辈代码的含义,一味模仿。

4、现象:调试断电保存功能时,只有第一次有作用,第二次断电重启现象都是默认全亮,逻辑上也没有问题。

   原因分析:Flash写0有效,写1无效,因此在每次写入数据之前需要将Flash相应空间擦除(擦除后数据均为FF);内部Flash为512kb为大容量,小于512kb为小容量。在stm32f10x_flash.c里面FLASH_Status FLASH_ErasePage擦除页函数有区别擦除的是2k还是1k,大容量擦除2k,小容量擦除1k。

5、现象:STM32F103单片机连接SIM800C模块,再DEBUG模式下模块可以运行,在普通模式下,开机给模块发送AT指令,模块没有返回;

  原因分析:单片机上电之后,模块启动需要一段时间,在模块启动之前加一个5秒的延时,这里还涉及到另一个硬件连接问题,STM32F103测试板应该通过4根线(电源正/电源负/USART_RX/USART_TX)就可以连接上SIM800C模块,但是在RT-thread系统提供的软件包里面还涉及到模块的软复位和一个检测模块状态的引脚,由于检测模块状态引脚错连到网络状态引脚,软复位引脚在模块上直接接地,单片机对应的引脚接到了模块断电复位引脚,导致系统一直硬件复位,有时也可以连接成功,换了个电源供电问题好多了(怀疑电源纹波干扰)。

   总结:在接手新项目的时候首先要简单做一个开发计划,把硬件部分和软件部分理清楚,再着手进行开发,嵌入式软件开发都是有迹可循的,根据调试信息一步一步分析既可,根据程序运行现象判断。

STM32F103ZE I2C1调试手记近日因项目需要,使用100PIN的STM32带FSMC功能驱动3.2"TFTLCD;在使用EEPROM时发现原来的I2C程序居然无法使用,郁闷了! 先说一下我这个I2C的驱动程序是经过STM32的官方库函数整理而成,API支持全系列EEPROM以及8BIT地址的其它I2C设备,一直用的很爽。 赶紧查找问题原因,发现连STA信号都无法启动完成,一直循环在等待状态while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); 真是见鬼了,居然连STA信号都无法建立,首先怀疑是硬件问题,于是赶紧查找硬件问题,换EEPROM,无果。奇了怪了,其它项目用的好好的程序,问百度吧?百度一下,这个问题还真多啊,而且还一模一样,问题都没结果,基本的认识是说ST芯片的问题,只能用模拟总线解决。 难道真是芯片问题?这可能吗?这可是ST啊,放眼全球有几家公司能与之抗衡啊。我首先觉得不可能,理由是为什么我其它项目用的好好的,虽说不是同PIN的芯片,可是同系列啊。于是我用其它项目的程序稍做修改,只开放IIC功能把程序下载到103ZE,运行一切正常。这就验证了我的判断,芯片不可能有问题。可为什么不行呢?难道是底层库函数的问题,于是升级库函数,移植到3.0版本的,这样捣鼓一下,一上午时间就这样没了,郁闷啊郁闷到差点绝望啊!!!先吃完中午饭,准备下午再战。再问百度吧,找来找去还是没结果,都说是芯片问题。纠结,难不成真的要用模拟I2C总线解决。不甘心啊,土法炼钢吧,把所有初始化程序一个一个注释掉,下载测试,当注释掉LCD初始化程序时,奇迹出现了,I2C总线OK了,天啦难道是LCD造成的?查看LCD初始化程序,FSMC初始化程序,没发现问题啊,再加上LCD初始化程序,I2C又不能工作了,看来确实是LCD的功能造成,先把FSMC注释掉,运行I2C又OK了,终于找到你了,就是FSMC造成的,看程序没有任何错误,还是查手册吧,在手册中看到I2C1的SDA脚与FSMC_NADV脚是共用一个端口,难道是这个引起的,查看手册《STM32F101xC/D/E 和 STM32F103xC/D/E勘误表》终于发现问题的根源。原文描述:2.7.15 FSMC和 I2C1以及TIM4_CH2问题描述如果要使用FSMC功能,NADV被配置成复用输出,该信号会被默认地置位。这样就和TIM4_CH2和I2C1的SDA信号发生冲突。暂时解决办法当使用FSMC的同时,不要使用TIM4_CH2。如果要使用I2C1并且封装允许,就把该功能重映射到PB8/PB9。2.7.13 SDIO 和经过重映射的I2C1配置条件当SDIO配置成1位或者4位模式,会和被重映射到PB8/9引脚上的I2C1发生冲突。冲突发生在以下信号之间:● I2C1_SCL和SDIO_D4● I2C1_SDA和SDIO_D5暂时解决办法当使用SDIO的同时,不要重映射I2C1的功能到PB8/PB9。问题找到了,就是这个原因啊,天杀的ST,映射功能只能到PB8 PB9端口上,不能映射到任意商品上,可我的PB8 PB9端口被SDIO功能占用了。I2C2端口也被USART3功能占用了。问题是找到了,可最后结果只能模拟总线来实现了。调试结论:1. ST的芯片不会有问题。ST官方的库函数是非常好用的,用的很爽的!2. 当使用大容量芯片具有FSMC功能与I2C1功能同时使用时, 需要把I2C1映射到PB9 PB9端口上去。3. 如果要同时使用FSMC I2C1 SDIO功能时,I2C1只能用模拟总线方式实现。因为SDIO功能会占用PB8 PB9端口。以下是I2C模拟总线程序源代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值