zoukankan      html  css  js  c++  java
  • 5.IAP

    一.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程序中均不会触发中断了。所以,一定不能在中断中进行跳转。


                 
                 
        
              
                     

  • 相关阅读:
    字符串转换成整数
    回文字符串判断
    字符串包含
    翻转单词顺序VS左旋转字符串
    穷举子集合
    求S=a+aa+aaa+aaaa+aa...a的值
    数组元素去重
    找最长等差数列的长度
    Git pull and push
    Google 开发console查找元素或方法
  • 原文地址:https://www.cnblogs.com/nyqm/p/7955639.html
Copyright © 2011-2022 走看看