012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇

⚠️裸机仓库:https://gitee.com/simonchina_carel_li/mini2440-bare-metal.git

⚠️Tag: 11-sdram-apply

1. 这次要做什么?

我们已经完成了sdram的初始化,现在sdram已经可以使用了

我们之前的固件,栈空间是跑在SOC内置的4KB的SRAM上,

对于后续的固件开发,肯定是不够的,

现在我们需要将整体程序,适配到SDRAM

2. 方案分析

项目 怎么做
将栈放到sdram 修改SVC模式和IRQ模式栈指针到SDRAM顶部,并多预留IRQ栈空间
.data段和.bss的处理适配 这个不需要修改
链接脚本修改 增加sdram内存块,并重新段布局

3. 代码实现

start.s

C 复制代码
/* 
    @ 设置栈顶(给IRQ SP预留512空间)
    ldr     sp, =0x40000E00
*/
    @ 设置栈顶(给IRQ SP预留4K空间)
    ldr     sp, =(0x34000000 - 4096)

irq_handler.c,

C 复制代码
/// @brief 中断控制器初始化
/// 设置IRQ模式的SP, 禁用IRQ/FIQ
void irq_handler_init()
{
    unsigned long cpsr;
    __asm__ volatile (
        // 读取cpsr
        "mrs %0, cpsr\n\t"
        // 禁用IRQ/FIQ, 切换至IRQ模式
        "msr cpsr_c, #0b11010010\n\t"
        // 设置IRQ模式的SP
        // "ldr sp, =0x40001000\n\t"
        "ldr sp, =0x34000000\n\t"
        // 恢复原来模式和原始中断状态
        "msr cpsr, %0\n\t"
        : "=&r" (cpsr)
        :
        : "sp", "cc", "memory"
    );
   // ...略...
}

mini2440_nor.lds,

C 复制代码
MEMORY
{
  rom (rx) : ORIGIN = 0x00000000, LENGTH = 16M
  sram (rwx) : ORIGIN = 0x40000000, LENGTH = 4K
  sdram (rwx) : ORIGIN = 0x30000000, LENGTH = 64M // 增加sdram区域
}

// 下方的sram改为sdram

重新编译按键测试程序,make key

烧录运行,测试,

按键依旧可用,中断照常触发

这节有点划水的感觉~

相关推荐
不吃鱼的羊2 小时前
ADC扫描组Scan Group
单片机
卡布叻_星星2 小时前
AI大模型之采用DeepSeek-Coder:6.7b + Ollama + Continue离线部署
笔记
wb1892 小时前
NoSQL数据库Redis集群重习
数据库·redis·笔记·云计算·nosql
宵时待雨2 小时前
优选算法专题1:双指针
数据结构·c++·笔记·算法·leetcode
Stella Blog3 小时前
狂神Java基础学习笔记Day01
java·笔记·学习
tq10863 小时前
时间、决断与主体性:从“存在决定自我”到对“存在即本质”的批判
笔记
LCMICRO-133108477463 小时前
长芯微LPC556D1完全P2P替代DAC8830,是引脚兼容的16位数模转换器,该系列产品为单通道、低功耗、缓冲电压输出型DAC
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·电压输出型dac
forAllforMe3 小时前
如何用定时器PWM产生SPWM?--电机驱动控制
嵌入式硬件
charlie1145141913 小时前
嵌入式C++教程实战之Linux下的单片机编程(9):HAL时钟使能 —— 不开时钟,外设就是一坨睡死的硅
linux·开发语言·c++·单片机·嵌入式硬件·c