STM32串口IAP实验笔记

发布者:zeta16最新更新时间:2017-02-20 来源: eefocus关键字:STM32  串口  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:\KEIL\ARM\ARMCC\BIN\fromelf.exe  --bin -o  ..\OBJ\LEDKEYTOBIN.bin ..\OBJ\LEDKEYTOBIN.axf

在网上查了路径要按照自己的来,有的是KEIL\ARM\BIN40\....等等

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

大功告成,编译如下


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


关键字:STM32  串口  IAP 引用地址:STM32串口IAP实验笔记

上一篇:STM32F103移值FreeRtos笔记
下一篇:何谓STM32 定时器的 “COM事件”

推荐阅读最新更新时间:2024-03-16 15:33

技术文章—详解串口转换CAN模块“透明带标识转换”
UART转CAN的应用已广泛应用于各行各业,因此对于数据帧转换的形式要求也逐渐增多,目前主流的转换形式包括透明转换、透明带标识转换以及自定义转换。具体是如何实现?本文将为大家介绍其中的透明带标识转换。 1 . 适用场景 串口转CAN模块在什么时候需要用到呢?一是老产品面临升级,需要用到CAN总线通信,但硬件平台中的MCU没有集成CAN总线的控制器。二是选用的MCU已经包含CAN总线接口,但数量上不能满足项目需求。若出现类似以上两种情况且MCU有闲置串口,则可以选用串口转CAN模块解决。 图1 应用行业 2 . 使用方法 该类模块可以很方便地嵌入到具有UART接口的设备中,在不需改变原有硬件结构的前提下使设
[汽车电子]
技术文章—详解<font color='red'>串口</font>转换CAN模块“透明带标识转换”
STM32 禁用swd-jtag下载口后,重新下载程序的方法
由于工作需要,复用了PA15的时候,程序禁用swd-jtag功能,网上多方查找解决方法。 在重新上电的时候,保证BOOT0为高电平,BOOT1为低电平,即可禁止程序从烧写过的代码启动,这时,重新烧写程序即可。 STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存=芯片内置的Flash。 2)SRAM=芯片内置的RAM区,就是内存啦。 3)系统存储器=芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROROMM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位
[单片机]
FlyMcu串口ISP下载STM32程序教程
开始写之前也是不能用的,但是为了使用,决定边探索怎么使用边写一篇博客! 最开始用过正点原子的开发板进行ISP下载,感觉挺好用,按照说明就好。 但是正点原子的板子用的是如下的一块电路: 这个电路很简单使用,但是如果你不懂,也很纠结,这里感觉有篇帖子写的很详细,可供大家参考,就不自己解释了,链接如下: http://www.51hei.com/bbs/dpj-35947-1.html 但是,很多人会想用一个USB转串口的小模块下载程序,怎么弄呢? 首先有一个小串口模块,注意转换为的电平是3.3V,不是标准的232电平那种的,东西如下 之后呢,将RXD,TXD,GND,VCC缺一不可的连接到你的STM32板子
[单片机]
FlyMcu<font color='red'>串口</font>ISP下载<font color='red'>STM32</font>程序教程
stm32 启动过程
当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择。如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main函数开始执行。但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫“启动文件”,用英文单词来描述是“Bootloader”。 无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都
[单片机]
分享一个STM32菜单框架
相信很多攻城狮都用过液晶屏,想写好一点的ui好像不太可能或且花费很多时间,直接写吧,感觉好像很零碎,coding都怕了。 下面介绍一个简单易用的菜单框架,你会发现它能做多层菜单而且结果清晰。 基本原理: 如上图液晶显示一屏我们定义为一个page,page中的项目定义为i te m;这样page就是item的容器了。当我们选中其中的一个item进去后是不是又是一个page呢,如下图。 这样的话每一个item的下面都对应一个page,这样是不是就构成一个多层的菜单了。 他们是什么关系呢? 一个page中有item,那么用结构体就可以实现啦;item下面又有page,那么在item中加一个page的指针指向item
[单片机]
分享一个<font color='red'>STM32</font>菜单框架
STM32_EXIT中断
今天讲解“STM32F103 EXIT中断”,关于EXIT中断里面有很多学问,以我的工作经验来看,有几点是特别容易犯错的,我会在文章最后重点讲解。 每次讲解的不仅仅是基础,而是重点,不起眼的重点,容易被人忽视的重点。关注微信公众号“EmbeddDeveloper”还有更多精彩等着你。 今天提供并讲解的软件工程,基于前面的软件工程“TIM延时”修改而来。若有疑问,请关注微信公众号获取更多信息。 本着免费分享的原则,将讲解的工程源代码分享给大家,还望看到的朋友分享、关注和推广一下微信公众号,增加一下人气。 每天提供下载的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘。 今天的软件工程下载地
[单片机]
STM32_EXIT中断
STM32 控制lcm液晶ILI9341驱动的液晶驱动程序
/* 选择BANK1-BORSRAM1 连接 TFT,地址范围为0X60000000~0X63FFFFFF * FSMC_A16 接LCD的DC(寄存器/数据选择)脚 * 16 bit = FSMC 对应HADDR * 寄存器基地址 = 0X60000000 * RAM基地址 = 0X60020000 = 0X60000000+2^16*2 = 0X60000000 + 0X20000 = 0X60020000 * 当选择不同的地址线时,地址要重新计算。 */ //#define Bank1_LCD_D ((u32)0x60020000) //Disp Data ADDR //#define Bank1_LCD_C ((u3
[单片机]
STM32学习笔记—DAC基础内容及常见问题
DAC,Digital-to-Analog Converter(数模转换器),DA转换和AD转换有着同样重要的作用,在许多场合都能看到DAC的应用。 今天是第8篇分享,《STM32学习笔记》之DAC基础内容及常见问题。 DA转换器是把数字量转变成模拟量的器件,按模拟量输出类型通常分为:电流和电压输出类型。常见的DAC是电压输出型,在STM32中集成的DAC转换模块为电压输出型数模转换器。 STM32 DAC 基础内容 STM32内部集成的DAC输出通道和功能与型号有关,一般有1到3个通道。 下面结合STM32F4描述一下DAC基本的参数信息: 1. DAC分辨率 分辨率决定了DAC的转换精度,目前STM32内部集成的DA
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved