当前位置:首页 > 单片机 > 单片机
[导读]STM32的IAP功能确实方便,以前对此如何实现有所了解,但是一直没去测试,这两天来练了下,可谓困难重重,搞了两天问题也一一解决,下面做些简要的笔记IAP就是在线应用编程,方便程序升级,可以不用打开产品,直接通过

STM32的IAP功能确实方便,以前对此如何实现有所了解,但是一直没去测试,这两天来练了下,可谓困难重重,搞了两天问题也一一解决,下面做些简要的笔记

IAP就是在线应用编程,方便程序升级,可以不用打开产品,直接通过串口升级,那么就需要一个引导程序(大神们喜欢称bootload),一个APP程序(实际产品的工作程序)

减小测试难度,我设计了3个程序,一个bootload程序,一个LED闪烁程序,一个KEY+LED点动程序,我的目的就是用两个不一样的APP程序,互相升级,方便验证结果

我手里的开发板是STM32F103ZET,属于大容量产品,flash有512K, 我们的bootload和APP应用程序就需要在flash里面进行划分,对于我的测试程序,这些空间实在是太大了,有点大材小用了

STM32F103ZET的flash起始地址是0x8000000,总共是512k,那就是到0x807ffff结束。

定义bootload的范围0x8000000 --- 0x800ffff;

定义APP的范围 0x8010000 --- 0x807ffff;

下面首先是bootload介绍

bootload的程序和一般程序区别不大,就是在MDK配置方面需要注意

这些设置好以后直接生产HEX文件,下载便可

在此,测试的时候遇到两个问题,

一个是串口接受时,上位设置了256000的波特率,我芯片波特率设置成25600,少了一个0,数据一直不对,接受到的APP数据全是乱码,搞了有四五小时才发现,真是蛋疼

另外一个在验证flash读写时,数据位没搞对,applenth本身是接受的数据长度,我前面一直在箭头的方向,进来就清零,导致可写入flash的数据数为0,后面读flash的时候全是0xffff,这块也耗了有两个小时。

//********************************************************************************
int main(void) //bootload的main汗死
{
u16 oldcount=0;
u16 applenth=0;
main_init();

while(1)
{
time_loop();
key_dispose();

if(bit_20ms==1) //20ms检测一次串口数据,是否有数据,是否数据不变,就接受完成了
{
bit_20ms=0;
if(USART_RX_CNT)
{
if(oldcount==USART_RX_CNT) //新周期内,没有收到任何数据,认为本次数据接收完成.
{
applenth=USART_RX_CNT;
oldcount=0;
USART_RX_CNT=0;
}
else
oldcount=USART_RX_CNT;
}

}

if(applenth!=0) //数据长度不为0,说明串口接受完成了
{
add_tmp=(*(vu32*)(0X20001000+4)); //这里add_tmp是验证地址数据,好自己判断下面的if条件是否成立
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码 //串口数据写入到flash
delay_ms(100);
bit_new=1;
}
applenth=0;
}

if((bit_10s==1)&&(bit_new==1)) //10s后才执行更新部分的程序
{
bit_10s=0;
bit_new=0;
add_tmp=(*(vu32*)(FLASH_APP1_ADDR+4)); //这里add_tmp也为验证,不用的话可以去掉
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR); //执行FLASH APP代码
}
}
}
}

再来介绍下APP的程序,APP程序,我们上面已经定义了APP的地址,相比bootload的地址,我偏移了0x1000,那么APP的一些中断向量什么都要进行设置

先配置下MDK文件

然后在程序main函数里面设置 SCB->VTOR = FLASH_BASE | 0x10000;我们自己定义的偏移量

其他和正常程序类似

在调速APP程序时也遇到一个头疼问题

就是偏移量问题,我们上面说了,一进main函数就设置下,但是我的依然不行,最后发现原来是我的程序在其他地方又复位成了0,因为程序模版是拷贝的,一些地方没记得改

这个是中断配置汗死,以前的模版,习惯上中断偏移为0,按下面流程走下来后,等于回头了

//********************************************************************************
static void NVIC_Configuration(void)
{
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0); //这里需要配置偏移量,放在APP里面0是错误的
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置NVIC中断分组4:4位抢占优先级,0位响应优先级
}

//********************************************************************************
void main_init(void)
{
SCB->VTOR = FLASH_BASE | 0x10000;
NVIC_Configuration();
SysTick_init();

led_init();
key_init();

}
//********************************************************************************
int main(void)
{
main_init();

while(1)
{
time_loop();
key_dispose();
}
}

下面来到最关键的一步,我们要用串口下面,怎么下载,下载什么问题

APP需要先生产BIN文件,然后接受常规的串口软件便可,方法如下

这个需要填写到上面框中D:KEILARMARMCCBINfromelf.exe --bin -o ..OBJLEDKEYTOBIN.bin ..OBJLEDKEYTOBIN.axf

在网上查了路径要按照自己的来,有的是KEILARMBIN40....等等

LEDKEYTOBIN,这个是根据自己的喜好来的,但是要和下图所框的对应起来

大功告成,编译如下


类似的再搞个其他的APP程序,就可以完成bootload做为引导,APP升级方式。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

STM32与51单片机之间有什么差异呢?两者可以说是一场科技与性能的较量了。在科技飞速发展的今天,微控制器(MCU)已广泛应用于各类电子设备和系统中,发挥着举足轻重的作用。其中,STM32和51单片机作为两种常见的微控制...

关键字: STM32 51单片机 MCU

电磁铁是一种利用电流产生磁场的装置,具有快速响应、易于控制等特点,在工业自动化、电子设备、科学实验等领域有着广泛的应用。STM32是一款功能强大的微控制器,具有高性能、低功耗、易于编程等优点,是控制电磁铁的理想选择。本文...

关键字: 电磁铁 微控制器 STM32

边缘人工智能的实现涉及到三个基本 要素:安全性,连接性、自主性,而其中自主性是AI能力的体现,也是边缘AI有别于其他传统的物联网的关键。而通过ST Edge AI套件,就可以帮助各种不同类型的开发者实现覆盖全硬件平台的全...

关键字: 边缘人工智能 AI STM32

今天,小编将在这篇文章中为大家带来STM32单片机最小系统的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 单片机最小系统 STM32

STM32是一款由STMicroelectronics生产的微控制器系列,具有高性能、低功耗和丰富的外设资源。其中,串口通信是一种常用的通信方式,可以实现与其他设备之间的数据传输。

关键字: STM32 串口通信 微控制器

串行通信需要传输的数据通过调制器(Modulator)将数据转换为模拟信号,经过信号调制(Modulation)后在传输线上传输,接收端通过解调器(Demodulator)将信号解码还原成原始数据。

关键字: 串口 串行通信 并行通信

STM32是一种广泛使用的微控制器,具有丰富的通信接口。其中,串口通信是STM32与其他设备或系统进行数据交换的重要方式之一。本文将详细介绍STM32串口通信的原理、应用及常见故障。

关键字: STM32 串口通信

由于目前缺乏相应的监测技术,地下电缆线路出现异常运行状态无法被及时发现,久而久之易演变成大故障,最终只能通过更换地下电缆进行修复,耗费大量的人力、物力。鉴于此,开发了一种基于STM32的地下电缆异常状态检测系统,利用热传...

关键字: STM32 地下电缆

交通灯控制器是用于控制交通信号灯运行的设备,它可以根据交通流量、行人需求以及其他因素,动态地调整信号灯的变化时间和绿灯时长,以保证交通的流畅和安全。

关键字: 交通信号灯 STM32
关闭
关闭