Nuttx外扩SDRAM(IS42)

本文详细介绍了如何在Nuttx操作系统中扩展STM32的SDRAM内存,包括理解板载内存限制、熟悉SDRAM的内部规格和硬件接口,以及在Nuttx下配置FMC驱动和编译选项的过程,最终成功增加外扩内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

Nuttx当中有很多系统的组件都会用到内存中堆(heap)的资源,在终端上通过键入“free”指令可以查看到当前内存中活动的用户堆的实时用量,当应用在需要大量的堆开销的情况下,本身芯片内部集成的小容量内存就显得捉襟见肘了(我使用过MCU目前最大的内存容量也就是128KB+16KB+368KB =512KB);估计有疑问说为什么是3块,再移植前,我们先来捋一捋一些基础知识。

板载内存

日常中接触到的cortex-M4及其一下系列内核的单片机,一般在内存上大都是一块内存,我接触到最多的ST的单片机一般规格多为“32KB、64KB、256KB、320KB”等等,这里的内存就是我们所说的sram。例如下图:
STM32F3系列的内存大小
但是在F7系列上确实这样内存变成了512KB+16KB:
在这里插入图片描述
这个是因为在F7系列上sram还分为了ITCM和DTCM(TCM=Tightly Coupled Memory,是一种高速缓存,据说是被直接集成在CPU芯片中。DS有两种TCM,分别是ITCM(Instruction TCM)和DTCM(Data TCM)。由于是高速缓存,所以这两块内存区域被当做特殊的用途。比如某些对时间要求非常严格的代码,就可以被放到ITCM中执行。这可以有效地提高运行速度。某些需要频繁存取的数据,也可以放到DTCM中以节省存取时间。)
DTCM所处的位置

外扩内存

既然板载的内存不够用,外扩的内存怎么加呢?这里就需要用到Flexible memory controller (FMC),来实现外扩内存。首先需要确定外扩的SDRAM的规格和接口类型;

- 内部规格

SDRAM内部包含的存储阵列,可以把它理解成一张表格,数据就填在这张表格上。和表格查找一样,指定一个行地址和列地址,就可以精确地找到目标单元格,这是SDRAM芯片寻址的基本原理。这样的每个单元格被称为存储单元,而这样的表则被称为存储阵列(Bank),目前设计的SDRAM芯片基本上内部都包含有4个这样的Bank,寻址时指定Bank号以及行地址,然后再指定列地址即可寻找到目标存储单元。所及行地址、列地址以及bank数基本就决定了我们SDRAM的大小了。
在这里插入图片描述

- 硬件接口
大概了解了SDRAM的内部结构,接下来看看常见的SDRAM的硬件接口:

  1. CLK,同步时钟信号,所有输入信号都在CLK为上升沿的时候被采集;
  2. CKE,时钟使能信号,禁止时钟信号时SDRAM会启动自刷新操作;
  3. CS,片选信号,低电平有效;
  4. CAS#,列地址选通,为低电平时地址线表示的是列地址;
  5. RAS#,行地址选通,为低电平时地址线表示的是行地址;
  6. WE#,写入使能,低电平有效;
  7. DQM[0:1],数据输入/输出掩码信号,表示DQ信号线的有效部分;
  8. BA[0:1],Bank地址输入,选择要控制的Bank;
  9. A[0:11],地址输入;
  10. DQ[0:15],数据输入输出信号 ;(同种IC有16bits、32bits位宽等多种规格)
    具体的时序可以参考对应使用的芯片使用手册;

Nuttx下的外扩SDRAM接口

与一般的驱动不一样的是,Nuttx下外扩SDRAM直接就挂在地址总线上了,以本次移植为例,采用STM32F746系列的单片机;

- 外设驱动FMC
在配置的板子的src文件下比如我的板子是stm32f746g-disco,找到stm32_extmem.c文件<…/nuttx/configs/stm32f746g-disco/src>

/************************************************************************************
 * configs/stm32f746g-disco/src/stm32_extmem.c
 *
 *   Copyright (C) 2018 Marcin Wyrwas. All rights reserved.
 *   Author: Marcin Wyrwas <mvp1@wp.pl>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, thi
04-11
### 关于 NuttX RTOS 的详细介绍 NuttX 是一种成熟的嵌入式实时操作系统(RTOS),具有类 Linux 的完整性和强大的嵌入式实时性能,能够很好地填补传统 RTOS 与 Linux 之间的空白[^3]。它的设计使得即使是在资源受限的环境中也能实现复杂的系统功能,比如网络支持和图形界面。 #### 构建与使用入门 NuttX 提供了一个详细的快速启动指南来帮助开发者熟悉其基本操作流程[^1]。该文档涵盖了从安装必要的工具链到配置、编译以及运行第一个项目的全过程。具体来说: - **安装依赖项**: 开发者需按照官方指引完成开发环境搭建,这通常涉及 GNU 工具链和其他必要软件包的设置[^5]。 - **源码获取**: 用户可以从 Apache 官方网站或者镜像站点下载最新稳定版代码库[^4]。例如通过 Git 克隆仓库 `https://gitcode.com/gh_mirrors/nu/nuttx` 即可获得完整的项目结构[^2]。 - **构建过程**: 利用 Makefile 文件定义的一系列规则,在顶级目录 $(TOPDIR) 中执行命令即可触发整个系统的组装工作流[^1]。典型的操作可能如下所示: ```bash make menuconfig make all ``` #### 功能模块概览 除了基础内核NuttX 还提供了丰富的组件集合用于满足不同应用场景的需求。其中包括但不限于文件系统接口、设备驱动框架以及 POSIX API 支持等功能集[^4]。 #### 社区交流渠道 为了促进技术分享并解决实际遇到的各种难题,围绕着这个开源项目形成了活跃的社区氛围。无论是初学者还是资深工程师都能从中受益匪浅。可以通过加入邮件列表等方式参与讨论[^4]。 --- ### 示例代码片段展示如何简单验证 NuttX 是否正常运作 下面给出一段简单的测试程序用来确认基本硬件交互能力是否完好无损: ```c #include <stdio.h> int main(void){ printf("Hello from NuttX!\n"); return 0; } ``` 此 C 程序当被成功加载至目标板卡之后将会打印字符串消息表明环境初始化完毕并且可以继续深入探索其他高级特性了。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值