找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STM32 IAP编程操作入门

[复制链接]
coolice 发表于 2023-8-1 17:03:42 | 显示全部楼层 |阅读模式
所谓IAP,就是在系统编程,也就是说,CPU 在运行的过程中,可以对FLASH 进行刷写.基本的应用可用于写入加密字或者一些存储信息等,高级点的应用则是用于某些使用的设备上,系统查入SD 卡后自动更新程序等.
在stm32f10x_conf.h中开放#include "stm32f10x_flash.h"
  1. #include "STM32Lib\stm32f10x.h"
  2. #include "hal.h"
  3. #define FLASH_ADR 0x08008000  //要写入数据的地址
  4. #define FLASH_DATA 0x8a8a8a8a  //要写入的数据
  5. int main(void)
  6. {
  7. u32 tmp;
  8. ChipHalInit();   //片内硬件初始化
  9. ChipOutHalInit();  //片外硬件初始化

  10. //判断此FLASH是否为空白
  11. tmp=*(vu32*)(FLASH_ADR);
  12. /* 将地址(FLASH_ADR)强制转化为(vu32*)型指针求内容*然后再将值赋给tmp。还是比较考练C语言的,老师上课可从没这么讲过。*/
  13. if(tmp==0xffffffff)
  14. {
  15.    FLASH_Unlock();
  16.    FLASH_ProgramWord(FLASH_ADR,FLASH_DATA);
  17.    FLASH_Lock();
  18.    USART1_Puts("要写入的地址为空,已经写入认证数据"); //在指定地址编写一个字
  19. }
  20. else if(tmp==FLASH_DATA)
  21.      {
  22.        USART1_Puts("地址数据与认证数据符合");
  23.        FLASH_Unlock();
  24.        FLASH_ErasePage(FLASH_ADR);
  25.      /* 和众多 FLASH 存储器的特性类似,STM32 内的FLASH 数据只能由1变成0,如果要由0
  26.       变成1,则需要调用刷除函数,把一个页都刷除掉.如果不擦也能写但是只能写上0*/
  27.        FLASH_ProgramWord(FLASH_ADR,0x11223344);
  28.        FLASH_Lock();
  29.        USART1_Puts("写入了0x11223344");
  30. }
  31. else
  32. {
  33.    USART1_Puts("地址上的数据与认证的数据不符合,有可能是写入失败或者是要写入的地址非空");
  34.    FLASH_Unlock();
  35.    FLASH_ErasePage(FLASH_ADR);
  36.    FLASH_Lock();
  37.    USART1_Puts("已经刷除了要写入的地址");
  38. }
  39. while(1);
  40. }
复制代码
系统通过串口输出写FLASH的状情况,在第一次运行的时候,一般情况, 0x08008000处的FLASH为空,于是系统就往空的FLASH上写入一个数据0x8a8a8a8a.并提示已经写入.此时用
户只要再次复位一下系统,则由于之前已经写入并为系统所读取,则这次串口就会输出已经写入了数据的信息.
注意写FLASH 之前需要调用解锁函数,写入后应调用锁定函数.
562410464018434.jpg
562410474072746.jpg
56241047402791.jpg

闪存的指令和数据访问是通过AHB总线完成的。预取模块是用于通过ICode总线读取指令的。仲裁是作用在闪存接口,并且DCode总线上的数据访问优先。
读访问可以有以下配置选项:
● 等待时间:可以随时更改的用于读取操作的等待状态的数量。
● 预取缓冲区(2个64位):在每一次复位以后被自动打开,由于每个缓冲区的大小(64位)与闪存的带宽相同,因此只通过需一次读闪存的操作即可更新整个缓冲区的内容。由于预取缓冲区的存在,CPU可以工作在更高的主频。CPU每次取指最多为32位的字,取一条指令时,下一条指令已经在缓冲区中等待。
● 半周期:用于功耗优化。
注: 1. 这些选项应与闪存存储器的访问时间一起使用。等待周期体现了系统时钟(SYSCLK)频率与闪存访问时间的关系: 0等待周期,当 0 < SYSCLK < 24MHz 1等待周期,当 24MHz < SYSCLK ≤ 48MHz 2等待周期,当 48MHz < SYSCLK ≤ 72MHz
2 . 半周期配置不能与使用了预分频器的AHB一起使用,时钟系统应该等于HCLK时钟。该特性只能用在时钟频率为8MHz或低于8MHz时,可以直接使用的内部RC振荡器(HSI),或者是主振荡器(HSE),但不能用PLL。
3. 当AHB预分频系数不为1时,必须置预取缓冲区处于开启状态。
4. 只有在系统时钟(SYSCLK)小于24MHz并且没有打开AHB的预分频器(即HCLK必须等于SYSHCLK)时,才能执行预取缓冲器的打开和关闭操作。一般而言,在初始化过程中执行预取缓冲器的打开和关闭操作,这时微控制器的时钟由8MHz的内部RC振荡器(HSI)提供。
5. 使用DMA:DMA在DCode总线上访问闪存存储器,它的优先级比ICode上的取指高。DMA在每次传送完成后具有一个空余的周期。有些指令可以和DMA传输一起执行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-11-21 16:36

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表