完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
SDRAM裸机参考mmu那章的C初始化,编译成功后运行灯不亮,感觉head.S中ldr pc, =on_sdram没跳转成功,请问是什么原因,谢谢!
文件:head.S @************************************************************************* @ File:head.S @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行 @************************************************************************* .text .global _start _start: ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈 bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启 bl memsetup @ 设置存储控制器 bl copy_steppingstone_to_sdram @ 复制代码到SDRAM中 ldr pc, =on_sdram @ 跳到SDRAM中继续执行 on_sdram: ldr sp, =0x34000000 @ 设置堆栈 bl main halt_loop: b halt_loop 文件:init.c /* * init.c: 进行一些初始化,在Steppingstone中运行 * 它和head.S同属第一部分程序,此时MMU未开启,使用物理地址 */ /* WATCHDOG寄存器 */ #define WTCON (*(volatile unsigned long *)0x53000000) /* 存储控制器的寄存器起始地址 */ #define MEM_CTL_BASE 0x48000000 /* * 关闭WATCHDOG,否则CPU会不断重启 */ void disable_watch_dog(void) { WTCON = 0; // 关闭WATCHDOG很简单,往这个寄存器写0即可 } /* * 设置存储控制器以使用SDRAM */ void memsetup(void) { /* SDRAM 13个寄存器的值 */ unsigned long const mem_cfg_val[]={ 0x22011110, //BWSCON 0x00000700, //BANKCON0 0x00000700, //BANKCON1 0x00000700, //BANKCON2 0x00000700, //BANKCON3 0x00000700, //BANKCON4 0x00000700, //BANKCON5 0x00018005, //BANKCON6 0x00018005, //BANKCON7 0x008C07A3, //REFRESH 0x000000B1, //BANKSIZE 0x00000030, //MRSRB6 0x00000030, //MRSRB7 }; int i = 0; volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE; for(; i < 13; i++) p = mem_cfg_val; } /* * 将第二部分代码复制到SDRAM */ void copy_steppingstone_to_sdram(void) { unsigned int *pdwSrc = (unsigned int *)0; unsigned int *pdwDest = (unsigned int *)0x30000000; while (pdwSrc < (unsigned int *)4096) { *pdwDest = *pdwSrc; pdwDest++; pdwSrc++; } } 文件:leds.c #define GPBCON (*(volatile unsigned long *)0x56000010) #define GPBDAT (*(volatile unsigned long *)0x56000014) #define GPB5_out (1<<(5*2)) #define GPB6_out (1<<(6*2)) #define GPB7_out (1<<(7*2)) #define GPB8_out (1<<(8*2)) void wait(unsigned long dly) { for(; dly > 0; dly--); } int main(void) { unsigned long i = 0; GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out; // 灏哃ED1-4瀵瑰簲鐨凣PB5/6/7/8鍥涗釜寮曡剼璁句负杈撳嚭 while(1){ wait(30000); GPBDAT = (~(i<<5)); // 鏍规嵁i鐨勫 |
|
相关推荐
3个回答
|
|
看 裸板调试 的视频,你可以学到调试方法
|
|
|
|
回复 2楼thisway.diy的帖子
感谢版主大大,确实是要按你说的实验才成功。不过还是不太理解为什么mmu那章就可以用数组,感觉两者是一样的。。。看来还是要继续努力学习,哈哈~~ |
|
|
|
回复 2楼thisway.diy的帖子
“因为这个数组的初始值是用链接地址去访问的” 怎么理解的?是任何数组都不能定义吗?是任何变量都是用链接地址去访问的吗?麻烦讲一下哪些可以定义哪些不能定义,。谢谢! |
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2156 浏览 6 评论
1962 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4520 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 20:00 , Processed in 0.757911 second(s), Total 82, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号