打印
[开发工具]

请问STM32进行IAP的方式!

[复制链接]
1585|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
请问STM32进行IAP的方式!

使用特权

评论回复
沙发
goodluck09876|  楼主 | 2019-12-10 12:56 | 只看该作者
按照理论,是可以使用串口、SPI、CAN、USB来进行IAP的对吗?

使用特权

评论回复
板凳
goodluck09876|  楼主 | 2019-12-10 12:56 | 只看该作者
那可以不可以通过IIC来进行IAP呢?

使用特权

评论回复
地板
goodluck09876|  楼主 | 2019-12-10 12:56 | 只看该作者
如果可以的话。甚至可以通过任何两个IO口来模拟IIC,来进行IAP了!写一个bootloader来进行了!这样理解的对吗?

使用特权

评论回复
5
goodluck09876|  楼主 | 2019-12-10 12:57 | 只看该作者
在STM32L011上通过I2C接口实现IAP

使用特权

评论回复
6
goodluck09876|  楼主 | 2019-12-10 12:57 | 只看该作者
前言
客户计划使用STM32L011xx开发一款光模块产品,需要MCU支持I2C接口下载代码。但STM32L011xx内部Bootloader没有支持I2C接口,所以需要我们使用IAP的方式来帮助客户实现该功能。

问题分析
IAP代码大小
STM32L011xx只有8K-16K 字节的Flash容量,所以这个IAP的代码不能过大,否则就会将用户的应用程序空间压缩的过小。经过和客户沟通,最大IAP代码可以占用的空间为2K字节。


开发模式选用
因为代码空间的限制(最多2K字节),所以我们只能使用直接写寄存器的开发方式。

使用特权

评论回复
7
goodluck09876|  楼主 | 2019-12-10 12:57 | 只看该作者

使用特权

评论回复
8
goodluck09876|  楼主 | 2019-12-10 12:58 | 只看该作者
代码结构
基本流程参考了我们的Bootloader by UART的结构。在上电的时候检查外部使能管脚的状态,如果是有效电平的话就进入到Bootloader模式,开启Bootloader程序的运行。在Bootloader程序中进行Flash内容的改写。最后,进入到烧写好的用户代码中运行。

使用特权

评论回复
9
goodluck09876|  楼主 | 2019-12-10 12:58 | 只看该作者
注意事项
在使用寄存器开发中,需要注意几个地方。
1/在地址匹配中断中需要检查DIR的值以判断当前的状态是发送还是接收;
2/主要的任务是下载Code到Flash中,所以,I2C主要做的就是接收一个完整的数据包,这里以主机发送STOP事件为接收完成标志。
3/I2C的接收缓冲开的越大越好,但是由于代码的限制,以最小的数据量为准。
4/STM32L011xx系列的Flash最小单元都是相等的(128Byte),所以在擦写的时候可以直接一个页一个页的写,降低了IAP代码的大小。 总结: 此IAP程序架构可以在整个STM32L011系列产品中直接应用,节省了客户下载应用代码的程序开发时间。占用的代码空间小于2K字节。

使用特权

评论回复
10
goodluck09876|  楼主 | 2019-12-10 12:59 | 只看该作者
在STM32L011上通过I2C接口实现IAP

在STM32L011上通过I2C接口实现IAP.pdf

208.58 KB

使用特权

评论回复
11
goodluck09876|  楼主 | 2019-12-10 13:00 | 只看该作者
例程源码!

IAP_Main.zip

17.89 MB

使用特权

评论回复
12
goodluck09876|  楼主 | 2019-12-10 13:01 | 只看该作者
原理介绍!

AN3078 IAP by I2C application note Rev1.pdf

695.58 KB

使用特权

评论回复
13
goodluck09876|  楼主 | 2019-12-10 13:01 | 只看该作者
1/文件说明
该文件包含三个工程:
IAP_MAIN :实现IAP的程序,实际的BootLoader
GPIOTEST_APP:简单的实现一个GPIO的翻转程序,该工程的代码已经设置起始地址为0x08000800,生成的Bin文件就是需要被下载到目标MCU的应用程序。
Host_Side_Test:这个是使用了一个STM32F401Discovery板子来模拟了一个I2C的主机,使用I2C接口(还有两个GPIO:PB0+PB1)来实现将片内的代码下载到目标MCU中的目的。

2/如何使用
IAP_MAIN 中的代码支持通过I2C接口来改写内部的Flash,其中目前的应用地址为0x08000800,IAP代码自身占用空间范围:0x0800000---0x080007ff,一共2KByte(实际为2016字节,不到2K)。此工程的代码需要先下载到MCU中。

GPIOTEST_APP中的代码直接生成Bin文件,通过ST-LinkUtility下载到STM32F401的0x08010000地址中。

将Host_Side_Test工程的代码下载到STM32F401的0x08000000地址中。

连接目标板子(Nucleo-L011-32)和STM32F401-Discovery 按照如下方式。

STM32F401-Discovery                 Nucleo-L011-32

PB0     --------------------------    NRST
PB1     --------------------------    PA0
PB6(SCL)--------------------------    PB6
PB9(SDA)--------------------------    PB7
GND     --------------------------    GND
3.3V    --------------------------    3.3v

给Nucleo-L011-32供电。这时就开启了I2C下载程序,之后,能够看到LD3每隔一秒闪烁一次。
通过STM32F401-Discovery的黑色(B2 RESET)按键,可以重复下载APP程序到另外一块目标板子(前提是已经固化好IAP代码)。

3/注意事项
目标代码必须是0x200的整数倍,0x08000800,0x08000400,0x08000200均是有效的地址,可根据实际的应用去改写。
下载的代码的地址,必须是0x80的整数倍(因为L011的页大小是128字节,只能整页地址才能擦除改写)。
编程代码中使用的代码大小,是在生成目标代码之后通过软件工具修改的,以后还需要根据你自己的代码大小做修改。

使用特权

评论回复
14
goodluck09876|  楼主 | 2019-12-10 13:01 | 只看该作者
看来必须使用的是 硬件 IIC了!

使用特权

评论回复
15
goodluck09876|  楼主 | 2019-12-10 13:02 | 只看该作者
TEST!

GPIOTEST_APP.zip

9.21 MB

使用特权

评论回复
16
goodluck09876|  楼主 | 2019-12-10 13:05 | 只看该作者
TEST!

Host_Side_Test.zip

8.49 MB

使用特权

评论回复
17
goodluck09876|  楼主 | 2019-12-10 13:05 | 只看该作者
TEST!

IAP_MAIN.zip

634.17 KB

使用特权

评论回复
18
goodluck09876|  楼主 | 2019-12-10 13:06 | 只看该作者
感觉,如果可以的话,还是最好使用模拟IIC来进行传输,那样的方式是最灵活了!简直就是黑科技了!

使用特权

评论回复
19
goodluck09876|  楼主 | 2019-12-10 13:07 | 只看该作者

使用特权

评论回复
20
goodluck09876|  楼主 | 2019-12-10 13:08 | 只看该作者
找到了一篇**!不过这个没积分,下载不下来!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

5843

帖子

22

粉丝