1. 概念
IAP:In-Application Programming”,中文解释为“在程序中编程”。ICP(In-Circuit Programming)技术即通过在线仿真器对单片机进行程序烧写,而ISP技术则是通过单片机内置的bootloader程序引导的烧写技术。
2. 框架设计
简要说明: 将STM32 的Flash 512Kb 分为两个部分,一个256Kb 用来存放最小系统,一个256Kb用来存放APP代码。具体最小系统与APP的Flash大小可根据实际情况调整。
难点解析:
最小系统与APP的存放地址
要找到最小系统与APP的存放地址,那么就需要了解STM32的Flash存储空间,如下:
最小系统与APP的跳转
系统启动之后首先进入最小系统,这是由硬件决定的,进入最小系统之后,再判断APP系统烧录的地址的栈顶指针是否正确来判断是否烧录了APP,启动APP。官方例程代码如下:
/* Test if user code is programmed starting from address "ApplicationAddress" */
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
上面这个是第一种方法,还有第二种方法是:在将APP程序写入Flash后在Flash中写入相关信息,最小系统程序不断检测读取该信息,如读到该信息则写一个标志位到SRAM中,重启MCU,剩下的同样利用上面的代码,只不过判断条件改为SRAM中的标志位了。
启动顺序
关于启动顺序,网上有比较详细的说明
没有使用IAP的
使用IAP的
最小系统与APP的编译
最小系统的编译直接按照正常的工程编译就行,而APP的编译则需要特殊处理:keil中设置如下:
上面这个是针对程序的存放的Flash地址的,还需要对中断向量表进行重地位,可使用函数
void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);
在APP main函数中调用该函数设置偏移量,偏移量要等与程序 Flash相等的偏移量
关键字:STM32 IAP 流程
引用地址:
STM32 IAP实现流程
推荐阅读最新更新时间:2024-03-16 16:13
STM32与上位机串口通讯的学习笔记(简明的数据帧设计方法)
最近因为项目需要,需要做一个STM32和Windows的串口通讯协议来交换数据,本着追求极致的心态,来讨论一下简明的数据帧的设计方法。 ##数据的传输方式 对于很多单片机初学者而言,可能他们接触到串口 首先想到的就是通过串口打印字符串,然后就会很理所当然的想到了用“打印”的方式来传输数据。 比如我们需要传输一个float型的数据value,可能小白们首先会想到的方式就是串口重定向printf然后像下面这样把数据传输过去 printf( %f ,&value); 但是实际上,对于程序之间的交流,使用字符串打印这样的方式是非常浪费传输数据的,因为假设这个浮点数据为1234.567占了8个字符(小数点也占一位) 所以用字
[单片机]
STM32外设资源查询方法,对比C8T6和ZET6
对应不同型号的单片机的外设资源需要找相应的单片机的数据手册,比如STM32F103ZET6数据手册,STM32F103C8T6数据手册. 根据FLASH大小STM32F103ZET6 - 为HD型,STM32F103C8T6 - 为MD型。 STM32F103家族系列芯片外设对比 STM32F103ZET6 外设资源数据手册一览 从上图也可以看到ZET6一共有11个定时器,包括2个高级定时器、4个通用定时器、2个基本定时器…当然还有2个看门狗和1个系统定时器。 再由这个两个图也可以看出TIM1/8是高级定时器、TIM2/3/4/5是通用定时器、TIM6/7是基本定时器。 高级定时器在APB1总线上,通用和
[单片机]
两片STM32之间I2C通信
硬件平台:master:stm32f401re slave:stm32f401ce 开发平台:keil 5.18 操作系统:win7 如上篇所讲,将401CE配置为I2C从机,并设置为从发送模式。 主机的I2C与从机相同,同样配置即可。同时增加uart设置,方便将接收到的数据打印出来。 主机的设置为主接收: printf( \n\rStart....\n\r ); /* Put I2C peripheral in reception process */ /* Timeout is set to 10S */ while(HAL_I2C_Master_Receive(&I2cHandle, (uint16
[单片机]
关于STM32的GPIO的问题集锦
1、关于GPIO 问:STM32的IO口初始化为输入浮空,那管脚是高电平还是低电平呢? 答:既不是高电平也不是低电平,悬空的意思是没有使用的状态。 2、有关stm32f103端口复用的问题? 问:在学习GPIO时,遇到到端口复用问题一直不能明白,我举个例子: PB6PB7默认情况下是做普通IO使用的,当我想用I2C1是,我开启RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 当我要使用I2C1的重定义时,我要打开, RCC_APB1Perip
[单片机]
STM32 测量交流电压的方法
关于STM32测量交流电的一种方法. 关于交流电压测量的难点有以下几点:1.电压过大,比如市电220V,2.交流电和直流电区别很大,例如值一直在变不稳定.3.交流电压存在负值,STM32 的AD模块没法测量.4.STM32读取的电压值是瞬时值和交流电的有效值还要转换. 针对以上几点:可以采取合适的硬件设计和算法设计解决.采用电流互感器将电压从高变低,采用直流电压叠加的方式将整体的交流波形抬升,抬升到最低都大于零.至于读取到的数值采用均方根的算法算出交流有效值.另外还要注意一点是采样周期的设置. 电路设计: 这个硬件电路设计很完善.还有一种: 第二种电路结构更简单,但是运放采用的是用于测量交流信号的MCP
[单片机]
STM32芯片超低功耗设计思路
对于给定的制造工艺和晶片区域,微控制器的功耗主要取决于两个因素(动态可控):电压和频率。 ST公司L系列超低功耗芯片为130nm超低泄漏工艺,在超低功耗所做的设计思路如下: 1、围绕Cortex-M3内核构建,具有领先的处理性能和代码密度,其处理性能使得运行模式时间更少,因此可以使深度睡眠模式的时间更长。 2、提供3个动态可选电压范围,从1.8V到1.2V,可在能耗上提供超过25%的增益。 3、提供7种低功耗模式,逐步禁用与频率无关的电流源(时钟源、非易失性存储器、调压器),直至大部分外设掉电。 4、灵活的门控技术,超低功耗模式下只激活必要的逻辑门。a)闲置的引脚配置为模拟输入;b)连接外围电路的引脚,提供有效的Pull
[单片机]
STM32----GT9157触摸IC驱动
一、硬件环境 野火F429第一代开发板,5寸触摸屏,触摸IC为GT9157,支持5点触控(但IC是支持10点触控的) 二、GT9157初始化 总的流程:1、初始化GPIO -- 2、初始化I2C -- 3、复位GT9157以确定IC从地址 -- 4、写配置寄存器(0x8047~0x8100) (1)初始化GPIO与I2C 这个不详述,I2C可用模拟,也可用硬件I2C。STM32F4的硬件I2C稳定性还行,最重要的是,需要设置I2C等待时间 与等待次数,超时跳出等待防止卡死。野火的I2C读取移植自GT9157的Linux驱动,使用一个i2c_msg结构体控制读写 static
[单片机]
stm32gpio的工作模式
1、推挽输出 可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补 信号 的控制,总是在一个三极管导通的时候另一个截止。高低电平由 IC 的 电源 决定。 推挽电路是两个 参数 相同的三极管或 MOSFET ,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌 电流 ,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。 2、开漏输出 输出端相当于三极管的集电极,要得到高电平状态需要上拉 电阻 才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。 3、浮空输入 对于浮空输
[单片机]