社区首页
技术讨论创新帖
全部新帖
资料区
社区活动
联系管理员
★ 社区积分制度
★ 新手必读
★ 申请版主★
请
登录
后使用快捷导航
没有帐号?
注册
首页
|
电子技术
|
嵌入式
模拟电子
单片机
电源管理
传感器
半导体
电子应用
|
工业控制
物联网
汽车电子
网络通信
医疗电子
手机便携
测试测量
安防电子
家用电子
机器人
新能源
电子头条
|
社区
|
论坛
测评
博客
大学堂
|
下载
|
下载中心
电路图
精品文集
电路图
|
参考设计
|
Datasheet
|
活动
|
直播
datasheet
datasheet
文章
搜索
登录
注册
中文
En
论坛
切换旧版
电子工程世界-论坛
»
论坛
›
电子技术交流
›
单片机
›
stm32/stm8
›
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南-- ...
返回列表
发新帖
回复
阅
3665
|
回
0
正点原子
当前离线
纯净的硅(初级)
最后登录
2018-10-14
在线时间
45 小时
威望
761分
芯积分
0分
(兑换)
E金币
0枚
(兑换)
(兑换)
好友
4
正点原子
109
帖子
0
TA的资源
纯净的硅(初级)
+ 好友
私信
楼主
发表于2013-4-19 23:04
只看该作者
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第五十三章 串口IAP实验
[复制链接]
第五十三章
串口
IAP
实验
IAP
,即在应用编程。很多单片机都支持这个功能,
STM32
也不例外。在之前的
FLASH
模拟
EEPROM
实验里面,我们学习了
STM32
的
FLASH
自编程,本章我们将结合
FLASH
自编程的知识,通过
STM32
的串口实现一个简单的
IAP
功能本章分为如下几个部:
53.1 IAP简介
53.2 硬件设计
53.3 软件设计
53.4 下载验证
53.1 IAP
简介
IAP(In Application Programming)即在应用编程,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。 通常实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:
1)检查是否需要对第二部分代码进行更新
2)如果不需要更新则转到4)
3)执行更新操作
4)跳转到第二部分代码执行
第一部分代码必须通过其它手段,如JTAG或ISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一起烧入,以后需要程序更新是再通过第一部分IAP代码更新。
我们将第一个项目代码称之为Bootloader程序,第二个项目代码称之为APP程序,他们存放在STM32 FLASH的不同地址范围,一般从最低地址区开始存放Bootloader,紧跟其后的就是APP程序(注意,如果FLASH容量足够,是可以设计很多APP程序的,本章我们只讨论一个APP程序的情况)。这样我们就是要实现2个程序:Bootloader和APP。
STM32的APP程序不仅可以放到FLASH里面运行,也可以放到SRAM里面运行,本章,我们将制作两个APP,一个用于FLASH运行,一个用于SRAM运行。
我们先来看看STM32正常的程序运行流程,如图53.1.1所示:
图
53.1.1 STM32
正常运行流程图
STM32
的内部闪存(
FLASH
)地址起始于
0x08000000
,一般情况下,程序文件就从此地址开始写入。此外
STM32
是基于
Cortex-M3
内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地址是
0x08000004
,当中断来临,
STM32
的内部硬件机制亦会自动将
PC
指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。
在图
53.1.1
中,
STM32
在复位后,先从
0X08000004
地址取出复位中断向量的地址,并跳转到复位中断服务程序,如图标号①所示;在复位中断服务程序执行完之后,会跳转到我们的
main
函数,如图标号②所示;而我们的
main
函数一般都是一个死循环,在
main
函数执行过程中,如果收到中断请求(发生重中断),此时
STM32
强制将
PC
指针指回中断向量表处,如图标号③所示;然后,根据中断源进入相应的中断服务程序,如图标号④所示;在执行完中断服务程序以后,程序再次返回
main
函数执行,如图标号⑤所示。
当加入
IAP
程序之后,程序运行流程如图
53.1.2
所示:
图
53.1.2
加入
IAP
之后程序运行流程图
在图
53.1.2
所示流程中,
STM32
复位后,还是从
0X08000004
地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到
IAP
的
main
函数,如图标号①所示,此部分同图
53.1.1
一样;在执行完
IAP
以后(即将新的
APP
代码写入
STM32
的
FLASH
,灰底部分。新程序的复位中断向量起始地址为
0X08000004+N+M
),跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的
main
函数,如图标号②和③所示,同样
main
函数为一个死循环,并且注意到此时
STM32
的
FLASH
,在不同位置上,共有两个中断向量表。
在
main
函数执行过程中,如果
CPU
得到一个中断请求,
PC
指针仍强制跳转到地址
0X08000004
中断向量表处,而不是新程序的中断向量表,如图标号④所示;程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示;在执行完中断服务程序后,程序返回
main
函数继续运行,如图标号⑥所示。
通过以上两个过程的分析,我们知道
IAP
程序必须满足两个要求:
1) 新程序必须在IAP程序之后的某个偏移量为x的地址开始;
2) 必须将新程序的中断向量表相应的移动,移动的偏移量为x;
本章,我们有2个APP程序,一个为FLASH的APP,另外一个位SRAM的APP,图53.1.2虽然是针对FLASH APP来说的,但是在SRAM里面运行的过程和FLASH基本一致,只是需要设置向量表的地址为SRAM的地址。
1.APP
程序起始地址设置方法
随便打开一个之前的实例工程,点击Options for TargetàTarget选项卡,如图53.1.3所示:
图
53.1.3 FLASH APP Target
选项卡设置
默认的条件下,图中
IROM1
的起始地址(
Start
)一般为
0X08000000
,大小(
Size
)为
0X80000
,即从
0X08000000
开始的
512K
空间为我们的程序存储区。而图中,我们设置起始地址(
Start
)为
0X08005000
,即偏移量为
0X5000
(
20K
字节),因而,留给
APP
用的
FLASH
空间(
Size
)只有
0X80000-0X5000=0X7B000
(
480K
字节)大小了。设置好
Start
和
Szie
,就完成
APP
程序的起始地址设置。
这里的
20K
字节,需要大家根据
Bootloader
程序大小进行选择,比如我们本章的
Bootloader
程序为
18K
左右,理论上我们只需要确保
APP
起始地址在
Bootloader
之后,并且偏移量为
0X200
的倍数即可(相关知识,请参考:
http://www.openedv.com/posts/list/392.htm
)。这里我们选择
20K
(
0X5000
)字节,留了一些余量,方便
Bootloader
以后的升级修改。
这是针对
FLASH APP
的起始地址设置,如果是
SRAM APP
,那么起始地址设置如图
53.1.4
所示:
图
53.1.4 SRAM APP Target
选项卡设置
这里我们将
IROM1
的起始地址(
Start
)定义为:
0X20001000
,大小为
0XA000
(
40K
字节),即从地址
0X20000000
偏移
0X1000
开始,存放
APP
代码。因为整个
STM32F103ZET6
的
SRAM
大小为
64K
字节,所以
IRAM1
(
SRAM
)的起始地址变为
0X2000B000
,大小只有
0X5000
(
20K
字节)。这样,整个
STM32F103ZET6
的
SRAM
分配情况为:最开始的
4K
给
Bootloader
程序使用,随后的
40K
存放
APP
程序,最后
20K
,用作
APP
程序的内存。这个分配关系大家可以根据自己的实际情况修改,不一定和我们这里的设置一模一样,不过也需要注意,保证偏移量为
0X200
的倍数(我们这里为
0X1000
)。
2.
中断向量表的偏移量设置方法
此步,我们通过修改
sys.c
里面的
MYRCC_DeInit
函数实现,该函数代码如下:
void MYRCC_DeInit(void)
{
RCC->APB1RSTR = 0x00000000;//
复位结束
RCC->APB2RSTR = 0x00000000;
RCC->AHBENR = 0x00000014; //
睡眠模式闪存和
SRAM
时钟使能
.
其他关闭
.
RCC->APB2ENR = 0x00000000; //
外设时钟关闭
.
RCC->APB1ENR = 0x00000000;
RCC->CR |= 0x00000001; //
使能内部高速时钟
HSION
RCC->CFGR &= 0xF8FF0000;
//复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]
RCC->CR &= 0xFEF6FFFF; //
复位
HSEON,CSSON,PLLON
RCC->CR &= 0xFFFBFFFF; //
复位
HSEBYP
RCC->CFGR &= 0xFF80FFFF;//
复位
PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE
RCC->CIR = 0x00000000; //
关闭所有中断
//
配置向量表
#ifdef VECT_TAB_RAM
MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);
#endif
}
该函数我们只需要修改最后两行代码,默认的情况下
VECT_TAB_RAM
是没有定义的,所以执行:
MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);
这是正常情况的向量表偏移量(为
0
),本章,我们修改这句代码为:
MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH,0X5000);
偏移量为
0X5000
。其中
NVIC_VectTab_RAM
和
NVIC_VectTab_FLASH
是在
stm32f10x_nvic.h
里面定义的两个宏定义,代表
RAM
和
FLASH
的起始地址。
以上是
FLASH APP
的情况,当使用
SRAM APP
的时候,我们需要定义
VECT_TAB_RAM
,点击
Options for Target
à
C/C++
选项卡,在
Preprocessor Symblols
栏定义:
VECT_TAB_RAM
,如图
54.1.5
所示:
图
53.1.5 SRAM APP C/C++
选项卡设置
通过这个设置,我们定义
VECT_TAB_RAM
,故在执行
MYRCC_DeInit
函数的时候,会执行
MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
这里的
0X0
是默认的设置,本章我们修改此句代码为:
MY_NVIC_SetVectorTable(NVIC_VectTab_SRAM,0X1000);
即设置偏移量为
0X1000
。
这样,我们就完成了中断向量表偏移量的设置。
通过以上两个步骤的设置,我们就可以生成APP程序了,只要APP程序的FLASH和SRAM大小不超过我们的设置即可。不过MDK默认生成的文件是.hex文件,并不方便我们用作IAP更新,我们希望生成的文件是.bin文件,这样可以方便进行IAP升级(至于为什么,请大家自行百度HEX和BIN文件的区别!)。这里我们通过MDK自带的格式转换工具fromelf.exe,来实现.axf文件到.bin文件的转换。该工具在MDK的安装目录\ARM\BIN40文件夹里面。
fromelf.exe转换工具的语法格式为:fromelf [options] input_file。其中options有很多选项可以设置,详细使用请参考光盘《mdk如何生成bin文件.pdf》.
本章,我们通过在MDK点击Options for TargetàUser选项卡,在Run User Programs After Build/Rebuild 栏,勾选Run#1和DOS16,并写入:D:\Keil3.80a\ARM\BIN40\fromelf.exe --bin -o ..\OBJ\TEST.bin ..\OBJ\TEST.axf ,如图53.1.6所示:
通过这一步设置,我们就可以在
MDK
编译成功之后,调用
fromelf.exe
(注意,我的
MDK
是安装在
D:\Keil3.80A
文件夹下,如果你是安装在其他目录,请根据你自己的目录修改
fromelf.exe
的路径),根据当前工程的
TEST.axf
,生成一个
TEST.bin
的文件。并存放在
axf
文件相同的目录下,即工程的
OBJ
文件夹里面。在得到
.bin
文件之后,我们只需要将这个
bin
文件传送给单片机,即可执行
IAP
升级。
最后再来看看
APP
程序的生成步骤:
1)
设置APP
程序的起始地址和存储空间大小
对于在FLASH里面运行的APP程序,我们只需要设置APP程序的起始地址,和存储空间大小即可。而对于在SRAM里面运行的APP程序,我们还需要设置SRAM的起始地址和大小。无论哪种APP程序,都需要确保APP程序的大小和所占SRAM大小不超过我们的设置范围。
2)
设置中断向量表偏移量
此步,通过在MYRCC_DeInit函数里面调用MY_NVIC_SetVectorTable函数,实现对中断向量表偏移量的设置。这个偏移量的大小,其实就等于程序起始地址相对于0X08000000或者0X20000000的偏移。对于SRAM APP程序,我们还需要在C/C++选项卡定义VECT_TAB_RAM,以申明中断向量表是在SRAM里面。
3)
设置编译后运行fromelf.exe
,生成.bin
文件.
通过在User选项卡,设置编译后调用fromelf.exe,根据.axf文件生成.bin文件,用于IAP更新。
以上3个步骤,我们就可以得到一个.bin的APP程序,通过Bootlader程序即可实现更新。
53.2
硬件设计
本章实验(Bootloader部分)功能简介:开机的时候先显示提示信息,然后等待串口输入接收APP程序(无校验,一次性接收),在串口接收到APP程序之后,即可执行IAP。如果是SRAM APP,通过按下KEY0即可执行这个收到的SRAM APP程序。如果是FLASH APP,则需要先按下WK_UP按键,将串口接收到的APP程序存放到STM32的FLASH,之后再按KEY2既可以执行这个FLASH APP程序。通过KEY1按键,可以手动清除串口接收到的APP程序。DS0用于指示程序运行状态。
本实验用到的资源如下:
1) 指示灯DS0
2) 四个按键(KEY0/KEY1/KEY2/WK_UP)
3) 串口
4) TFTLCD模块
这些用到的硬件,我们在之前都已经介绍过,这里就不再介绍了。
53.3
软件设计
本章,我们总共需要3个程序:1,Bootloader;2,FLASH APP;3)SRAM APP;其中,我们选择之前做过的RTC实验(在第二十章介绍)来做为FLASH APP程序(起始地址为0X08005000),选择触摸屏实验(在第三十一章介绍)来做SRAM APP程序(起始地址为0X20001000)。Bootloader则是通过TFTLCD显示实验(在第十八章介绍)修改得来。本章,关于SRAM APP和FLASH APP的生成比较简单,我们就不细说,请大家结合光盘源码,以及53.1节的介绍,自行理解。本章软件设计仅针对Bootloader程序。
复制第十八章的工程(即实验13),作为本章的工程模版(命名为:IAP Bootloader V1.0),并复制第三十九章实验(FLASH模拟EEPROM实验)的STMFLASH文件夹到本工程的HARDWARE文件夹下,打开本实验工程,并将STMFLASH文件夹内的stmflash.c加入到HARDWARE组下,同时将STMFLASH加入头文件包含路径。
在HARDWARE文件夹所在的文件夹下新建一个IAP的文件夹,并在该文件夹下新建iap.c和iap.h两个文件。然后在工程里面新建一个IAP的组,将iap.c加入到该组下面。最后,将IAP文件夹加入头文件包含路径。
打开iap.c,输入如下代码:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "stmflash.h"
#include "iap.h"
iapfun jump2app;
u16 iapbuf[1024];
//appxaddr:
应用程序的起始地址
//appbuf:
应用程序
CODE.
//appsize:
应用程序大小
(
字节
).
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
u16 t;
u16 i=0;
u16 temp;
u32 fwaddr=appxaddr;//
当前写入的地址
u8 *dfu=appbuf;
for(t=0;t
{
temp=(u16)dfu[1]<<8;
temp+=(u16)dfu[0];
dfu+=2;//
偏移
2
个字节
iapbuf[i++]=temp;
if(i==1024)
{
i=0;
STMFLASH_Write(fwaddr,iapbuf,1024);
fwaddr+=2048;//
偏移
2048 16=2*8.
所以要乘以
2.
}
}
if(i)STMFLASH_Write(fwaddr,iapbuf,i);//
将最后的一些内容字节写进去
.
}
//
跳转到应用程序段
//appxaddr:
用户代码起始地址
.
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //
检查栈顶地址是否合法
.
{
jump2app=(iapfun)*(vu32*)(appxaddr+4);
//用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr);
//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //
跳转到
APP.
}
}
该文件总共只有2个函数,其中,iap_write_appbin函数用于将存放在串口接收buf里面的APP程序写入到FLASH。iap_load_app函数,则用于跳转到APP程序运行,其参数appxaddr为APP程序的起始地址,程序先判断栈顶地址是否合法,在得到合法的栈顶地址后,通过MSR_MSP函数(该函数在sys.c文件)设置栈顶地址,最后通过一个虚拟的函数(jump2app)跳转到APP程序执行代码,实现IAPàAPP的跳转。
保存iap.c,打开iap.h输入如下代码:
#ifndef __IAP_H__
#define __IAP_H__
#include "sys.h"
typedef void (*iapfun)(void); //
定义一个函数类型的参数
.
#define FLASH_APP1_ADDR 0x08005000
//
第一个应用程序起始地址
(
存放在
FLASH)
//
保留
0X08000000~0X08004FFF
的空间为
Bootloader
使用
void iap_load_app(u32 appxaddr); //
跳转到
APP
程序执行
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 applen); //
在指定地址开始
,
写入
bin
#endif
这部分代码比较简单,保存iap.h。本章,我们是通过串口接收APP程序的,我们将usart.c和usart.h做了稍微修改,在usart.h中,我们定义USART_REC_LEN为55K字节,也就是串口最大一次可以接收55K字节的数据,这也是本Bootloader程序所能接收的最大APP程序大小。然后新增一个USART_RX_CNT的变量,用于记录接收到的文件大小,而USART_RX_STA不再使用。在usart.c里面,我们修改USART1_IRQHandler部分代码如下:
//
串口
1
中断服务程序
//
注意
,
读取
USARTx->SR
能避免莫名其妙的错误
u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));
//
接收缓冲
,
最大
USART_REC_LEN
个字节
,
起始地址为
0X20001000.
//
接收状态
//bit15
,
接收完成标志
//bit14
,
接收到
0x0d
//bit13~0
,
接收到的有效字节数目
u16 USART_RX_STA=0; //
接收状态标记
u16 USART_RX_CNT=0; //
接收的字节数
void USART1_IRQHandler(void)
{
u8 res;
#ifdef OS_CRITICAL_METHOD
//
如果
OS_CRITICAL_METHOD
定义了
,
说明使用
ucosII
了
.
OSIntEnter();
#endif
if(USART1->SR&(1<<5))//
接收到数据
{
res=USART1->DR;
if(USART_RX_CNT
{
USART_RX_BUF[USART_RX_CNT]=res;
USART_RX_CNT++;
}
}
#ifdef OS_CRITICAL_METHOD
//
如果
OS_CRITICAL_METHOD
定义了
,
说明使用
ucosII
了
.
OSIntExit();
#endif
}
这里,我们指定USART_RX_BUF的地址是从0X20001000开始,该地址也就是SRAM APP程序的起始地址!然后在USART1_IRQHandler函数里面,将串口发送过来的数据,全部接收到USART_RX_BUF,并通过USART_RX_CNT计数。代码比较简单,我们就不多说了。
改完usart.c和usart.h之后,我们在test.c修改main函数如下:
int main(void)
{
u8 t;
u8 key;
u16 oldcount=0; //
老的串口接收数据值
u16 applenth=0; //
接收到的
app
代码长度
u8 clearflag=0;
Stm32_Clock_Init(9); //
系统时钟设置
uart_init(72,256000); //
串口初始化为
256000
delay_init(72); //
延时初始化
LED_Init(); //
初始化与
LED
连接的硬件接口
LCD_Init(); //
初始化
LCD
KEY_Init(); //
按键初始化
POINT_COLOR=RED;//
设置字体为红色
LCD_ShowString(60,50,200,16,16,"Warship STM32");
LCD_ShowString(60,70,200,16,16,"IAP TEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"2012/9/24");
LCD_ShowString(60,130,200,16,16,"WK_UP:Copy APP2FLASH");
LCD_ShowString(60,150,200,16,16,"KEY1:Erase SRAM APP");
LCD_ShowString(60,170,200,16,16,"KEY0:Run SRAM APP");
LCD_ShowString(60,190,200,16,16,"KEY2:Run FLASH APP");
POINT_COLOR=BLUE;
//
显示提示信息
POINT_COLOR=BLUE;//
设置字体为蓝色
while(1)
{
if(USART_RX_CNT)
{
if(oldcount==USART_RX_CNT)
//新周期内,没有收到任何数据,认为本次数据接收完成.
{
applenth=USART_RX_CNT;
oldcount=0;
USART_RX_CNT=0;
printf("
用户程序接收完成
!\r\n");
printf("
代码长度
:%dBytes\r\n",applenth);
}else oldcount=USART_RX_CNT;
}
t++; delay_ms(10);
if(t==30)
{
LED0=!LED0; t=0;
if(clearflag)
{
clearflag--;
if(clearflag==0)LCD_Fill(60,210,240,210+16,WHITE);//
清除显示
}
}
key=KEY_Scan(0);
if(key==KEY_UP)
{
if(applenth)
{
printf("
开始更新固件
...\r\n");
LCD_ShowString(60,210,200,16,16,"Copying APP2FLASH...");
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)
//判断是否为0X08XXXXXX.
{
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,
applenth); //更新FLASH代码
LCD_ShowString(60,210,200,16,16,"Copy APP Successed!!");
printf("
固件更新完成
!\r\n");
}else
{
LCD_ShowString(60,210,200,16,16,"Illegal FLASH APP! ");
printf("
非
FLASH
应用程序
!\r\n");
}
}else
{
printf("
没有可以更新的固件
!\r\n");
LCD_ShowString(60,210,200,16,16,"No APP!");
}
clearflag=7;//
标志更新了显示
,
并且设置
7*300ms
后清除显示
}
if(key==KEY_DOWN)
{
if(applenth)
{
printf("
固件清除完成
!\r\n");
LCD_ShowString(60,210,200,16,16,"APP Erase Successed!");
applenth=0;
}else
{
printf("
没有可以清除的固件
!\r\n");
LCD_ShowString(60,210,200,16,16,"No APP!");
}
clearflag=7;//
标志更新了显示
,
并且设置
7*300ms
后清除显示
}
if(key==KEY_LEFT)
{
printf("
开始执行
FLASH
用户代码
!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)
//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//
执行
FLASH APP
代码
}else
{
printf("
非
FLASH
应用程序
,
无法执行
!\r\n");
LCD_ShowString(60,210,200,16,16,"Illegal FLASH APP!");
}
clearflag=7;//
标志更新了显示
,
并且设置
7*300ms
后清除显示
}
if(key==KEY_RIGHT)
{
printf("
开始执行
SRAM
用户代码
!!\r\n");
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x20000000)
//判断是否为0X20XXXXXX.
{
iap_load_app(0X20001000);//SRAM
地址
}else
{
printf("
非
SRAM
应用程序
,
无法执行
!\r\n");
LCD_ShowString(60,210,200,16,16,"Illegal SRAM APP!");
}
clearflag=7;//
标志更新了显示
,
并且设置
7*300ms
后清除显示
}
}
}
该段代码,实现了串口数据处理,以及IAP更新和跳转等各项操作。Bootloader程序就设计完成了,但是一般要求bootloader程序越小越好(给APP省空间嘛),所以,本章我们把一些不需要用到的.c文件全部去掉,最后得到工程截图如图53.3.1所示:
图
53.3.1 Bootloader
工程截图
从上图可以看出,虽然去掉了一些不用的.c文件,但是Bootloader大小还是有18K左右,比较大,主要原因是液晶驱动和printf占用了比较多的flash,如果大家想进一步删减,可以去掉LCD显示和printf等,不过我们在本章为了演示效果,所以保留了这些代码。
至此,本实验的软件设计部分结束。
FLASH APP和SRAM APP两部分代码,根据53.1节的介绍,大家自行修改都比较简单,我们这里就不介绍了,不过要提醒大家:FLASH APP的起始地址必须是0X08005000,而SRAM APP的起始地址必须是0X20001000。
53.4
下载验证
在代码编译成功之后,我们下载代码到ALIENTEK战舰STM32开发板上,得到,如图53.4.1所示:
图
53.4.1 IAP
程序界面
此时,我们可以通过串口,发送FLASH APP或者SRAM APP到战舰STM32开发板,如图53.4.2所示:
图
53.4.2
串口发送
APP
程序界面
先用串口调试助手的打开文件按钮(如图标号1所示),找到APP程序生成的.bin文件,然后设置波特率为256000(为了提高速度,Bootloader程序将波特率被设置为256000了),最后点击发送文件(图中标号3所示),将.bin文件发送给战舰STM32开发板。
在收到
APP
程序之后,我们就可以通过
KEY0/KEY2
运行这个
APP
程序了(如果是
FLASH APP
,则先需要通过
WK_UP
将其存入对应
FLASH
区域)。
《STM32开发指南》第五十三章 串口IAP实验.rar
(794.38 KB, 下载次数: 36)
2013-4-19 23:06 上传
点击文件名下载附件
实验48 串口IAP实验.rar
(369.29 KB, 下载次数: 33)
2013-4-19 23:06 上传
点击文件名下载附件
[
本帖最后由 正点原子 于 2013-4-19 23:06 编辑
]
STM32
,
STM32开发指南
,
IAP
,
串口
,
战舰
此帖出自
stm32/stm8论坛
点赞
关注
(0)
个人签名
我的淘宝:http://shop62103354.taobao.com
回复
分享
扫一扫,分享给好友
复制链接分享
链接复制成功,分享给好友
举报
提升卡
变色卡
千斤顶
返回列表
发新帖
回复
您需要登录后才可以回帖
登录
|
注册
发表回复
回帖后跳转到最后一页
活动
更多>>
Microchip 直播|多相降压电源控制技术的发展与探讨 报名中!
安世半导体智能工业应用探索站,闯关赢好礼!
PI 电源小课堂:集成式半桥驱动IC BridgeSwitch 2, 助力高效永磁同步电机逆变器的设计
Microchip喊你探索dsPIC33A 芯片,70份好礼等你赢!
【瓜分2500元红包】票选2024 DigiKey “感知万物,乐享生活”创意大赛人气作品TOP3!
DigiKey应用探索站重磅上线!潮流应用,硬核技术探秘,N多干货,一站get!
验证并选择心仪MOSFET,探寻选型奥秘!注册、体验双重好礼等你拿~
免费申请测评 | 泰坦触觉 TITAN Core开发套件
开源项目
更多>>
LM2594APDBCKGEVB:降压开关稳压器评估板
EVAL-ADuC7026QS,用于评估 ADuC7026 ARM7 MCU 微型转换器的快速入门开发系统
F405-Wing-PD
ADP130-1.2-EVALZ,基于 ADP130 的评估板、1.2V、350 mA 低 VIN、低静态电流、CMOS 线性稳压器
LT3970HMS-3.3 5V 降压转换器的典型应用
S12ZVMAEVB: S12ZVMA评估板
使用 Analog Devices 的 LTC1258CS8-5 的参考设计
用户界面 - 基于 CY8C24423 PSoC 的电阻式触摸屏控制器
使用 ROHM Semiconductor 的 BU4836 的参考设计
LT3976EMSE 1.2V 降压转换器的典型应用电路
随便看看
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第五十九章 UCOSII实验2-信...
[align=center][b][font=宋体]第五十九章[/font]UCOSII[font=宋体]实验[/font]2-[font=宋体]信号量和邮箱[/font][/b][/align][align=left][font=宋体]上一章,我们学习了如何使用[/font]UCOSII[font=宋体],学习了[/font]UCOSII[font=宋体]的任务调度,但是并 ...
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第五十八章 UCOSII实验1-任...
[align=center][color=rgb(0,0,0)][backcolor=rgb(255,255,255)][b][color=#000000]第五十八章UCOSII[/color]实验1-任务调度[/b][/align][align=left]前面我们所有的例程都是跑的裸机程序(裸奔),从本章开始,我们将分3个章节向大家介绍UCOSII(实时多任务 ...
“我只要你的壳”之TI-82计算器改造(1)
前阵子我在 拆解TI-82计算器尸体帖子中留了一个悬念,我买计算器尸体干啥?要逐步揭晓谜底了。这款计算器尸体我前后一共买了好几块,最初买已经是几年前的事情了,当时觉得TI-82的键盘手感还不错,有改造利用价值,于是就有一个DIY计算器的想法。因为我囤积 ...
【Luckfox Pico】开发环境搭建
《Linux内核深度解析》-- 中断控制器注册逻辑
步进电机驱动器 和H桥
求教,用opa656搭pin管的前置跨阻放大器的输出波形不对,后边用tl082放大的输出也不对
请问TI的这个例子是否出错呢?
一个关于LPC1343快速弹出flash disk的技术问题
西安交大电路(邱关源 第五版)全套课件
查找数据手册?
搜索
EEWorld Datasheet 技术支持
热门标签
源代码
单片机
放大器
TI
ST
电源
分立器件
传感器
测试测量
模拟
单相稳压器
伺服驱动器
视觉传感器
脉冲电容器
水冷电阻
stc12c5a60s2
BITswitcher
e络盟
AD590
pcs
相关文章
更多>>
苹果M4 Mac mini曝出USB-C接口问题!随机间歇性断开连接
1月17日消息,苹果M4 Mac mini自2024年底发布以来,收获了不少好评,然而近期一些用户在使用过程中发现,该设备的USB-C接口似乎存在连接性问题,给使用带来了不便。 有用户反映M4 Ma
消息称 SK 海力士有望 2 月启动业界最先进 1c nm 制程 DRAM 内存量产
1 月 17 日消息,韩媒 MT(IT之家注:全称 MoneyToday)当地时间今日报道称,SK 海力士近日已成功完成内存业界最先进 1c 纳米制程 DRAM 的批量产品认证,连续多个以 25 块
未经同意出售用户数据,通用汽车遭美国 FTC 处罚
1 月 17 日消息,当地时间周四,美国联邦贸易委员会(FTC)宣布通用汽车及其子公司 OnStar 因未经用户同意出售用户位置和驾驶行为数据,因此将对其进行处罚,包括在五年内禁止向消费者报告机构披
日本三井住友银行推出半导体设备抵押贷款,铠侠已率先获益
联想宣布收购Infinidat,扩充高端企业存储业务
台积电董事长:我们不是美积电 最先进制程不会搬到美国
曝台积电拒绝代工三星Exynos处理器:理由是怕泄密
SK 海力士被曝上半年削减 10% NAND 闪存产量
苹果加入UALink联盟 成员含AMD、英特尔、谷歌等公司
英特尔宣布将逐渐停产第 12 代 Alder Lake 移动处理器,覆盖酷睿、奔腾及赛扬
新帖速递
STM32和无源蜂鸣器播放声音的问题
车规级AECQ200介绍,混合铝电解电容器的选择
嵌入式教程_DSP技术_DSP实验箱操作教程:2-28 搭建轻量级WEB服务器实验
OPA847IDBVR运放器国产替代
AG32VF407测试UART
【得捷电子Follow Me第二期】第一章 收到货物的分享
请问这个红外接收头是什么型号?能用哪个型号代替?谢谢
出售全新未拆封ZYNQ 7Z020 FPGA核心板
用在锂电池供电的水表设置上的LORA模块,当有100块水表集中安装在一个楼道内时,节能
请问一下,当某个端口被设置为 RX0后,这个端口的输入输出方向还有必要设置吗
今年怎么这么难,比疫情时还难,三十了面临失业好迷茫
请教稳压管测试问题
【小华HC32F448测评】关于小华半导体的UART中断发送和PRINTF构造和重定向
【BIGTREETECH PI开发板】 HDMI输出测试
【BIGTREETECH PI开发板】+08.音频测试(zmj)
安世半导体智能工业应用探索站,闯关赢好礼!
点击页面内“开始探索”按钮,填写并提交表单;
请根据序号依次完成3个安世半导体智能工业应用的探索,并根据给出的资料完成共计9题(每个应用3题),答对5题以上的玩家即可获得抽奖资格;
每人仅有一次参与答题的机会,请慎重作答,活动结束后,我们将抽取30位玩家赠送礼品。
查看 »
Microchip 直播|多相降压电源控制技术的发展与探讨 报名中!
直播主题:多相降压电源控制技术的发展与探讨
直播时间:2025年2月25日(星期二)上午10:30-11:30
快来报名!
查看 »
回帖赢好礼 | 关于无线技术的那些事儿
【活动时间】即日起—2025年1月31日
【活动好礼】50元京东卡
查看 »
答题赢好礼,PI电源小课堂第3期来啦!
本期内容:集成式半桥驱动IC BridgeSwitch 2, 助力高效永磁同步电机逆变器的设计
活动时间:即日起-2月28日
看视频答题即可赢取京东卡!
查看 »
Microchip喊你探索 dsPIC33A 芯片,70份好礼等你赢!
活动时间:即日起-1月26日
活动奖励:随身Wi-Fi、家用多功能电烤箱、20000mAh充电宝、50元京东卡
查看 »
DigiKey应用探索站重磅上线!潮流应用,硬核技术探秘,N多干货,一站get!
当月好物、热门技术资源、潮流应用技术、特色活动、DigiKey在线实用工具,干货多多~
查看 »
本周精选下载推荐:电源管理基础Dummies
本周小编给大家带来一本超简单、超干货的电子书——《电源管理基础Dummies》!内容深入浅出,排版舒服简洁,分分钟能get到电源管理最核心的知识内容。
查看 »
下载资料赢好礼!看Vicor模块化电源解决方案如何推动创新
活动时间:即日起-2024年12月31日
如何参与:点击活动页内您想了解的模块,找到资料下载即可参与抽奖,活动结束后统一发奖!
查看 »
验证并选择心仪MOSFET,探寻选型奥秘!注册、体验双重好礼等你拿~
MOSFET 选型有点难
选N沟道MOSFET?还是选P沟道MOSFET?
封装如何选:不同封装尺寸有不同的热阻和耗散功率。
瞬态散热更严苛,热设计需要如何处理?
用东芝在线电路仿真器,一键解锁MOSFET选型的秘密!
查看 »
关闭
站长推荐
1
/9
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
电信业务审批[2006]字第258号函
京公网安备 11010802033920号
Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复
返回顶部
返回列表
论坛首页
版块列表
专业技术中心
TI技术论坛
ST传感器与低功耗无线技术论坛
ADI参考电路
DigiKey得捷技术专区
ADI · 世健工业技术
电子技术交流
嵌入式系统
单片机
国产芯片交流
电机驱动控制
FPGA/CPLD
模拟电子
电源技术
PCB技术
RF/无线
传感器
综合技术交流
下载中心专版
大学堂专版
测评中心专版
创意与实践
电子竞赛
DIY/开源硬件专区
淘e淘
创意市集
行业应用
汽车电子
移动便携
医疗电子
工控电子
安防电子
休息一下
聊聊、笑笑、闹闹
工作这点儿事
为我们提意见&公告
EEWorld颁奖专区
信息发布
最新帖子
最新帖子
最新回复
精华
消灭零回复
测评中心
活动中心
积分兑换
E金币兑换
芯积分
厂商专区
TI技术论坛
ST传感器与低功耗无线技术论坛