STM32 IAP程序总结

        本篇是关于根据正点原子IAP程序的学习记录,以及自己理解。

一、IAP运行流程图

        STM32 的内部闪存(FLASH)地址起始于 0x08000000,一般情况下,程序文件就从此地址开始写入。程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成
启动,“中断向量表”的起始地址是 0x08000004。

二、生成APP

1 ) 设置 APP 程序的起始地址和存储空间大小

        因此留给APP用的flash空间为0x30000,起始地址为0x8010000。设置好 Start 和 Szie,就完成APP 程序的起始地址设置。

2 ) 设置中断向量表偏移量

        systemInit函数中的定义如下:

        VTOR寄存器存放的是中断向量表的起始地址,在main函数开头重新设置了中断向量

SCB->VTOR = FLASH_BASE | 0x10000;
3 ) 生成.bin 文件

三、生成bootloader

        bootloader的起始地址为0x8000000,FLASH_APP1_ADDR设置为app1启动的地址,即0x08010000

3.1、程序下载

        正点原子从flash升级例程中,先使用iap_write_appbin将串口接收buff中的app1程序下载到flash中。

3.2、程序跳转(对应流程③)

        通过iap_load_app函数,跳转到 APP1 程序运行

 

         先介绍“==”号的左侧,结合app1的hex文件会更好理解,这里判断FLASH_APP1_ADDR+4,由于FLASH_APP1_ADDR为0x08010000,偏移四个后取值,在hex文件找到地址0x08010004对应的值为0x080164F1,结合运行流程图,这个就是APP复位中断向量的值,这里0x20000780即是栈顶指针的值。

        “==”右侧判断是否为0x08000000的原因是stm32f10xx的闪存地址都是从该地址开始的,只要判断最高8位是0x08,等价于你烧录的就是stm32的固件。

        接下来看一下iap_load_app的实现

 

        appxaddr=0x08010000,按位与后就是0x20000000,这条If语句的目的是通过判断顶地址值是否正确(是否在0x20000000-0x20010000之间) 来判断APP程序是否已经正确加载,因为APP程序的启动文件刚开始就去初始化化栈空间,若栈顶值对了,说应用程已经下载了启动文件的初始化也执行了。 如果没有这一句话,即使没有下载程序也会进入而导致程序跑飞

本文参考:https://www.freesion.com/article/217536578/

((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000这句话应该怎样理解呢?麻烦详细解释一下。。。-OpenEdv-开源电子网

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
关于STM32利用移远4G模组HTTPS下载bin文件的AT指令程序,可以分为以下几个步骤: 1. 初始化移远4G模组:使用AT指令初始化移远4G模组,包括设置通信波特率、APN等参数。 2. 建立TCP连接:使用AT指令建立与服务器的TCP连接,确保连接成功。 3. 发送HTTPS请求:使用AT指令发送HTTPS请求,包括请求头、请求体等参数,确保请求成功。 4. 接收HTTP响应:使用AT指令接收HTTP响应数据,包括响应头、响应体等数据,确保接收完整。 5. 解析HTTP响应:解析HTTP响应数据,获取bin文件下载链接。 6. 下载bin文件:使用AT指令下载bin文件,确保下载成功。 具体实现方法可以参考以下代码: ```c #include "usart.h" /* 移远4G模组AT指令 */ const char *AT_Init = "AT+IPR=115200\r\n"; const char *AT_Reset = "AT+CFUN=1,1\r\n"; const char *AT_SetAPN = "AT+CGSOCKCONT=1,\"IP\",\"APN\"\r\n"; const char *AT_SetServer = "AT+QHTTPURL=\"https://www.example.com/binfile.bin\"\r\n"; const char *AT_SetHeader = "AT+QHTTPHEADER=3\r\n"; const char *AT_GetHeader = "AT+QHTTPHEADER?\r\n"; const char *AT_HttpAction = "AT+QHTTPGET=80\r\n"; const char *AT_ReadData = "AT+QHTTPREADFILE=\"/flash/binfile.bin\"\r\n"; /* USART串口发送数据 */ void USART_SendString(USART_TypeDef *USARTx, char *str) { while (*str) { while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); USART_SendData(USARTx, *str++); } } int main(void) { /* 移远4G模组初始化 */ USART_SendString(USART1, AT_Init); USART_SendString(USART1, AT_Reset); USART_SendString(USART1, AT_SetAPN); /* 建立TCP连接 */ USART_SendString(USART1, AT_SetServer); USART_SendString(USART1, AT_SetHeader); USART_SendString(USART1, AT_GetHeader); USART_SendString(USART1, AT_HttpAction); /* 接收HTTP响应 */ USART_SendString(USART1, AT_ReadData); while (1); } ``` 需要注意的是,以上代码只是一个简单的框架,具体实现还需要根据实际情况进行调整和完善。同时,还需要针对移远4G模组的AT指令进行详细了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值