stm32的IAP学习

发布者:姑苏清风泉源客最新更新时间:2016-10-05 来源: eefocus关键字:stm32  IAP 手机看文章 扫描二维码
随时随地手机看文章
几乎所有的同类书籍都介绍综合性的应用示例如“万年历 + 温度显示 + 闹钟响铃 + 计时表”这样的一个实时时钟范例或“STM32 + 音频解码 + 大容量存储方案”这样的MP3播放器范例。这些综合性实例的目的在于引领读者进行综合性实验,达到把单片机的基础模块整合运用的目的。这些实例普遍存在一种共同点,即“练手”意义要大于“实用”的意义。本文将讲述一个STM32的综合性应用示例,该示例将涉及到STM32微控制器的时钟系统、GPIO、定时器、中断系统、异步串口以及内置可编程flash等设备的应用,作为一个综合性实验的同时还具有很强的“实用”意义。这个示例就是STM32的IAP方案。
         IAP,全称是“In-Application
Programming”,中文解释为“在程序中编程”。IAP是一种对通过微控制器的对外接口(如USART,IIC,CAN,USB,以太网接口甚至是无线射频通道)对正在运行程序的微控制器进行内部程序的更新的技术(注意这完全有别于ICP或者ISP技术)。ICP(In-Circuit Programming)技术即通过在线仿真器对单片机进行程序烧写,而ISP技术则是通过单片机内置的bootloader程序引导的烧写技术。无论是ICP技术还是ISP技术,都需要有机械性的操作如连接下载线,设置跳线帽等。若产品的电路板已经层层密封在外壳中,要对其进行程序更新无疑困难重重,若产品安装于狭窄空间等难以触及的地方,更是一场灾难。但若进引入了IAP技术,则完全可以避免上述尴尬情况,而且若使用远距离或无线的数据传输方案,甚至可以实现远程编程和无线编程。这绝对是ICP或ISP技术无法做到的。某种微控制器支持IAP技术的首要前提是其必须是基于可重复编程闪存的微控制器。STM32微控制器带有可编程的内置闪存,同时STM32拥有在数量上和种类上都非常丰富的外设通信接口,因此在STM32上实现IAP技术是完全可行的。
         实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序。这段程序主要负责与外部的上位机软件进行握手同步,然后将通过外设通信接口将来自于上位机软件的程序数据接收后写入单片机内部指定的闪存区域,然后再跳转执行新写入的程序,最终就达到了程序更新的目的。
在STM32微控制器上实现IAP程序之前首先要回顾一下STM32的内部闪存组织架构和其启动过程。STM32的内部闪存地址起始于0x8000000,一般情况下,程序文件就从此地址开始写入。此外STM32是基于Cortex-M3内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动。而这张“中断向量表”的起始地址是0x8000004,当中断来临,STM32的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。最后还需要知道关键的一点,通过修改STM32工程的链接脚本可以修改程序文件写入闪存的起始地址。
在STM32微控制器上实现IAP方案,除了常规的串口接收数据以及闪存数据写入等常规操作外,还需注意STM32的启动过程和中断响应方式。图1显示了STM32常规的运行流程。

(原文件名:1.jpg)  
图1
对图1解读如下:
1、        STM32复位后,会从地址为0x8000004处取出复位中断向量的地址,并跳转执行复位中断服务程序,如图1中标号○1所示。
2、        复位中断服务程序执行的最终结果是跳转至C程序的main函数,如图1中标号○2所示,而main函数应该是一个死循环,是一个永不返回的函数。
3、        在main函数执行的过程中,发生了一个中断请求,此时STM32的硬件机制会将PC指针强制指回中断向量表处,如图1中标号○3所示。
4、        根据中断源进入相应的中断服务程序,如图1中标号○5所示。
5、        中断服务程序执行完毕后,程序再度返回至main函数中执行,如图1中标号○6所示。
若在STM32中加入了IAP程序,则情况会如图2所示。

(原文件名:2.jpg)   
图2
对图2的解读如下:
1、        STM32复位后,从地址为0x8000004处取出复位中断向量的地址,并跳转执行复位中断服务程序,随后跳转至IAP程序的main函数,如图2中标号○1、○2所示。这个过程和图1相应部分是一致的。
2、        执行完IAP过程后(STM32内部多出了新写入的程序,图2中以灰色底纹方格表示,地址始于0x8000004+N+M)跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的main函数,其过程如图2的标号○3所示。新程序的main函数应该也具有永不返回的特性。同时应该注意在STM32的内部存储空间在不同的位置上出现了2个中断向量表。
3、        在新程序main函数执行的过程中,一个中断请求来临,PC指针仍会回转至地址为0x8000004中断向量表处,而并不是新程序的中断向量表,如图2中标号○5所示。注意到这是由STM32的硬件机制决定的。
4、        根据中断源跳转至对应的中断服务,如图2中标号○6所示。注意此时是跳转至了新程序的中断服务程序中。
5、        中断服务执行完毕后,返回main函数。如图2中标号○8所示。
从上述两个过程的分析可以得知,对将使用IAP过程写入的程序要满足2个要求:
1、新程序必须从IAP程序之后的某个偏移量为x的地址开始;
2、必须将新程序的中断向量表相应的移动,移动的偏移量为x;
而设置程序起始位置的方法是(keil uvision4集成开发环境)在工程的“Option for Target….”界面中的“Target”页里将“IROM”的“Start”列改为欲使程序起始的地方,如图3中将程序起始位置设为0x8002000。

(原文件名:3.jpg)  
图3
将中断向量表移动的方法是在程序中加入函数:
void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);
其中参数NVIC_VectTab为中断向量表起始位置,而参数Offset则为地址偏移量,如将中断向量表移至0x8002000处,则应调用该函数如下:
void NVIC_SetVectorTable(0x8000000, 0x2000);
同时有必要提醒读者注意的是,此函数只会修改STM32程序中用于存储中断向量的结构体变量,而不会实质地改变中断向量表在闪存中的物理位置,详情请研究该程序原型。
有了以上准备后就可以着手设计一个IAP方案了,如下:
1、STM32复位后,利用一个按键的状态进行同步,当按键按下时表示将要进行IAP过程;
2、IAP过程中,通过上位机软件向STM32的USART1设备发送所要更新的程序文件,STM32接收到数据后转而从0x8002000地址开始写入收到的数据;
3、STM32借助定时器来判断数据是否完全接收,完全接收后IAP过程结束;
4、再次复位后,跳转0x8002004地址开始运行新写入的程序;
最后提出几点注意事项:
1、具体实现的工程见附件;
2、利用IAP写入的程序文件最好是.bin格式的文件,但不能是.hex格式的文件;
3、向STM32发送程序文件时尽量慢一些,因为STM32对FLASH的写入速度往往跟不上通讯外设接口的速度;
4、建议在STM32和上位机之间设计一套握手机制和出错管理机制,这样可以大幅提高IAP的成功率;
5、附件中的IAP工程具体运行现象为,按着连接于GPIOA.0引脚上的按键后对STM32进行复位操作,若连接于GPIOA.4引脚上的LED被点亮则表示进入了IAP程序,等待从USART1接口传入欲更新的程序文件。程序文件更新完毕后,LED被熄灭。此时再度对STM32进行复位,就开始运行新写入的程序了。
关键字:stm32  IAP 引用地址:stm32的IAP学习

上一篇:stm32控制lcd写字符,画线,汉字等
下一篇:利用stm32的lwip TCP/IP协议栈的通信的思路

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

STM32 USB学习笔记2
主机环境:Windows 7 SP1 开发环境:MDK5.14 目标板:STM32F103C8T6 开发库:STM32F1Cube库和STM32_USB_Device_Library STM32Cube库中提供了一些有关USB的例程,在其工程目录下的Applications目录中,这里打开STM3210E_EVAL目录,可以看到如下例程: 这里选取一个简单的例子CDC_Standalone,为一个USB通信例程,具体实现是一个USB转串口的功能,相当于USB串口线。把示例里面的inc和src目录下的文件拷贝到新建工程中,这里是把跟usb通信相关的文件放到了vcp目录下。文件目录结构如下: 其中BSP目录很简单,由于所购
[单片机]
图说CRC原理应用及STM32硬件CRC外设
在嵌入式产品应用中,常常需要应对系统数据在存储或者传输过程中的完整性问题。 所谓完整性是指数据在其生命周期中的准确性和一致性。这些数据可能存储在EEPROM/FLASH里,或者基于通信协议进行传输,它们有可能因为外界干扰或者程序错误,甚至系统入侵而导致被破坏。如果这些数据在使用前不做校验,产品功能可能失效。在一些特定领域,严重时可能会危及用户财产甚至生命安全。 本文就来聊聊使用较为广泛的循环冗余校验技术,以及在STM32中的一些具体使用体会。 所谓循环冗余校验(CRC:Cyclic Redundancy Check)是一种错误检测算法,通常在通信协议中或存储设备中用于检测原始数据的意外变动。可以简单理解成对有用数据按照一定
[单片机]
图说CRC原理应用及<font color='red'>STM32</font>硬件CRC外设
STM32 DMA理解
通道配置过程 1、 在DMA_CPARx寄存器总设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是传输的源或目标 2、 在DMA_CMARx寄存器中设置数据存取器的地址,发生外设数据传输请求时,传输的数据将从这个地址读出或写入这个地址 3、 在DMA_CMARx寄存器中设置要传输的数据量,在每个数据传输后,这个数值递减。 4、 在DMA_CCRx寄存器的PL位中设置通道的优先级 5、 在DMA_CCRx寄存器中设置数据传输方向、循环模式、外设和寄存器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断 6、 设置DMA_CCRx寄存器的ENABLE位,启动该通道 一旦启动了DMA通道,它即可
[单片机]
C语言在STM32中的内存分配
01前言 不说废话,先上示例代码 uint8_t num_byte ; uint32_t num_word; const uint32_t num_word_const = 0x1234; uint32_t *point_heap; int main(void) { uint8_t num_byte_stack; static uint8_t num_byte_static; point_heap = (uint32_t *)malloc(4); *point_heap = 0x3421; free(point_heap); num_byte_stack = 0x11; #pragma secti
[单片机]
C语言在<font color='red'>STM32</font>中的内存分配
stm32处理器调试模式下运行正常,上电自启动后运行不正常
最近负责一个项目,用到stm32f4的一款高性能芯片。研发过程中遇到一个很诡异的现象,前前后后折腾了两三天,最后才搞定。由于是新手,经验不足,排故过程很纠结~~ 现象如下: 1.采用JLINK下载程序后,断电让其上电重新启动,发现有时可以正常运行,有时候无法正常运行,大约每两、三次就有一次无法正常上电启动。 2.通过JLINK调试程序,每次均正常运行。太诡异了! 发现问题后开始定位原因。首先考虑是BOOT启动出问题了,stm32f4启动方式分三种:User FLash、SystemFlash和EmbeddedSRAM,通过BOOT0和BOOT1管脚配置。程序正常运行时从User FLash启动,如果BOOT0和BOOT1配置不正确
[单片机]
STM32学习笔记(一)GPIO
GPIO的使用: 一共四组IO口16*3+3:ABCD 库函数 necessity: 1.RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE)使能时钟 2.系统初始化(GPIO_Init) IN: GPIO_InitStruct:模式,引脚,GPIO的最大输出速率, GPIOA(用于参照指示寄存器地址的指针) OUT: CRH/CRL GPIO_InitTypeDef *GPIO_InitStruct; GPIO_InitStruct- GPIO_Mode= GPIO_Mode_Out_PP; GPIO_InitStruct- GPIO_Pin=GPIO_Pin_15
[单片机]
STM32通过DMA采集多通道AD
环境: 主机:XP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 通过脚PA1,PA2采集AD。每路AD采集10次。 参考链接:http://hi.baidu.com/kangxuebin/item/f4f4370f9d7f3c123a53ee30 源代码: #include ad_driver.h //全局变量 //AD采样存放空间 __IO uint16_t ADCConvertedValue ; //函数 //初始化AD void init_ad(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeD
[单片机]
基于STM32的FreeRTOS开发(1)----FreeRTOS简介
为什么使用freertos FreeRTOS 是一个免费和开源的实时操作系统,它主要用于嵌入式系统。它非常轻量级,可以在很小的硬件资源上运行,因此非常适合在限制硬件资源的嵌入式系统中使用。 FreeRTOS提供了一组简单的任务管理功能,可以让您在嵌入式系统中实现多任务环境,这对于涉及多个独立功能的系统是非常重要的。它还提供了一些高级功能,如事件组、信号量、邮箱等,可用于实现任务之间的同步和通信。 FreeRTOS还提供了许多可移植性,可以在各种不同的硬件平台上运行,并且有大量的文档和示例代码可以帮助您快速上手。 总之,FreeRTOS是一个非常受欢迎的嵌入式实时操作系统,因为它简单易用,资源占用小,功能丰富,可移植性好,对于嵌入式
[单片机]
基于<font color='red'>STM32</font>的FreeRTOS开发(1)----FreeRTOS简介
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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