当前位置: 首页 > news >正文

stm32 bootloader写法

  1. bootloader写法:
    1. 假设app的起始地址:0x08020000,则bootloader的范围是0x0800,0000~0x0801,FFFF。
    2. #define APP_ADDR 0x08020000 // 应用程序首地址定义
      typedef void (*APP_FUNC)(void); // 函数指针类型定义
      /*main函数中调用rum_app,进入app程序,其中app_addr是app程序的flash首地址,也就是0x08020000*/
      void run_app(uint32_t app_addr)
      {uint32_t reset_addr = 0;APP_FUNC jump2app;/* 下面的判断语句是说app程序的烧写首地址存放的是SRAM中的栈地址,
      需要判断一下这个站地址是不是在以0x2000,0000为开始地址的SRAM,
      这个地址是stm32的内部RAM首地址。这里意义不大,因为首地址中存放的栈地址,
      是在启动文件中定义,由汇编编译器和链接器生成的不会有错 */if (((*(uint32_t *)app_addr) & 0x2FFE0000) == 0x20000000) // 判断是否是在128k的SRAM里面。{/* 设置栈指针,这是一个内联函数,定义在cmsis_armcc.h中 */          __set_MSP(*(volatile uint32_t *)app_addr); //把app_addr地址中的内容放到站寄存器中/* 获取复位地址 */reset_addr = *(uint32_t *)(app_addr + 4); //app程序入口地址是在0x08020004上jump2app   = (APP_FUNC)reset_addr;__disable_irq();; //hal库中的关所有中断函数jump2app();}
      }

    3.  /* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */   run_app(APP_ADDR);/* USER CODE END 2 *//* Infinite loop */在main中插入上面的代码run_app(APP_ADDR);就行

  2. app写法:
    1.  /* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//*因为在项目启动文件(startup_stm32f401xc.s)中,会先于用户main函数之前,调用中断初始化函数SystemInit(system_stm32f4xx.c文件中),这个函数中有条语句:/* Configure the Vector Table location -------------------------------------*/
      #if defined(USER_VECT_TAB_ADDRESS)SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
      #endif /* USER_VECT_TAB_ADDRESS */其中:VECT_TAB_BASE_ADDRESS =FLASH_BASE=0x0800,0000VECT_TAB_OFFSET = 0这个中断向量表地址是没有跳转的中断向量表地址,所以需要用到下面的语句更换一下。*/SCB ->VTOR = FLASH_BASE | 0x20000;//这里就是app程序的起始地址__enable_irq();  //hal库开所有中断/* USER CODE END SysInit */

http://www.lryc.cn/news/462456.html

相关文章:

  • Unity3D 物体表面水滴效果详解
  • 若依框架中spring security的完整认证流程,及其如何使用自定义用户表进行登录认证,学会轻松实现二开,嘎嘎赚块乾
  • selenium:操作滚动条的方法(8)
  • Discuz | 起尔开发 传奇开服表游戏公益服发布论坛网站插件
  • 问:JAVA对象的数据结构长啥样?
  • STGCN解读(论文+代码)
  • perl读取目录,写入文件
  • JDK-23与JavaFX配置在IDEA中
  • VSCode运行QT界面
  • npm-run-all 使用实践
  • 【CCPC】The 2021 CCPC Guilin Onsite (XXII Open Cup, Grand Prix of EDG) K
  • selenium的实际使用
  • OpenShift 4 - 云原生备份容灾 - Velero 和 OADP 基础篇
  • javaWeb项目-Springboot+vue-校园论坛系统功能介绍
  • centors7升级GLIBC2.18
  • 基于深度学习的异常检测
  • 深入理解 SQL 中的高级数据处理特性:约束、索引和触发器
  • IC验证面试中常问知识点总结(七)附带详细回答!!!
  • 【前端】如何制作一个自己的网页(8)
  • Java之模块化详解
  • HTB:Knife[WriteUP]
  • MOE论文详解(4)-GLaM
  • LeetCode322:零钱兑换
  • 速盾:高防 cdn 提供 cc 防护?
  • 【大数据应用开发】2023年全国职业院校技能大赛赛题第10套
  • 【源码部署】解决SpringBoot无法加载yml文件配置,总是使用8080端口方案
  • 2010年国赛高教杯数学建模B题上海世博会影响力的定量评估解题全过程文档及程序
  • 使用nginx配置静态页面展示
  • [IOI2018] werewolf 狼人(Kruskal重构树 + 主席树)
  • snmpgetnext使用说明