完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我把书中光盘里hardware目录中的mmu代码改成在ADS环境下编译并下载到nandFLASH中一直出不来效果,现在有两个疑问!请大家伙帮个忙哈!感激涕零哈
(1)编译led.c的时候:总是在 static inline void wait(unsigned long dly)这个函数这里报错,不知道问题出在哪里?是不是我没有加入相应的头文件 /* * leds.c: 循环点亮4个LED * 属于第二部分程序,此时MMU已开启,使用虚拟地址 */ #define GPBCON (*(volatile unsigned long *)0xA0000010) // 物理地址0x56000010 #define GPBDAT (*(volatile unsigned long *)0xA0000014) // 物理地址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)) /* * wait函数加上“static inline”是有原因的, * 这样可以使得编译leds.c时,wait嵌入main中,编译结果中只有main一个函数。 * 于是在连接时,main函数的地址就是由连接文件指定的运行时装载地址。 * 而连接文件mmu.lds中,指定了leds.o的运行时装载地址为0xB4004000, * 这样,head.S中的“ldr pc, =0xB4004000”就是跳去执行main函数。 */ static inline void wait(unsigned long dly) { for(; dly > 0; dly--); } int main(void) { unsigned long i = 0; // 将LED1-4对应的GPB5/6/7/8四个引脚设为输出 GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out; while(1){ wait(30000); GPBDAT = (~(i<<5)); // 根据i的值,点亮LED1-4 if(++i == 16) i = 0; } return 0; } (2)关于设置MMU那段C中嵌入的汇编,我的问题是------其中最后两条语句 :/* 无输出 */ :"r"(ttb) 是什么意思,搞不懂;请大家帮忙看看,谢谢!!!! 我改过后的代码如下 #define WTCON (*(volatile unsigned long *)0x53000000) #define MEM_CTL_BASE 0x48000000 void disable_watch_dog(void) { WTCON = 0; } void memsetup(void) { 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; } void copy_2th_to_sdram(void) { unsigned int *pdwSrc = (unsigned int *)2048; unsigned int *pdwDest = (unsigned int *)0x30004000; while (pdwSrc < (unsigned int *)4096) { *pdwDest = *pdwSrc; pdwDest++; pdwSrc++; } } void create_page_table(void) { #define MMU_FULL_ACCESS (3 << 10) #define MMU_DOMAIN (0 << 5) #define MMU_SPECIAL (1 << 4) #define MMU_CACHEABLE (1 << 3) #define MMU_BUFFERABLE (1 << 2) #define MMU_SECTION (2) #define MMU_SECDESC (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL | MMU_SECTION) #define MMU_SECDESC_WB (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL | MMU_CACHEABLE | MMU_BUFFERABLE | MMU_SECTION) #define MMU_SECTION_SIZE 0x00100000 unsigned long virtuladdr, physicaladdr; unsigned long *mmu_tlb_base = (unsigned long *)0x30000000; virtuladdr = 0; physicaladdr = 0; *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | MMU_SECDESC_WB; virtuladdr = 0xA0000000; physicaladdr = 0x56000000; *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | MMU_SECDESC; virtuladdr = 0xB0000000; physicaladdr = 0x30000000; while (virtuladdr < 0xB4000000) { *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | MMU_SECDESC_WB; virtuladdr += 0x100000; physicaladdr += 0x100000; } } void mmu_init(void) { unsigned long ttb = 0x30000000; __asm{ mov r0, #0; mcr p15, 0, r0, c7, c7, 0; mcr p15, 0, r0, c7, c10, 4; mcr p15, 0, r0, c8, c7, 0; mov r4, #0; mcr p15, 0, r4, c2, c0, 0; mvn r0, #0; mcr p15, 0, r0, c3, c0, 0; mrc p15, 0, r0, c1, c0, 0; bic r0, r0, #0x3000; bic r0, r0, #0x0300; bic r0, r0, #0x0087; orr r0, r0, #0x0002; orr r0, r0, #0x0004; orr r0, r0, #0x1000; orr r0, r0, #0x0001; mcr p15, 0, r0, c1, c0, 0; //:/* 无输出 */ //:"r"(ttb) } } (2)最后是start.s文件 IMPORT disable_watch_dog IMPORT memsetup IMPORT copy_2th_to_sdram IMPORT create_page_table IMPORT mmu_init AREA Start,CODE,READONLY ENTRY EXPORT __ENTRY __ENTRY ldr sp, =4096 ;//设置SP指针的位置,因为以下的都是C函数,调用前一定要设好栈 bl disable_watch_dog bl memsetup bl copy_2th_to_sdram bl create_page_table bl mmu_init ldr sp, =0xB4000000 ;//重设栈指针,跳到SDRAM顶端(使用虚拟地址) ldr pc, =0xB0004000 HALT_LOOP b HALT_LOOP END |
|
相关推荐
2个回答
|
|
你说报错,又不贴出错误信息
|
|
|
|
:!,此主题混乱不堪
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2177 浏览 6 评论
1982 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4540 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 17:49 , Processed in 0.778436 second(s), Total 47, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号