关于STM32 FLASH上运行ecos的内存配置的一点解释

STM32的完整启动流程分析-----在外存flash中运行代码 我用#优快云#这个app发现了有技术含量的博客,小伙伴们求同去《STM32的完整启动流程分析》, 一起来围观吧 https://blog.youkuaiyun.com/Setul/article/details/121685929?utm_source=app&app_version=4.20.0&code=app_1562916241&uLinkId=usr1mkqgl919blen ... 阅读详情

最近很多网友问了关于STM32上运行ecos失败的一些问题,这里简要回答。

1、选择运行方式

cortexm3的ecos,有三种运行方式ram, rom和jtag

ram和jtag是用于调试的,ram方式会把你的执行代码也放到ram中,jtag的代码放在rom中,这个内存模板主要是为了解决jtag连接不上的问题。

rom运行就是我们最后完成项目时候烧入到norflash中运行的方式,代码需要烧入到flash中。

2、完成内存映射

如果你有jlink这样的调试工具,可以直接用rom的方式,调试起来并不复杂。

mlt_cortexm_stm3210e_eval_rom.h

mlt_cortexm_stm3210e_eval_rom.ldi

这两个文件定义了内存布局,下面这个例子是在内部flash中运行的示例文件

// eCos memory layout

#include <pkgconf/hal.h>
#include <cyg/infra/cyg_type.inc>

MEMORY
{
    sram  : ORIGIN = 0x20000000, LENGTH = 0x00010000-CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE
    flash : ORIGIN = 0x08000000, LENGTH = 0x00080000
    rom   : ORIGIN = 0x64000000, LENGTH = 0x01000000
    ram   : ORIGIN = 0x68000000, LENGTH = 0x00100000
}

SECTIONS
{
    SECTIONS_BEGIN
    SECTION_rom_vectors (flash, 0x08000000, LMA_EQ_VMA)
    SECTION_RELOCS (flash, ALIGN (0x8), LMA_EQ_VMA)
    SECTION_text (flash, ALIGN (0x8), LMA_EQ_VMA)
    SECTION_fini (flash, ALIGN (0x8), LMA_EQ_VMA)
    SECTION_rodata (flash, ALIGN (0x8), LMA_EQ_VMA)
    SECTION_rodata1 (flash, ALIGN (0x8), LMA_EQ_VMA)
    SECTION_fixup (flash, ALIGN (0x8), LMA_EQ_VMA)
    SECTION_gcc_except_table (flash, ALIGN (0x8), LMA_EQ_VMA)
    SECTION_eh_frame (flash, ALIGN (0x8), LMA_EQ_VMA)
    SECTION_got (flash, ALIGN (0x8), LMA_EQ_VMA)
    SECTION_sram (sram, 0x20000400, FOLLOWING (.got))
    SECTION_data (ram, 0x68000000, FOLLOWING (.sram))
    SECTION_bss (ram, ALIGN (0x8), LMA_EQ_VMA)
    CYG_LABEL_DEFN(__heap1) = ALIGN (0x8);
    SECTIONS_END
}

hal_vsr_table = 0x20000000;
hal_virtual_vector_table = hal_vsr_table + 128*4;
hal_startup_stack = 0x20000000 + 1024*64;

hal_virtual_vector_table放在内部的sram中,这样有利于中断的快速响应。

3、完成代码中关于内存总线初始化

这部分直观重要,实际上这部分的内容和ecos本身没有关系,是对STM32芯片的外部总线的配置,

设想一下如果你要访问外部的ram,前提当然要设定好响应的芯片引脚和总线读写时序。

 

__externC void hal_system_init( void )
{
    CYG_ADDRESS base;
    
#if defined(CYG_HAL_STARTUP_ROM) | defined(CYG_HAL_STARTUP_SRAM)
    
    // Enable peripheral clocks in RCC

    base = CYGHWR_HAL_STM32_RCC;
    
    HAL_WRITE_UINT32(base+CYGHWR_HAL_STM32_RCC_AHBENR,
                     CYGHWR_HAL_STM32_RCC_AHBENR_FSMC |
                     CYGHWR_HAL_STM32_RCC_AHBENR_FLITF|
                     CYGHWR_HAL_STM32_RCC_AHBENR_SRAM );

    HAL_WRITE_UINT32(base+CYGHWR_HAL_STM32_RCC_APB2ENR,
                     CYGHWR_HAL_STM32_RCC_APB2ENR_IOPA |
                     CYGHWR_HAL_STM32_RCC_APB2ENR_IOPB |
                     CYGHWR_HAL_STM32_RCC_APB2ENR_IOPC |
                     CYGHWR_HAL_STM32_RCC_APB2ENR_IOPD |
                     CYGHWR_HAL_STM32_RCC_APB2ENR_IOPE |
                     CYGHWR_HAL_STM32_RCC_APB2ENR_IOPF |
                     CYGHWR_HAL_STM32_RCC_APB2ENR_IOPG);

    // Set all unused GPIO lines to input with pull down to prevent
    // them floating and annoying any external hardware.

    base = CYGHWR_HAL_STM32_GPIOA;
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRL, 0x88888888 );
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRH, 0x88888888 );
    
    base = CYGHWR_HAL_STM32_GPIOB;
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRL, 0x88888888 );
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRH, 0x88888888 );
    
    base = CYGHWR_HAL_STM32_GPIOC;
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRL, 0x88888888 );
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRH, 0x88888888 );
    
    // Set up GPIO lines for external bus

    base = CYGHWR_HAL_STM32_GPIOD;
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRL, 0x44bb44bb );
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRH, 0xbbbbbbbb );

    base = CYGHWR_HAL_STM32_GPIOE;
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRL, 0xbbbbb4bb );
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRH, 0xbbbbbbbb );

    base = CYGHWR_HAL_STM32_GPIOF;
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRL, 0x44bbbbbb );
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRH, 0xbbbb4444 );

    base = CYGHWR_HAL_STM32_GPIOG;
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRL, 0x44bbbbbb );
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_GPIO_CRH, 0x444b4bb4 );

    
    // Set up FSMC NOR/SRAM bank 2 for NOR Flash

    base = CYGHWR_HAL_STM32_FSMC;

    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_FSMC_BCR2, 0x00001059 );
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_FSMC_BTR2, 0x10000705 );

    // Set up FSMC NOR/SRAM bank 3 for SRAM

    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_FSMC_BCR3, 0x00001011 );
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_FSMC_BTR3, 0x00000200 );

    // Set up FSMC NOR/SRAM bank 4 for TFT LCD

	HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_FSMC_BCR4, 0x00001011 );
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_FSMC_BTR4, 0x00000201 );

#endif

    // Enable flash prefetch buffer and set latency to 2 wait states.
    {
        cyg_uint32 acr;
        
        base = CYGHWR_HAL_STM32_FLASH;

        HAL_READ_UINT32( base+CYGHWR_HAL_STM32_FLASH_ACR, acr );
        acr |= CYGHWR_HAL_STM32_FLASH_ACR_PRFTBE;
        acr |= CYGHWR_HAL_STM32_FLASH_ACR_LATENCY(2);
        HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_FLASH_ACR, acr );
    }
}

 

整个过程,需要先配置内部总线控制器,配置引脚属性,然后就是对外部RAM时序的配置。

 

经过了以上几个过程你的外部RAM才能被ecos启用,这个是ecos启动的必要条件。


Set up FSMC NOR/SRAM bank 3 for SRAM

STM32F407 SPI FLASH存储代码SRAM执行代码 STM32在外部SRAM中运行代码 阅读详情

相关推荐

(失败)尝试将eCOS移植到stm32h743vi上

目录背景过程感受 背景 我的学长在一家有名的AI公司上班,他们希望能将OpenCV移植到一款低成本的CPU上,但他们对于硬件完全不懂,于是学长希望我尝试一下(虽然我那时也还不懂操作系统和CPU间的关系)。选择stm32h743vi这个型号的单片机首先当然是因为他与arm contex-a内核的CPU相比很便宜啦,其次他有DMA2D控制器,说是“专用于图像处理的专业 DMA”,然后片上ROM和RAM都还比较大,就选它了。后来看手册的时候,才发现这个所谓的DMA2D仅仅只能实现对图像的像素点进行修改值操作,并没

奇葩猴的博客 689

代码可在NOR Flash上运行的解释

经常听到程序代码可在NOR Flash上运行,而不能在NAND Flash上运行的说法,关于这个说法容易给人造成误解,因为CPU执行代码分为取指、译码、执行三个步骤,所以真正运行代码的还是CPU,对于NOR Flash可以直接运行代码的说法,指的是CPU可以直接通过地址总线从NOR Flash上完成取指的操作。更深入的理解这个概念,我们先了解以下知识点。 1.FLASH存储器 FLASH ...

智小星的博客 8669

适合STM32的三大嵌入式操作系统

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。 1、μClinux μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux...

weixin_42976659的博客 3035

基于MM32实现NOR FLASH运行应用程序的过程解析

但同时带来的就是代码的阅读理解变得有些困难;结合第一小结,一般MCU自带的下载算法只是将程序下载到自身内部的FLASH存储空间,如果需要将程序下载到外扩的NOR FLASH,我们可以使用烧录工具,将程序烧录进NOR FLASH,但在开发调试过程中,这显然不太方便,所以我们就需要自行编写下载算法,来实现MM32与NOR FLASH之间的程序编程。因为下载算法运行的程序不能够实现的在线调试,所以对于NOR FLASH操作的这些函数功能,最好在其它工程上先进行验证,确认功能正常后,再移植到下载算法的工程当中来。

ic2121的博客 470

剖析适合STM32的五种嵌入式操作系统的优缺点

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。 1、μClinux μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux...

chao961015的博客 4437

STM32开发中五大嵌入式操作系统对比与选型指南

嵌入式操作系统是资源受限设备开发的核心技术,通过任务调度、内存管理和通信机制实现高效系统控制。其工作原理基于实时内核设计,在STM32等微控制器上需要平衡内核体积、实时响应和功能完整性三大维度。这类系统在工业控制、物联网网关等场景具有关键价值,能显著提升开发效率和可靠性。针对STM32平台,主流的μClinux、μC/OS-II、eCos、FreeRTOS和RT-Thread各具特色:μClinux适合网络应用但内存需求大,μC/OS-II以实时性见长,FreeRTOS生态丰富,RT-Thread则内置完整

weixin_42524703的博客 278

stm32中用到的实时系统_基于STM32平台的实时操作系统

基于STM32平台且满足实时控制要求操作系统,有以下5种可供移植选择,分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。1、μClinuxμClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux...

weixin_36433730的博客 1669

ecos+stm32f207+lcd320x240移植

ecos+stm32f207+lcd320x240移植

基于STM32平台的实时操作系统

基于STM32平台且满足实时控制要求操作系统,有以下5种可供移植选择,分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。 下面分别介绍这五种嵌入式操作系统的特点及不足。 1、μClinux μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linu...

Leon的博客 1007

虚拟零售智能客服架构设计:如何用大模型实现多轮对话与精准推荐?

想象一下,当你在一个电商平台购物时,遇到了一个能像你的专属导购一样,不仅能听懂你模糊的需求(“我想买一件适合夏天去海边玩,又能兼顾日常通勤的裙子”),还能记得你之前提到的尺码偏好和预算,甚至在你犹豫时,主动推荐几款符合你风格且正好有促销活动的商品——这不再是科幻电影中的场景,而是基于大语言模型(LLM)技术的新一代虚拟零售智能客服能够提供的体验。这一层是我们架构设计的重点,会在后续章节详细展开。如基于CRF、RNN的模型,或基于规则的状态更新,通常需要大量标注的对话状态数据,且对新领域、新槽位的适应性差。

Java大师兄的博客 1589

BODAS说明书的中文版与相关资料总结

花了三天时间配了控制器的接线口,找了软件安装的一套东西。 又花了一周时间零零散散在网上只找到关于控制器少得可怜的资料: 1.力士乐控制器RC6系列介绍 2.力士乐控制器手册不完整版 3.RC6-9程序下载 力士乐配套的只有德语和英语两版,人工翻译专业文件的价格太惊人,决定自己写一版方便大家。有不正之处欢迎指出。 For these controllers, in the event of an...

我的技术日常 6495

STM32开发中的五大嵌入式系统

技术往往更新得非常快,并且总是让我们觉得学起来有难度而且有些迷茫。不过没有关系我们发烧友专注于在快乐中学习,要学习STM32,我们首先了解下五大嵌入式操作系统:μClinux、μC/OS-II、eCos、FreeRTOS和RT-thread。 μClinux μClinux是一种优秀的嵌入式Linux版本,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持...

东川 1023

3D医学影像分割实战:从数据预处理到模型训练全流程解析

本文详细解析了3D医学影像分割的全流程,从数据预处理到模型训练,重点介绍了nnUNet框架的应用技巧。通过实战案例,帮助开发者掌握如何处理复杂的.nii.gz文件格式、优化数据预处理流程以及高效训练3D分割模型,特别适合医学影像分析领域的从业者参考。

weixin_29098367的博客 223

stm32中用到的实时系统_适合STM32的三大嵌入式操作系统

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。基于STM32-WiFi智能小车机器人开发实战_嵌入式-创客学院​www.makeru.com.cn1、μClinuxμClinux是一种优秀的嵌入式Linux版本,其全称为micro-co...

weixin_33321740的博客 571

MMRotate 详细使用教程

MMRotate 详细使用教程 做旋转目标检测,怎么可以不知道如何使用MMRotate呢! github链接: https://github.com/open-mmlab/mmrotate 1 安装 创建虚拟环境并激活 conda create -n mmrotate python=3.7 -y conda activate mmrotate 安装 PyTorch 和 torchvision conda install pytorch torchvision -c pytorch 注意:确保

Sylvia_Lan的博客 1万+

9.20华为OD机试真题 新系统 - 简单URL 路径提取器 (Java/Py/C/C++/Js/Go)

9.20华为OD机试真题 新系统 - 简单URL 路径提取器 (Java/Py/C/C++/Js/Go)

算法大师! 348

用STM32做开发,这5个嵌入式系统供选择!

基于STM32平台且满足实时控制要求操作系统,有以下5种可供移植选择,分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下...

919

【DRAM存储器十五】DDR介绍-关键技术之DLL和prefetch

详述DDR DLL和预取原理以及几个DDR相对初代SDRAM新增的时序参数

highman110的博客 4368

stm32中用到的实时系统_适合STM32的三大嵌入式操作系统。

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。1、μClinuxμClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内...

weixin_29209805的博客 764

嵌入式软考必备知识点:嵌入式系统开发中的重要概念和示例代码

在嵌入式软考中,有一些重要的知识点需要掌握,包括嵌入式系统的基本概念、编程语言、实时操作系统和硬件接口等。实时操作系统是一种专门设计用于嵌入式系统的操作系统,可以提供对任务调度、中断处理和资源管理等方面的支持。GPIO(通用输入输出):GPIO是嵌入式系统中常用的硬件接口,用于连接外部设备和嵌入式系统。以上是嵌入式软考中的一些必备知识点,包括嵌入式系统的基本概念、编程语言、实时操作系统和硬件接口。通过配置串口的波特率、数据位数和校验位等参数,可以实现与其他设备的可靠通信。一、嵌入式系统的基本概念。

PixeGO的博客 314

k230+CanMV+micropython环境下byte、int、hex、string之间的转换常用函数实测

【代码】k230+CanMV+micropython环境下byte、int、hex、string之间的转换常用函数实测。

weixin_47446386的博客 119

64位 内存占用大 嵌入式_适合STM32的三大嵌入式操作系统

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。基于STM32-WiFi智能小车机器人开发实战_嵌入式-创客学院​www.makeru.com.cn1、μClinuxμClinux是一种优秀的嵌入式Linux版本,其全称为micro-co...

weixin_39642998的博客 186

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 如何自动修改 Mentor Expedation 7.9 的中心符号库
下一篇: for(;;) 和 while (1)
知秋一叶
博客等级 码龄19年 196粉丝 68原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值