查看: 2223|回复: 9

[原创] [LPC54608]通过IAR的分散加使用SDRAM

[复制链接]
  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7427
    最后登录
    2024-1-28
    发表于 2021-12-7 11:03:42 | 显示全部楼层 |阅读模式
    本帖最后由 混森蓝兽 于 2021-12-7 12:16 编辑

    先说一下背景,最近正在学习解码jpeg图片,参考了这个帖子 https://www.nxpic.org.cn/module/ ... 9449&highlight=jpeg


    在解码和显示jpeg图片时,需要用到两个很大的数组:
    1. uint16_t s_FBs[2][272][480];
    2. uint8_t g_JPEGReadBuf[480*272*2];
    复制代码
      
    芯片自带的SRAM容量不够大,只能使用片外的SDRAM。SDRAM的初始化代码在官方例程里面已经有了,所以这个不是啥大问题。问题在分散加载这里,由于以前没怎么接触过,所以这次被折腾了好几天,才捋顺这个问题。

    分散加载的工作主要由有部分:
    • 一是在.icf文件中增加SDRAM的地址空间,添加自定义的section
    • 二是在C代码中定义所需的数组然后指定到自定义section中


    icf文件部分内容如下
    定义SDRAM的地址段 0xA0000000 - 0xA0100000(板载的是16MB的,所以设置到0xA1000000也没问题)。自定义section名为“JPEG_BUF”,位于SDRAM地址段内。
    1. define symbol m_interrupts_start       = 0x00000000;
    2. define symbol m_interrupts_end         = 0x000003FF;
    3. define symbol m_text_start             = 0x00000400;
    4. define symbol m_text_end               = 0x0007FFFF;
    5. define symbol m_data_start             = 0x20000000;
    6. define symbol m_data_end               = 0x20027FFF;
    7. define symbol m_usb_sram_start         = 0x40100000;
    8. define symbol m_usb_sram_end           = 0x40101FFF;
    9. define symbol m_sdram_start            = 0xA0000000;
    10. define symbol m_sdram_end              = 0xA0100000;

    11. define memory mem with size = 4G;
    12. define region SDRAM_region = mem:[from m_sdram_start to m_sdram_end];
    13. do not initialize  { section JPEG_BUF };
    14. place in SDRAM_region                       { section JPEG_BUF };
    复制代码
               
    C代码部分如下:
    两个大数组8字节对其,绑定在SDRAM的"JPEG_BUF"段

    1. #pragma data_alignment = 8
    2. #pragma location="JPEG_BUF"
    3. uint16_t uint16_t s_FBs[2][272][480];
    4. #pragma data_alignment = 8
    5. #pragma location="JPEG_BUF"
    6. uint8_t g_JPEGReadBuf[480*272*2];
    复制代码

    以上代码是能正常运行的。
    其中这一行很关键,折腾了我好久,没有这一行,上电直接死机。
    1.                 do not initialize  { section JPEG_BUF };
    复制代码

    一切都要从启动代码说起:
    1.                 Reset_Handler
    2.                 LDR     r0, =SystemInit
    3.                 BLX     r0
    4.                 LDR     r0, =__iar_program_start
    5.                 BX      r0
    复制代码
                
    CPU执行完SystemInit函数之后,会跳转到__iar_program_start,这是IAR编译器提供的初始化代码的入口。在这里会完成所有具有初始值的全局/静态变量的赋值,以及零初始化全局/静态变量的清零操作,将保存在ROM区由链接器生成的变量初始值复制到变量的地址。

    问题就在于,SDRAM是在main中才进行初始化的,所以在__iar_program_start里面,CPU是无法访问SDRAM的,这就是CPU hardfault的原因。

    所以我们必须将JPEG_BUF 段设置为不初始化的段,这样__iar_program_start就不会对SDRAM进行操作了。

    jpeg-2.jpg


    jpeg-1.jpg

    本工程基于IAR8.2, 把jpeg.jpeg文件拷贝到SD卡即可:

    LPC54608_sdram_jpeg_iar82.zip (1.31 MB, 下载次数: 12)
    来根华子
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 15:01
  • 签到天数: 832 天

    [LV.10]以坛为家III

    5

    主题

    5696

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    6903
    最后登录
    2024-4-19
    发表于 2021-12-7 11:46:32 | 显示全部楼层
    赞一个
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 11:46
  • 签到天数: 1933 天

    [LV.Master]伴坛终老

    61

    主题

    1万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    17220
    最后登录
    2024-4-19
    发表于 2021-12-7 11:49:19 | 显示全部楼层
    好样的,666
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32003
    最后登录
    2024-4-9
    发表于 2021-12-7 13:12:37 | 显示全部楼层
    这就很Q
    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    前天 09:43
  • 签到天数: 1777 天

    [LV.Master]伴坛终老

    65

    主题

    7529

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    12731
    最后登录
    2024-4-18
    发表于 2021-12-7 15:16:14 | 显示全部楼层
    6666666            
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2021-12-7 15:57:52 | 显示全部楼层
    学习了。
    最近也在学习使用LPC54608
    上手确实要较普通的LPC800系列要难的多了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-4-9 17:01
  • 签到天数: 1478 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92609
    最后登录
    2024-4-9
    发表于 2021-12-7 17:57:38 | 显示全部楼层
    大佬键盘很炫啊~~ TS1 - 副本 (4).jpg TS1 - 副本 (2).jpg TS1 - 副本 (3).jpg TS1 - 副本 (6).jpg TS1 - 副本 (9).jpg TS1 - 副本 (8).jpg TS1 - 副本 (7).jpg TS1 - 副本 (5).jpg TS1 - 副本 (10).jpg TS1.jpg
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:48
  • 签到天数: 2621 天

    [LV.Master]伴坛终老

    45

    主题

    5177

    帖子

    22

    金牌会员

    Rank: 6Rank: 6

    积分
    10652
    最后登录
    2024-4-19
    发表于 2021-12-8 08:49:06 | 显示全部楼层
    赞一个
    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-8 09:06
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    18

    主题

    438

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    2209
    最后登录
    2024-3-5
    发表于 2021-12-8 12:57:32 | 显示全部楼层
    话说LPC54608做视频播放器吗?照片水印好搞笑
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-12-23 09:57
  • 签到天数: 1587 天

    [LV.Master]伴坛终老

    5

    主题

    3046

    帖子

    23

    金牌会员

    Rank: 6Rank: 6

    积分
    8200
    最后登录
    2024-4-17
    发表于 2021-12-9 09:36:36 | 显示全部楼层
    消化消化,转到mcuxpresso去。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-20 06:50 , Processed in 0.151828 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表