[应用相关] 编写IAP升级遇到的问题总结

[复制链接]
1705|14
 楼主| Listate 发表于 2016-11-15 22:31 | 显示全部楼层 |阅读模式
一,串口通信问题
1,串口通信两端的TTL电平要一致,看选用的芯片,要么都是3.3V要么都是5V。。当两端电平不一致时通常是收不到数据的。。当检测程序等都没有问题但是依然收不到数据时,考虑检测一下两端的电平是否一致。。可用示波器查看收发数据时的电平

2,在写IAP是使用的官方的库函数,结果串口一直收不到正确的数据。不管我发什么,收到的都是0x58或者0xF6,而且我发5个字节只能收到2个。。确定自己的程序逻辑没问题,然后怀疑是使用的库函数有问题。使用beyond compare挨着对照了一下以前写过的正确的程序。。发现系统初始化时外部晶振没有改。。在SystemInit();时就是为了/* 配置系统时钟为168M 使用外部8M晶体+PLL*/ 在函数内有一个宏定义#define PLL_M      25.。。。库函数默认的是25但是我们必须要使用8M的晶振。。所以要把25改成8.。。。。。。改完测试通过。。。。。
二,FLASH问题
1,flash的擦除
实际上是把flash的内容全部写1(擦除完再读的话读出来的全是0XFF),flash的编程要按字(32位)或半字(16位)编程,当接收的数据是奇数位是要补上0,凑够半字来编程。
2,写进flash跟读出来的不一样
注意编程flash时变量的存储接收等要用unsigned类型的。存储接收的变量类型要一致。以免造成越界问题,导致看到的数不一致

3,flash做存储用时
当时写了个程序,用flash来存数据,然后再读出来,遇到的问题是设备不断电时可以完整的读出来,设备断电后读不出了。要读多少个数我是把个数也存储在flash中的。最终发现问题是程序中一个标志位的操作有问题,每次断电后再上电会自动把这个个数写为0,导致每次都读不出来数


三,数组越界问题
1,嵌入式程序通常要求少占内存,通常变量能定义8位不定义16位。。一定要注意变量的最大值。(细心一点)。。在越界问题上,吃亏了好几次了。。。。
eg:①,我定义了一个int16_t的变量来接收flash中的一个变量值0xABCD。。结果很显然越界了。。换成uint16_t即可
②,定义了一个串口接收数据计数器uint16_t 的变量,要接收60k的APP程序,自认为足够用了,但是串口发送60K大小的文件发送的字节数大于了65535,,,又耽误了好久时间。。。
谨记:要细心
feiqi1 发表于 2016-11-15 22:34 | 显示全部楼层
跳转时中断问题还是一个比较棘手的问题。
androidbus 发表于 2016-11-15 22:40 | 显示全部楼层
在问题2的时候我也犯了个错误了。
androidbus 发表于 2016-11-15 22:42 | 显示全部楼层
我把另一个程序的库文件都拷过来了替换了原来的库文件,结果直接进不了中断了。
litengg 发表于 2016-11-15 22:44 | 显示全部楼层
有中断程序就死了呀
qiangweii 发表于 2016-11-15 22:49 | 显示全部楼层
关于IAP程序与APP程序keil中的设置
Stm32的flash都是从0x8000000开始的,结束地址看片子的flash大小
Stm32的sram都是从0x2000000开始的,结束地址看片子的sram大小
shashaa 发表于 2016-11-15 22:50 | 显示全部楼层
IAP程序基本默认就行,跟普通程序一样的吧
bbapple 发表于 2016-11-15 22:56 | 显示全部楼层
其实进不了中断首先想到的是中断向量表的问题吧
 楼主| Listate 发表于 2016-11-15 22:57 | 显示全部楼层
feiqi1 发表于 2016-11-15 22:34
跳转时中断问题还是一个比较棘手的问题。

是的,我也这么觉得。
 楼主| Listate 发表于 2016-11-15 22:58 | 显示全部楼层
androidbus 发表于 2016-11-15 22:42
我把另一个程序的库文件都拷过来了替换了原来的库文件,结果直接进不了中断了。 ...

我不是在main函数中改的,我是直接改的库函数中的偏移量,然后就把这个问题给忘了,导致找了半天终于意识到是中断向量表出了问题。
 楼主| Listate 发表于 2016-11-15 22:58 | 显示全部楼层
litengg 发表于 2016-11-15 22:44
有中断程序就死了呀。

这个容易被忽视。。
 楼主| Listate 发表于 2016-11-15 22:59 | 显示全部楼层
shashaa 发表于 2016-11-15 22:50
IAP程序基本默认就行,跟普通程序一样的吧

设置的起始地址要与程序中设置的中断向量表的偏移量对应起来就行
handleMessage 发表于 2016-11-15 23:06 | 显示全部楼层
升级的时候要留了一些余量,方便Bootloader以后的升级修改。
gyh974 发表于 2016-11-16 08:56 | 显示全部楼层
740071911 发表于 2016-11-16 12:56 | 显示全部楼层
这总结没什么实用价值,空中楼阁的样子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

161

主题

1233

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部