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

2023-10-06 21:58

本文主要是介绍关于STM32 FLASH上运行ecos的内存配置的一点解释,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近很多网友问了关于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_SIZEflash : ORIGIN = 0x08000000, LENGTH = 0x00080000rom   : ORIGIN = 0x64000000, LENGTH = 0x01000000ram   : ORIGIN = 0x68000000, LENGTH = 0x00100000
}SECTIONS
{SECTIONS_BEGINSECTION_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 RCCbase = 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 busbase = 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 Flashbase = 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 SRAMHAL_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 LCDHAL_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

这篇关于关于STM32 FLASH上运行ecos的内存配置的一点解释的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/154115

相关文章

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

CentOS7更改默认SSH端口与配置指南

《CentOS7更改默认SSH端口与配置指南》SSH是Linux服务器远程管理的核心工具,其默认监听端口为22,由于端口22众所周知,这也使得服务器容易受到自动化扫描和暴力破解攻击,本文将系统性地介绍... 目录引言为什么要更改 SSH 默认端口?步骤详解:如何更改 Centos 7 的 SSH 默认端口1

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据