简直一切的同类书本都介绍综合性的运用示例如“万年历 + 温度显现 + 闹钟响铃 + 计时表”这样的一个实时时钟典范或“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 NV%&&&&&%_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+音频解码+…
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/252306.html