STM32--简单的IAP操作

发布者:知识智慧最新更新时间:2016-09-26 来源: eefocus关键字:STM32  IAP操作 手机看文章 扫描二维码
随时随地手机看文章
STM32支持在应用中编程,也就是所谓的IAP,这对产品的在线升级带来了很大方便。

在线升级的原理简介如下:

在单片机的FLASH中有两段代码,一段是IAP代码,另一段就是用户的应用程序即APP代码,IAP代码放在单片机复位时的起始地址,而APP代码则放在IAP后面的地址,上电时CPU首先执行IAP代码,再通过IAP代码跳转到APP代码开始执行。

 

在IAP代码执行期间,通过检测某一个事件(如IO电平)来判断是否对APP代码进行更新,如果该事件无效,则不更新,直接跳转到APP代码执行;如果该事件有效,则更新APP代码,而更新的文件则从外部磁盘通过串口或USB写入FALSH应用程序空间。

流程图如下:

当然,这只是一种最简单的方式,它还可以是当APP代码在执行时,将PC指针跳转到IAP来更新自已。

 

实现的大致原理都是一致的,只是方式不同罢了。

 

值得注意的是:

 

IAP跳转的地址必须APP的起始地址一致,相应的中断向量表也要修改,否则APP将不能正确的运行。

在附件我整理的代码中,串口方式的IAP跳转的地址为0x8002000,因此应用程序的起始地址也应为0x8002000,在KEIL设置下如下图:

还有中断向量表的起始地址也应改为0x8002000:

/* Set the Vector Table base address at 0x08002000 */

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);  // NVIC_VectTab_FLASH=0x08000000

只有以上两处设置正确才能确保APP能正确的运行。

USB方式的IAP跳转的地址为0x8004000,设置方法同上。

升级文件传输方式

串口方式的IAP在超级终端下用Ymode协议,波特率115200;文件为.BIN格式。

USB方式的IAP用DfuSe USB Device Firmware Upgrade软件传送,文件为dfu格式。

 

总的来说,IAP带给我的体验还是非常愉快的!

 

所谓IAP,就是在系统编程,也就是说,CPU 在运行的
过程中,可以对FLASH 进行刷写.基本的应用可用于写入加密字或者一些存储信息等,高级点
的应用则是用于某些使用的设备上,系统查入SD 卡后自动更新程序等.

在stm32f10x_conf.h中开放#include "stm32f10x_flash.h"

#include "STM32Lib\\stm32f10x.h"
#include "hal.h"

#define FLASH_ADR 0x08008000  //要写入数据的地址
#define FLASH_DATA 0x8a8a8a8a  //要写入的数据

int main(void)
{
u32 tmp;
ChipHalInit();   //片内硬件初始化
ChipOutHalInit();  //片外硬件初始化
//判断此FLASH是否为空白
tmp=*(vu32*)(FLASH_ADR);

/* 将地址(FLASH_ADR)强制转化为(vu32*)型指针求内容*然后再将值赋给tmp。还是比较考练C语言的,老师上课可从没这么讲过。*/
if(tmp==0xffffffff)
{
   FLASH_Unlock();
   FLASH_ProgramWord(FLASH_ADR,FLASH_DATA);
   FLASH_Lock();
   USART1_Puts("要写入的地址为空,已经写入认证数据\r\n"); //在指定地址编写一个字
}
else if(tmp==FLASH_DATA)
     {
       USART1_Puts("地址数据与认证数据符合\r\n");
       FLASH_Unlock();
       FLASH_ErasePage(FLASH_ADR);

     /* 和众多 FLASH 存储器的特性类似,STM32 内的FLASH 数据只能由1变成0,如果要由0
      变成1,则需要调用刷除函数,把一个页都刷除掉.如果不擦也能写但是只能写上0*/
       FLASH_ProgramWord(FLASH_ADR,0x11223344);
       FLASH_Lock();
       USART1_Puts("写入了0x11223344\r\n");
}
else
{
   USART1_Puts("地址上的数据与认证的数据不符合,有可能是写入失败或者是要写入的地址非空\r\n");
   FLASH_Unlock();
   FLASH_ErasePage(FLASH_ADR);
   FLASH_Lock();
   USART1_Puts("已经刷除了要写入的地址\r\n");
}
while(1);
}

系统通过串口输出写FLASH的状情况,在第一次运行的时候,一般情况, 0x08008000处的
FLASH为空,于是系统就往空的FLASH上写入一个数据0x8a8a8a8a.并提示已经写入.此时用
户只要再次复位一下系统,则由于之前已经写入并为系统所读取,则这次串口就会输出已经写
入了数据的信息.
注意写FLASH 之前需要调用解锁函数,写入后应调用锁定函数.

STM32--简单的IAP操作 -  ╄→风、吹不散 - ╄→风、吹不散STM32--简单的IAP操作 -  ╄→风、吹不散 - ╄→风、吹不散STM32--简单的IAP操作 -  ╄→风、吹不散 - ╄→风、吹不散

闪存的指令和数据访问是通过AHB总线完成的。预取模块是用于通过ICode总线读取指令的。仲裁是作用在闪存接口,并且DCode总线上的数据访问优先。 

读访问可以有以下配置选项: 

● 等待时间:可以随时更改的用于读取操作的等待状态的数量。 

● 预取缓冲区(2个64位):在每一次复位以后被自动打开,由于每个缓冲区的大小(64位)与闪存的带宽相同,因此只通过需一次读闪存的操作即可更新整个缓冲区的内容。由于预取缓冲区的存在,CPU可以工作在更高的主频。CPU每次取指最多为32位的字,取一条指令时,下一条指令已经在缓冲区中等待。 

● 半周期:用于功耗优化。

注: 1. 这些选项应与闪存存储器的访问时间一起使用。等待周期体现了系统时钟(SYSCLK)频率与闪存访问时间的关系: 0等待周期,当 0 < SYSCLK < 24MHz 1等待周期,当 24MHz < SYSCLK ≤ 48MHz 2等待周期,当 48MHz < SYSCLK ≤ 72MHz 

2 . 半周期配置不能与使用了预分频器的AHB一起使用,时钟系统应该等于HCLK时钟。该特性只能用在时钟频率为8MHz或低于8MHz时,可以直接使用的内部RC振荡器(HSI),或者是主振荡器(HSE),但不能用PLL。 

3. 当AHB预分频系数不为1时,必须置预取缓冲区处于开启状态。 

4. 只有在系统时钟(SYSCLK)小于24MHz并且没有打开AHB的预分频器(即HCLK必须等于SYSHCLK)时,才能执行预取缓冲器的打开和关闭操作。一般而言,在初始化过程中执行预取缓冲器的打开和关闭操作,这时微控制器的时钟由8MHz的内部RC振荡器(HSI)提供。 

5. 使用DMA:DMA在DCode总线上访问闪存存储器,它的优先级比ICode上的取指高。DMA在每次传送完成后具有一个空余的周期。有些指令可以和DMA传输一起执行。

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 


在ST官网下载IAP历程,链接http://www.st.com/stonline/products/support/micro/files/an2557.zip

 

移植历程到自己的开发板上

 

主要修改main.c中的串口初始化函数IAP_Init(),根据需要再添加一个开发板端口初始化的函数,修改int main()函数里进入IAP的条件

 

 

应用程序的修改主要是四点

1、 options for target-->将ROM1修改成0x8002000

2、 option for target-->linker-->勾选use memory layout from target dialog

3、 options for target -->user 在run user programs after build/rebuild下给run#1和run#2打勾,并分别填上I:\embedded\Keil Mdk\ARM\BIN40\fromelf.exe --bin -o my.bin output\release.axf和I:\embedded\Keil Mdk\ARM\BIN40\fromelf.exe -z output\release.axf,注意地址要正确,主要目的是调用keil自带的hex转工具将keil编译程序后生成的release.axf转成bin文件

4、 在程序中重定向向量表NVIC_SetVectorTable(NVIC_VectTab_FLASH+0x2000, 0x2000);

 

 

下载程序方法:

1、 现在IAP的引导程序,也就是移植官网的那个程序。

2、 使用开始—所有程序--附件—通信—超级终端进行下载,超级终端配置为无数据流控制,另外波特率、数据位等要与例程的串口配置要对应,输入1使开发板进入等待下载的模式,点击超级终端的传送à传送文件,选择文件,协议使用例程的Ymodern,下载完后输入2即可运行应用程序


关键字:STM32  IAP操作 引用地址:STM32--简单的IAP操作

上一篇:C语言 STM32 求绝对值函数
下一篇:STM32低功耗模式简介

推荐阅读最新更新时间:2024-03-16 15:12

STM32-一个例子搞懂EXTI外部中断/事件系统
假设一个商业帝国集团STM32 GROUPE有三家子公司,叫EXTI安保公司、AD转换技术有限公司、INT中断快递有限公司。 EXTI安保公司有一个经理和三个员工,分别为: 经理:寄存器·李 门卫:边沿检测·王 业务员:中断业务·杨 发言人:脉冲输出·赵 下图便是EXTI安保公司,黄色方框是集团董事长,绿色方框是经理,蓝色方框1~3分别是门卫、业务员、发言人。 边沿中断事件 一天,EXTI技术有限公司经理寄存器·李得到集团董事长的指示,要抓一个叫边沿的家伙,把它交给AD转换技术有限公司处理。(外部中断触发AD转换) 经理赶紧告诉门卫边沿检测·王:“小王啊,注意点,如果遇到一个叫边沿的时候告诉我一声!
[单片机]
STM32-一个例子搞懂EXTI外部中断/事件系统
关于STM32数据手册中的定时器信号
最近在搞定时器,看说明,就像看天书,问题出在哪里,很多信号不明白是怎么来的。所以就抓个时间整理了一下。 打开STM32数据手册中的总体框图。娘的,又TMD一阵眼花缭乱。 首先,我们可以看到这个图大概有两个不分,一个部分是时钟源,另一个部分则是输入输出 时钟源计数,到CNT计数器,然后根据捕获比较寄存器进行记录或比较。记录或比较有不同的配置。 首先是TI信号 TI1 TI2 TI3 TI4:这个信号就是外部信号,是直接与管脚相连的信号,图中还有一个问题就是TI1是可以是第一通道的外部信号进行触发,也可以设置为,第一通道,第二通道,第三通道异或进行触发。外部信号送往滤波器和边沿检测器。 TIxFP触发有效信号。 TI1F
[单片机]
关于<font color='red'>STM32</font>数据手册中的定时器信号
关于STM32网络电路设计方案
如果有同学对SMI,MII和RMII接口不熟悉,建议看一下上面提到的两篇文章,不然可能看不太懂下文。 区域1:我们称为SMI接口,用于配置外部PHY芯片。 区域2:是数据交换接口,也就是上面我们说的MII接口和RMII接口。 利用这些接口可以有多种不同的网络电路设计方案,这里我来总结下。 01MII接口方案 MII接口在文章《STM32网络之MII和RMII》已经详细介绍过了,从中得知,需要一个25MHz的时钟。 对于MII接口,最常用的方案是,STM32外接25MHz的晶振。 内部的PLL配置HCLK,提供给内核和外设等。 外部PHY连接提供了25MHz的MCO脚。 此方案适合STM32F107/2x7/4x7。 02R
[单片机]
关于<font color='red'>STM32</font>网络电路设计方案
STM32_HAL库入门笔记(一) USART配置
串口发送功能: uint8_t TxData = 01234abcde ; HAL_UART_Transmit(&huart2,TxData,10,0xffff);//把TxData的内容通过uart2发送出去,长度是10,timeout的时间是最大值0xffff 串口接收功能1: uint8_t value='F'; HAL_UART_Receive(&huart2,(uint8_t *)&value,1,1000);//在这个语句停留1000ms内等待接收1个字节数据,把数据存放在value中 串口接收功能2: HAL_UART_Receive_IT(&huart2,(uint8_t *)&valu
[单片机]
STM32_HAL库入门笔记(一) USART配置
Stm32时钟分析
该分析材料大部分来自opendev论坛,我所做的只不过是加上一些自己的分析和整理,由于个人能力有限,纰漏之处在所难免,欢迎指正。 一、硬件上的连接问题 如果使用内部RC振荡器而不使用外部晶振,请按照如下方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法: i)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。 ii)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面i)节省2个外部电阻。 对上图的分析如下: 重要的时
[单片机]
<font color='red'>Stm32</font>时钟分析
STM32开发 -- UART应用层通信协议分析
拿到一份UART的通信协议,上手来操作之前先做一下分析。 一、帧格式说明 先看一下它的帧格式说明: 1、 帧头标志Head 不论是命令帧还是响应帧,帧头标志都是0x92。 2、 协议版本 协议版本号(4bit),目前值为1 加密方式(4bit),0表示采取“数据不加密+校验和”方式。 所以,当前此字段完整值为0x10 3、 控制字段中的C/R比特 用于指示该帧是命令帧还是应答帧,1表示命令帧,0表示应答帧。 4、 控制字段中的T/F比特 用于指示传输数据类型,1表示透明的非结构化数据,0表示正常的数据帧。 5、 虚拟通道 虚拟地址(4bit):代表数据帧的源地址标识。目前为保留位,取值为0。 通道序
[单片机]
<font color='red'>STM32</font>开发 -- UART应用层通信协议分析
STM32定时器中断设置方法
今天调试了STM32的定时器功能,STM32定时器比较多,但调试都是一样的,寄存器都是一一对应的。就拿TIM2举例说明。在网上搜了好多关于定时器的设置,但大多数都是一个版本,而且都是针对库函数操作的,让人看起来一头雾水,对于初学者很是不利(我也是初学者)。下面我将自己的定时器设置过程一一记录下来,以供大家参考,我们共同学习 首先定义定时器头文件,也就是定义寄存器以供操作: //************************************************************************* // // TIM2-Register // //***********************
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved