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实验笔记的更多相关文章

  1. STM32串口IAP分享

    什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通 ...

  2. stm32串口通信实验,一点笔记

    第一次深入学习stm32,花了好长时间才看懂代码(主要是C语言学习不够深入),又花了段时间自己敲了一遍,然后比对教程,了解了利用中断来串口通信的设置方法. 板子是探索版f407,本实验工程把正点原子库 ...

  3. STM32F407 串口通信实验 视频第27节 个人笔记

    前言 第26节也是串口,笔记链接在此:https://www.cnblogs.com/YuQiao0303/p/10019362.html github地址:https://github.com/Yu ...

  4. stm32寄存器版学习笔记02 串口通信

    stm32F103RCT6提供5路串口.串口的使用,只要开启串口时钟,设置相应的I/O口的模式,然后配置下波特率.数据位长度.奇偶校验等信息,即可使用. 1.串口的配置步骤 ①串口时钟使能 APB2外 ...

  5. STM32 HAL库 UART 串口读写功能笔记

    https://www.cnblogs.com/Mysterious/p/4804188.html STM32L0 HAL库 UART 串口读写功能 串口发送功能: uint8_t TxData[10 ...

  6. STM32的IAP方案

    from:   http://bbs.eeworld.com.cn/thread-294115-1-1.html 几乎所有的同类书籍都介绍综合性的应用示例如“万年历 + 温度显示 + 闹钟响铃 + 计 ...

  7. STM32的IAP实现

    STM32的IAP实现 2014年07月28日 16:31:06 Stylesen 阅读数:556   IAP,全称是“In-Application Programming”,中文解释为“在程序中编程 ...

  8. STM32F103/429串口IAP+Ymodem升级

    起因: 串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转.但是这种方法在实 ...

  9. stm32寄存器版学习笔记07 ADC

    STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...

随机推荐

  1. 3736 【HR】万花丛中2

    3736 [HR]万花丛中2  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description HR神犇在成功攻略ZX后,花心 ...

  2. audio_device模块分析

    1. 对外接口      AudioDeviceModule, 採音放音接口,音量控制,静音控制等       2. 主要类      AudioDeviceModuleImpl, 对外提供的主要实现 ...

  3. 【转】SDK、JDK、JRE、JVM、JDT、CDT等之间的区别与联系 .

    相信大多数java初学者被这些概念搞蒙过,它们之间到底有什么区别,又有什么联系呢?下面我将一一解开大家心中的谜团. 首先,给大家解释一下这些概念: 1.SDK(Software DevelopKit, ...

  4. P4280 [AHOI2008]逆序对

    传送门 有一个不会证明的贪心:从左到右考虑每一个位置,然后在每一个位置都贪心选取能让该位置构成的逆序对最少的数.判断逆序对的话只要记一下前缀小于等于某数的总数和后缀小于等于某数的总数就行了 //min ...

  5. 你真的知道GET和POST两种基本请求方法的区别吗?

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  6. Java使用Cipher类实现加密,包括DES,DES3,AES和RSA加密

    一.先看一个简单加密,解密实现 1.1 加密 /** * content: 加密内容 * slatKey: 加密的盐,16位字符串 * vectorKey: 加密的向量,16位字符串 */ publi ...

  7. zb的生日-------搜索 和 动态规划

    简单的贪心算法 : http://love-oriented.com/pack/P01.html  说实话 我是喜欢 动态规划的.......但是省赛迫在眉睫 , 只好先 学 搜索了  ,  赶紧   ...

  8. 属性字符串(NSAttributedString)的简单应用

    属性字符串NSAttributedString 可以对字符串附加格式信息,由于对于对不同文本片段使用不同的格式,属性字符串类特别合适. IOS 6中对样式文本有了大改善,大部分主要的UIKit控件都允 ...

  9. ArcGIS Android工程迁移到其他电脑不能打开的问题

    问题描述:当我把已经做好的ArcGIS Android工程想在其他电脑运行时,总是会提示报错.而报错的地方,正是出现在下面这条语句上. compile 'com.esri.arcgisruntime: ...

  10. 探索java世界中的日志奥秘

                    java日志简单介绍 对于一个应用程序来说日志记录是必不可少的一部分.线上问题追踪,基于日志的业务逻辑统计分析等都离不日志.JAVA领域存在多种日志框架,目前常用的日志 ...