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

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

什么是 Flash Attention

Flash Attention 是 由 Tri Dao 和 Dan Fu 等人在2022年的论文 FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 中 提出的, 论文可以从 https://arxiv.org/abs/2205.14135 页面下载,点击 View PDF 就可以下载。 下面我