IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32的API(应用编程) -> 正文阅读

[嵌入式]stm32的API(应用编程)

简介

IAP(In Application Programming)即在应用编程, IAP 是用户自己的程序在运行过程中对User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产
品中的固件程序进行更新升级。通常实现 IAP 功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通
过某种通信方式(如 USB、 USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在 User Flash 中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:

1)检查是否需要对第二部分代码进行更新
2)如果不需要更新则转到 4)
3)执行更新操作
4)跳转到第二部分代码执行


第一部分代码必须通过其它手段,如 JTAG 或 ISP 烧入;第二部分代码可以使用第一部分代码 IAP 功能烧入,也可以和第一部分代码一起烧入,以后需要程序更新时再通过第一部分 IAP
代码更新。我们将第一个项目代码称之为 Bootloader 程序,第二个项目代码称之为 APP 程序,他们存放在 STM32F4 FLASH 的不同地址范围,一般从最低地址区开始存放 Bootloader,紧跟其后的就是 APP 程序,如果 FLASH 容量足够,是可以设计很多 APP 程序的。STM32F4 的 APP 程序不仅可以放到 FLASH 里面运行,也可以放到 SRAM 里面运行。STM32F4 的内部闪存(FLASH)地址起始于 0x08000000,一般情况下,程序文件就从此地址开始写入。此外 STM32F4 是基于 Cortex-M4 内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地址是 0x08000004,当中断来临, STM32F4 的内部硬件机制亦会自动将 PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。?STM32F4 在复位后,先从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序。

左图是正常执行代码的过程,右图是具有IAP功能的代码执行过程,STM32F4 复位后,还是从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到 IAP 的 main 函数,然后根据情况跳转到app的main函数中;在 main 函数执行过程中,如果 CPU 得到一个中断请求, PC 指针仍强制跳转到地址0X08000004 中断向量表处,而不是新程序的中断向量表,但是如果是复位的话,就会跳出app程序重新开始执行IAP程序。

Bootload程序

IAP函数主要执行两个工作:

1.检查是否更新,需要更新则接收保存更新到的新程序,并将保存的程序转移到flash(或SRAM)中;

????????????????void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)? ? ? ? ? ? ? ? //将数据进行处理后写入到flash中

2.将程序从IAP程序跳转到APP程序中;

????????????????void iap_load_app(u32 appxaddr)? ? ? ? //程序从IAP程序跳转到APP程序
?

?IAP 程序必须满足两个要求:
1) 新程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始;

2)必须将新程序的中断向量表相应的移动,移动的偏移量为 x;

3)IAP程序中app程序写入到flsah的偏移地址=app程序在中断向量表的偏移地址=app程序中【魔法棒】设置的内存起始地址;

?如下图,在正点原子的例程中的delay_ms(10);这个延时函数最好加上,因为他这个例程判断是否接收完成是看USART_RX_CNT=oldcount,即接收到到字节数是否发生变化来判断的,单片机程序执行的速度快于串口助手发送数据的速度,如果不加延时就会出现短暂的USART_RX_CNT=oldcount的误判,然后让USART_RX_CNT和oldcount清零,造成如图3所示,串口一直发送代码长度的情况出现,而且会影响后面 iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth );的执行,造成无法写入flash,如果把橙色那句代码改成iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,sizeof(USART_RX_BUF));这样就可以不用管延时了。

??

??????

这里?if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)这句代码是用来判断APP文件的正确性,在FLASH_APP1_ADDR地址开始的第一个4个字节地址内存放的是MSP地址,第二个4个字节地址内存放的是复位中断向量的入口地址。因为flash地址范围是0x0800 0000~0x080F FFFF,最高两位总是0X08,所以复位中断向量的入口地址开头也应该是0x08,而if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)这句代码就是取复位中断向量的入口地址判断最高位是否是0x08;即通过这种方法来判断APP文件的正确性。

?? ??? ??? ?if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
?? ??? ??? ?{?? ??
?? ??? ??? ??? ?iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
?? ??? ??? ?}else?
?? ??? ??? ?{
?? ??? ??? ??? ?printf("非FLASH应用程序,无法执行!\r\n");
?? ??? ??? ??? ?LCD_ShowString(30,210,200,16,16,"Illegal FLASH APP!");?? ? ??
?? ??? ??? ?}?? ??? ??? ??? ??? ??? ??? ??? ??? ???

上面是对于app程序写入到flah的,同理,app程序写道SRAM中的就有??? if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x20000000)//判断是否为0X20XXXXXX.这句代码进行判断app文件的正确性?。

APP程序

1.起始地址和内存大小设置

????????

上图左边是app储存在flash中的配置方法,右图是SRAM的配置方法,其中要注意,不管是flash还是sram,他们的地址偏移量都必须是0x200的整数倍,

2.设置中断向量表地址偏移

为了尽可能不修改系统级别文件,我们可以也可以在APP 的 main 函数最开头(如果main函数内有SystemInit函数则在SystemInit函数后添加)处添加如下代码实现中断向量表的起始地址的重设:

FLASH的通过:SCB->VTOR = FLASH_BASE | 0x----;进行设置;

SRAM的通过:SCB->VTOR = SRAM_BASE | 0x----;进行设置;

3.生成下载文件bin文件

通过MDK自带的fromelf.exe进行转换,fromelf.exe转换工具的语法格式如下:fromelf [options] input_file

其中[options]包括的选项及详细描述见表一。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-07 00:04:22  更:2021-07-07 00:04:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 9:56:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计