一.Flash与时钟系统的关系
        
    STM32系统时钟:
                 HSE 高速外部时钟,电路上焊接的外部时钟,一般是4Mhz-16Mhz,板子上的是8Mhz -->是外接的晶振,耗能高于内部,但准确度也高
                 LSE 低速外部时钟,电路板上焊接的外部时钟,32.768Khz,用于RTC
                 HSI 高速内部时钟,STM32内部的时钟,默认为8Mhz  -->是单片机内部的RC振荡电路     
                 LSI 低速内部时钟  40KHz,用于内部看门狗。
                 STM32的时钟选择在启动文件中进行选择。复位后使用HSI,并且SW,HPRE,PPRE1,PPRE2,ADCPRE,MCO bit被设置。时钟频率高会增加功耗,
             而且抗干扰能力会降低。
   STM32FLASH操作说明:
      STM32的存储器由三个部分组成。主存储器/信息块/闪存存储器寄存器接口。
                主存储器:地址由0x080 00000~0x80 40000的大小(256KB,每页2K,共128页)。当BOOT0/BOOT1接地时,由此启动程序。
                信息块  : 用于存放ST自带的 启动程序,用于串口下载程序,当BOOT0接3.3V BOOT1接GND时将由此启动程序。
                
   ****************************************************************************************************************************          
   *程序异常/调试状况及原因分析:*             
   ***************************
            **当开启外部时钟,关闭内部时钟时,操作Flash时会导致程序在FLASH_WaitForLastBank1Operation()等待操作同步时进入HardFault。
            **当时系统时钟频率设置为 72Mhz时,需要相应设置 FLASH_SetLatency()的等待周期为2。 Flash的操作频率不超过24Mhz。
            **系统关闭HSI内部时钟,导致操作Flash出现错误?

    在官方提供的闪存编程手册中,有如下规定:进行闪存编程操作时(写或擦除),必须打开内部的RC振荡器(HSI)。因为flash的读写需要HSI提供内部时钟。
 
 二、IAP编程说明
        一般程序的下载方式有三种:ICP ISP IAP。
        
        IAP编程的核心是单片机内部含有可重复编程闪存控制器,拥有丰富的外设接口。
        
        关键操作 : 1.设置应用程序在闪存的位置,通过IDE进行修改。
                   2. 设置应用程序的中断向量表的偏移位置,通过库函数或者寄存器进行修改。
                   3.设置跳转程序。
 
三、IAP调试 说明
              -->调试错误:
                   gpio的rcc时钟未开启,导致程序不能正常运行--->键盘不能正常工作。
              IAP跳转程序的原理:
                   BootLoader:用于接收更新的APP程序,且跳转到APP程序。
                   通过修改APP程序的中断向量表,确定APP程序的Reset Handler地址。在BootLoader程序里,将APP程序写到STM32内部的Flash固定地址,
               读取APP程序中断向量表的复位地址,即通过操作指针的方式 *(vu32*)Flash_ResetHandler_Addr,读取Flash地址上的值,且初始化APP程序
               的堆栈指针,代码区的第一个地址用于存放栈顶地址。
              
              --> 调试出现错误:
                      读取Flash上复位地址的值出现错误,查找错误原因:既然是读取Flash上的值不正确,可能由以下几个方面问题
                      (1).通过串口接收数据出现异常。通过比对接收的数据buff【】和相应Bin文件内容,证明串口收发正常。则考虑下面因素。
                      (2).串口接收数据正常,读写Flash数据出现错误。
                           1.读数据出现错误:读取一个flash上确定的值,发现正常,证明读操作正常。
                           2.写数据出现错误:因为Flash写操作能正常运行,则证明是Iap整体写flash操作出现错误。
           经最终排查,因为写flash时地址操作出现错误,导致程序不能写入正确地址,所以读到的数据便是错误的。
           要根据现象一步步排查原因,确定的原因没必要反复验证!!!

    

 注意事项:

    由IAP程序跳转到APP程序不能正常执行中断程序的原因:

    ①程序间的相互跳转只是改变程序计数器PC指针的位置,再修改中断向量表的位置使CPU在发生硬件中断时重映射到相应的位置执行另一套中断服务程序。不会改变

  已经设置的寄存器的值,所以已经开启的中断会导致APP程序中的程序无法正常进行中断。

    解决办法:①使能所有已开中断 ②复位时钟 ③复位IO口及关闭总中断

     ②在IAP程序的中断中,如在串口中断中执行跳转命令,无论如何修改,在APP程序中均不会触发中断了。所以,一定不能在中断中进行跳转。

5.IAP - FLASH的更多相关文章

  1. LPC43xx系列使用IAP的注意事项

    LPC43xx系列使用IAP的注意事项 Tags: LPC43xx IAP 单片机 LPC43xx IAP函数的调用 一般MCU的IAP是,厂商固化一段代码在芯片的某个区域,然后告诉你这个代码的入口地 ...

  2. 关于STM32的FLASH操作【转载】

    说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置.芯片ID.自举程序等等.当然, FLASH还可以用来装数据. FLASH分 ...

  3. LPC18xx LPC43xx LPC4370 Bootrom USB DFU FPB - Flash Patch and Breakpoint Unit

    What is the difference between a Bootrom vs bootloader on ARM systems Bootrom Bootrom (or Boot ROM) ...

  4. stm32——Flash读写

    stm32——Flash读写 一.Flash简介 通过对stm32内部的flash的读写可以实现对stm32的编程操作. stm32的内置可编程Flash在许多场合具有十分重要的意义.如其支持ICP( ...

  5. TCP/IP协议学习(一) LWIP实现网络远程IAP下载更新

    最近需要实现通过TCP/IP远程IAP在线更新功能,忙了2周终于在原有嵌入式服务器的基础上实现了该功能,这里就记录下实现的过程. IAP又称在应用编程,其实说简单点就是实现不需要jlink,仅通过芯片 ...

  6. stm32 IAP + APP ==>双剑合一

    (扩展-IAP主要用于产品出厂后应用程序的更新作用,上一篇博文详细的对IAP 升级程序做了详细的分析http://blog.csdn.net/yx_l128125/article/details/12 ...

  7. ISP与IAP的区别

    转: ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程.IAP ...

  8. IAP升级功能编写初期的一些困惑与疑问---完毕功能后的总结

    IAP的源代码等资料我上传了,压缩包内有12个文件,,http://download.csdn.net/detail/f907279313/7524849(要积分的辛苦收集的你们就给点积分吧) 还有还 ...

  9. 在bootloader及IAP中使用zlib解压缩

    原有的bootloader方案是在片内FLASH上面分成3块,bootloader区占一小块,然后剩下区域平分成两块,一块是运行区,一块是新固件临时存储区. 好在现在FLASH在系统成本中占的比例越来 ...

随机推荐

  1. 『TensorFlow』网络操作API_上

    简书翻译原文 卷积层 卷积操作是使用一个二维的卷积核在一个批处理的图片上进行不断扫描.具体操作是将一个卷积核在每张图片上按照一个合适的尺寸在每个通道上面进行扫描.为了达到好的卷积效率,需要在不同的通道 ...

  2. jquery 获取表单的内容以JSON对象形式返回

    添加一个serializeJson方法 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&quo ...

  3. day19_python_1124

    .01 昨日内容回顾 面向对象:1,将一些相似功能的函数集合到一起 类:具有相同属性和功能的一类事物. 对象:类的具体体现. 2,站在上帝的角度考虑问题,类就是一个公共模板, 类的结构: class ...

  4. Debian/Ubuntu/Deepin下AndroidStudio2/3打开AVD模拟器无反应

    Debian系AS无法启动模拟器 问题描述 早在半年前将开发环境从windows迁移到了Linux:当时用的是Debian系统,也是在安装完成AndroidStudio之后无法开启模拟器,也没出现什么 ...

  5. shell读取mysql数据库

    select_sql="select value from glpi_configs where name='version' " db_data=`mysql -h $host ...

  6. GDT临时分段

    GDT临时分段 GDT临时段说明 现在已经进入了保护模式, 目前的改变 可以访问1M以上的内存了 可以使用32位的指令操作 问题: 由于以前的是实式下段寄存器寻址方式无法使用了,我们必须切换到使用GD ...

  7. Django--filter(**kwargs)

    Django--filter(**kwargs)-exclude(**kwargs) filter() 说明: 数据的过滤 返回Queryset包含与给定查找参数匹配的新对象.这里需要特别注意的地方就 ...

  8. apache 与 php-fpm 几种处理方式

    目录 1.SetHandler 2.ProxyPassMatch 3.ProxyPass 1.SetHandler 在apache配置文件只部署一次 需要Apache 2.4.9以上才行 ip:por ...

  9. 你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?

    大O符号表示当数据结构的元素增加的时候,算法规模或者性能在最坏场景下有多好. 大O符号也可以用来描述其他行为,比如说内存消耗.因为集合实际上就是一种数据结构,我们一般用大O符号基于时间.性能.内存消耗 ...

  10. 博弈论:寻找先手必胜策略——Grundy值

    选修了人工智能课程,老师布置了调研任务:Grundy,开始看了一些资料并没有看懂. 后来找到了一篇文,写的很棒,里面有好多博弈相关的问题与分析,分享出来给大家: http://endless.logd ...