关于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

相关文章

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

mysql5.7.15winx64配置全过程

《mysql5.7.15winx64配置全过程》文章详细介绍了MySQL5.7.15免安装版的配置步骤,包括解压安装包、设置环境变量、修改配置文件、初始化数据目录、安装服务、启动数据库、登录及密码修改... 目录前言一、首先下载安装包二、安android装步骤1.第一步解压文件2.配置环境变量3.复制my-

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

Conda国内镜像源及配置过程

《Conda国内镜像源及配置过程》文章介绍Conda镜像源使用方法,涵盖临时指定单个/多个源、永久配置及恢复默认设置,同时说明main(官方稳定)、free(逐渐弃用)、conda-forge(社区更... 目录一、Conda国内镜像源二、Conda临时使用镜像源指定单个源临时指定多个源创建环境时临时指定源

MySQL配置多主复制的实现步骤

《MySQL配置多主复制的实现步骤》多主复制是一种允许多个MySQL服务器同时接受写操作的复制方式,本文就来介绍一下MySQL配置多主复制的实现步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 环境准备2. 配置每台服务器2.1 修改每台服务器的配置文件3. 安装和配置插件4. 启动组复制4.

通过配置nginx访问服务器静态资源的过程

《通过配置nginx访问服务器静态资源的过程》文章介绍了图片存储路径设置、Nginx服务器配置及通过http://192.168.206.170:8007/a.png访问图片的方法,涵盖图片管理与服务... 目录1.图片存储路径2.nginx配置3.访问图片方式总结1.图片存储路径2.nginx配置

nginx配置错误日志的实现步骤

《nginx配置错误日志的实现步骤》配置nginx代理过程中,如果出现错误,需要看日志,可以把nginx日志配置出来,以便快速定位日志问题,下面就来介绍一下nginx配置错误日志的实现步骤,感兴趣的可... 目录前言nginx配置错误日志总结前言在配置nginx代理过程中,如果出现错误,需要看日志,可以把

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底