硬件上内存的分配问题(以STM32F429IGT6为例子)

本文深入探讨了嵌入式系统中的内存分类,包括堆、栈、SRAM、Flash及SDRAM的功能与应用。详细讲解了各类内存的特点,如SRAM用于存放全局变量,Flash适合程序代码存储且具有掉电保持特性,以及堆和栈的动态分配机制。

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

硬件上的内存归为3类:

heap     堆

stack     栈

SRAM        静态存储区(全称为Static Random Access Memory)

Flash    闪存

SRAM:从编译开始就存在,在整个程序的运行周期一直存在,用于存放局部变量global,静态变量static

Flash:一般用于存放程序代码,掉电不消失,也可用于保存数据,还有一种EEPROM的内存也是数据掉电不消失,但是EEPROM的内存一般很小,只有几百Byte,而Flash一般都是MB级别的,Flash是以扇区为最小单位存在的,EEPROM则可以对单个地址的数据修改。

stack:用于存放局部变量,当变量所在函数运行完后,立即释放

heap:由malloc函数或者new指针分配,由free函数或者delect运算符释放,期间一直存在(慎用,小型硬件系统易崩溃)

在STM32F429IGT6中,芯片本身的SRAM有256KB,Flash有1024KB,堆和栈的大小我不太清楚,但是在CUBEMX生成工程时可以看到: 

但是如果运行UI界面或者算法,SRAM是无法满足庞大的内存需求的,因此一般的开发板上都会帮你拓展一块静态存储区,我用的正点原子家的核心板上就嵌入了一块W9825G6KH,一块32MB的SDRAM(synchronous dynamic random access memory)同步动态存储区。

以上就是我对硬件系统中内存的一些讨论,大家有补充或者指正的欢迎在评论区留言。

 

转载于:https://www.cnblogs.com/showtime20190824/p/11415584.html

### 如何使用 STM32CubeMX 配置和生成 TFT 屏幕驱动代码 #### 工具与环境准备 在开始之前,需确保已安装最新版本的 STM32CubeMX 和相应的 IDE(如 Keil 或 IAR),以及目标 MCU 的 HAL 库支持包。此外,还需了解所使用的 TFT 显示屏的具体技术规格,包括其接口类型(如 FMC/FSMC、SPI 或 RGB)、分辨率和支持的颜色位数。 --- #### 1. 创建新项目并选择微控制器型号 打开 STM32CubeMX 软件,点击 **New Project** 并选择合适的 STM32 微控制器型号。例如,在引用中提到的 STM32F767IGT6 是一种常见的高性能 Cortex-M7 内核处理器[^2]。 --- #### 2. 配置系统时钟 进入 **Clock Configuration** 页面,调整 PLL 设置以满足显示屏刷新率的要求。通常情况下,较高的主频可以提供更好的显示效果。对于大多数应用,默认的最大频率即可满足需求。 --- #### 3. 配置引脚布局 (Pinout & Configuration) 切换到 **Pinout & Configuration** 界面,完成以下操作: - 如果使用的是 FMC 接口,则需要分配对应的地址线、数据线以及其他必要的控制信号(如 NE1、NWE、NOE 等)。这些引脚应严格按照 TFT 模块的技术手册进行映射[^1]。 - 对于基于 LTDC 的 RGB 接口方案,还需要额外配置红绿蓝分量通道及其同步信号 HSYNC/VSYNC 及像素时钟 CLK。 --- #### 4. 启用相关外设 转至 **Peripherals** 标签页,激活如下组件: - **FMC**: 若采用静态内存控制器来模拟访问模式,则在此处设定具体参数比如宽度、等待状态数目等细节[^1]。 - **LTDC**: 当涉及真彩色图形渲染时推荐选用该液晶显示器控制器作为主要绘图引擎[^2]。 同时注意检查是否启用了 DMA 功能以便加速图像传输过程。 --- #### 5. 生成功能初始化代码 当所有硬件资源都已完成定制之后,可以通过顶部菜单栏中的 `Project -> Generate Code` 导出完整的源码框架。此时会自动包含针对选定外围设备的基础设置部分^[]^。 --- #### 示例代码片段 以下是利用 HAL 库编写的一个简单例子展示如何向屏幕上绘制矩形图案: ```c #include "stm32f7xx_hal.h" void DrawRectangle(uint16_t x_start, uint16_t y_start, uint16_t width, uint16_t height, uint16_t color){ for(int i=0;i<height;i++){ for(int j=0;j<width;j++){ LTDC_WritePixel(x_start+j,y_start+i,color); } } } int main(void){ /* 初始化HAL库 */ HAL_Init(); /* 进行低层初始化 */ SystemClock_Config(); MX_GPIO_Init(); MX_LTDC_Init(); while(1){ // 绘制红色填充矩形位于坐标(50,50),尺寸为100*100像素 DrawRectangle(50,50,100,100,RGB_COLOR_RED); } } ``` 以上程序假设已经完成了 LCD 控制器的相关初始化工作,并提供了辅助函数 `LTDC_WritePixel()` 来简化逐点写入流程。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值