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

art-pi2 上手记录(二)

功能比较庞杂,写得不好,抛砖引玉

预备知识

stm32 默认从主闪存0x08000000启动

art-pi2的psram 映射0x90000000

art-pi2的8线ospi flash 映射0x70000000

  • stm32h7比较灵活,通过修改选项字节,可以实现从

    0x0000 0000 到 0x3FFF 0000 地址进行启动,这里不展开,感兴趣参考:【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!

  • stm32h7r系列内部flash只有64k,支持在外部flash上xip运行代码

内存映射原理

将内核对地址的访问操作转为对ospi/xspi总线的操作,需要内核支持且外设配置进入内存映射模式(初始化),进入内存映射模式后就可以xip运行代码;可以类比fsmc对扩展sdram的操作

下载算法flash loader

下载算法大致原理为调试器通过jtag/swd将一小段可执行程序传输到板子的ram,并通过jtag/swd调用其中的init、erase、read、write等函数,以操作内部/外部flash;原理参考下图:

  • flm/stldr格式本质也是elf可执行程序,不含main程序;.stldr可以导出给cubeprogram等软件使用,studio的APP工程也有使用;keil的下载算法格式为.flm

screenshot_image-20250521145342-kipjmk7.png

下载和运行流程

通过stlink下载app的流程:swd传输下载算法,将用户app的elf写入0x70000000然后重启,由bl完成剩余操作

运行流程:从0x08000000启动bl,初始化psram和外部flash,进行内存映射HAL_XSPI_MemoryMapped;跳转到0x70000000(外部flash映射后的地址),开始XIP运行

app下载到外部flash需要设置下载算法(默认已配好):

  • 注意下载算法运行在ram中,仅操作外部flash,不能替代bootloader,不能完成上电到跳转app的过程
  • 也可以使用stm32 cubeprogram下载,支持回读外部flash的内容

bootloader工程

在studio中新建工程,选择基于开发板/art-pi2/示例工程/art_pi2_bootloader

在main中完成了外部flash和psram的初始化,并进入xip模式;

随后跳转到外部flash运行app程序;比较常规

int main(void)
{MX_FLASH_Init();EXTMEM_Init();EXTMEM_Flash_Probe();EXTMEM_PSRAM_Probe();EXTMEM_Flash_EnterXIP();EXTMEM_PSRAM_EnterXIP();rt_kprintf("\nJump to APP...\n");rt_hw_interrupt_disable();JumpToApplication();return RT_EOK;
}
#define APPLICATION_ADDRESS XSPI2_BASE  //(uint32_t)0x70000000int JumpToApplication(void)
{typedef void (*pFunction)(void);pFunction JumpToApp;uint32_t Application_vector;/* Suspend SysTick */SysTick->CTRL = 0;/* Disable I-Cache---------------------------------------------------------*/SCB_DisableICache();  //TODO SCB_Disables Cache and jump success/* Disable D-Cache---------------------------------------------------------*/SCB_DisableDCache();/* Apply offsets for image location and vector table offset *///  Application_vector += EXTMEM_XIP_IMAGE_OFFSET + EXTMEM_HEADER_OFFSET;Application_vector = APPLICATION_ADDRESS;SCB->VTOR = (uint32_t)Application_vector;JumpToApp = (pFunction)(*(__IO uint32_t *)(Application_vector + 4u));__set_MSP(*(__IO uint32_t *)Application_vector);__set_CONTROL(0);JumpToApp();return 0;
}
  • 注意:bootloader工程这里选择全片擦除,扇区擦除可能无法烧写

screenshot_image-20250524093549-zwylnzn.png

app示例工程

art_pi2_blink_led

重点看看链接脚本lds文件,text段放在了QFLASH中,如下图,链接时会将代码链接到外部flash中

在这里插入图片描述

程序中注意重定向中断向量表,然后就可以愉快地写应用了~

#define XSPI2_BASE                      0x70000000UL  /*!< XSPI2 base address */
static int vtor_config(void)
{/* Vector Table Relocation in Internal XSPI2_BASE */SCB->VTOR = XSPI2_BASE; return 0;
}
INIT_BOARD_EXPORT(vtor_config);

  • 下载算法配置:ART-Pi2_ST_winbond_64MB.stldr

在这里插入图片描述

补充

  • 对裸机感兴趣的可以看看 @lizimu2020 的仓库 https://gitee.com/lizimu2020/ART_Pi2

  • 对于全片跑在sram方案(章节7/8 RT-Thread-ART-Pi2移植CMSIS-DAP(基于CherryUSB协议栈)RT-Thread问答社区 - RT-Thread ),如果无需频繁修改bootloader程序(固定跑在0x70000000的外置flash上,仅做应用开发),使用默认bootloader即可

http://www.xdnf.cn/news/12444.html

相关文章:

  • ㊗️高考加油
  • Linux驱动学习day2
  • Python——day46通道注意力(SE注意力)
  • EM储能网关ZWS智慧储能云应用(11) — 一级架构主从架构
  • Pycharm中添加不了新建的Conda环境(此篇专门给Daidai写的)
  • 【Linux】文件操作
  • 大数据学习(132)-HIve数据分析
  • VMware 安装 CentOS8详细教程 (附步骤截图)附连接公网、虚拟机yum源等系统配置
  • 【各种主流消息队列(MQ)对比指南】
  • Appium+python自动化(十)- 元素定位
  • 消息队列高级特性与原理:解锁分布式系统的底层逻辑
  • springcloud SpringAmqp消息队列 简单使用
  • Semaphore - 信号量
  • JavaScript 中的单例内置对象:Global 与 Math 的深度解析
  • 护网行动面试试题(1)
  • 【芯片设计- RTL 数字逻辑设计入门 4.2 -- 组合逻辑赋值 + 时序逻辑状态保持】
  • 电脑要不要经常更新系统
  • SpringBoot自动配置原理深度解析
  • JAVA毕业设计224—基于Java+Springboot+vue的家政服务系统(源代码+数据库)
  • JS实现OSS断点续传
  • 第二届智慧教育与计算机技术国际学术会议(IECT 2025)
  • 抢占2025短剧风口!专业短剧系统开发,打造您的爆款内容平台
  • vm+ubuntu24.04扩展磁盘
  • [环境搭建篇] Windows家庭版如何安装Docker工具
  • 5.3 Spring Boot整合JPA
  • IoT/HCIP实验-4/单片机基础实验(LCD/LED/按键操作/GPIO/EXTI中断服务)
  • 深入理解 Linux 进程控制
  • Vue 3 Teleport 实战:优雅实现模态框、通知和全局组件
  • CMake GLOB返回路径规则及示例
  • 什么是零镜头泛化(Zero-Shot Generalization)