完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我把韦老师关于祼板跑LED的例子烧写在TQ2440板子上的NAND-Flash上跑是没有问题的,灯会按计数的方式依次点亮,而我把这个程序烧在Nor-Flash上跑,灯就显示全亮了。经过多次调试,发现是如果存在那个Wait()函数就有问题,好象那个Wait()函数在Nor-flash上跑是起不到延时的作用。请韦老师指导一下。我是用你的OpenJTAG工具下载到TQ2440的板子上的。但我点亮单一个LED是没有问题的,但按计数的方式点亮,放在Nor-Flash上跑就不行,灯会全亮,我把Wait函数的参数设到最大也没用,最小也没用。
|
|
相关推荐
6个回答
|
|
今天又测了韦老师的key_led的案例程序,针对TQ2440开发板进行相关管脚定义的修改后,用oflash软件烧写入Nand Flash运行是没有问题的,但烧写到Nor Flash上就出问题了,对于按键按下后,灯不亮。我怀疑是TQ2440开发板的Nor Flash启动地址不是以00000000开始的。但我编写了一个极为简单的点亮单个LED的程序,又运行正常啵,所以百思不得其解,请板主给予指教和回复,谢谢。
Key_led.c的源码是: #define GPBCON (*(volatile unsigned long *)0x56000010) //定义LED灯 #define GPBDAT (*(volatile unsigned long *)0x56000014) #define GPFCON (*(volatile unsigned long *)0x56000050) //定义按键 #define GPFDAT (*(volatile unsigned long *)0x56000054) /* * LED1,LED2,LED4对应GPF4、GPF5、GPF6 */ #define GPB5_out (1<<(5*2)) #define GPB6_out (1<<(6*2)) #define GPB7_out (1<<(7*2)) #define GPB8_out (1<<(8*2)) #define GPB5_msk (3<<(5*2)) #define GPB6_msk (3<<(6*2)) #define GPB7_msk (3<<(7*2)) #define GPB8_msk (3<<(8*2)) /* * K0,K1,K2,K32,对应GPF0、GPF1、GPF2、GPF4 */ #define GPF0_in (0<<(0*2)) //“右”按键,对应K0 EINT0 #define GPF1_in (0<<(1*2)) //“上”按键,对应K1 EINT1 #define GPF2_in (0<<(2*2)) //"左“按键,对应K3 EINT2 #define GPF4_in (0<<(4*2)) //”下“按键,对应K2 EINT4 #define GPF0_msk (3<<(0*2)) #define GPF1_msk (3<<(1*2)) #define GPF2_msk (3<<(2*2)) #define GPF4_msk (3<<(4*2)) int main() { unsigned long dwDat; // LED1,LED2,LED3,LED4对应的4根引脚设为输出 GPBCON &= ~(GPB5_msk | GPB6_msk | GPB7_msk | GPB8_msk); GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out; // K0,K1,K2,K3对应的2根引脚设为输入 GPFCON &= ~(GPF0_msk | GPF1_msk | GPF2_msk |GPF4_msk); GPFCON |= GPF0_in | GPF1_in | GPF2_in | GPF4_in; while(1){ //若Kn为0(表示按下),则令LEDn为0(表示点亮) dwDat = GPFDAT; // 读取GPF管脚电平状态 if (dwDat & (1<<0)) // K0没有按下 GPBDAT |= (1<<5); // LED1熄灭 else GPBDAT &= ~(1<<5); // LED1点亮 if (dwDat & (1<<1)) // K1没有按下 GPBDAT |= (1<<6); // LED2熄灭 else GPBDAT &= ~(1<<6); // LED2点亮 if (dwDat & (1<<2)) // K2没有按下 GPBDAT |= (1<<7); // LED3熄灭 else GPBDAT &= ~(1<<7); // LED3点亮 if (dwDat & (1<<4)) // K3没有按下 GPBDAT |= (1<<8); // LED4熄灭 else GPBDAT &= ~(1<<8); // LED4点亮 } return 0; } Ctr0.S的原码是: @****************************************************************************** @ File:crt0.S @ 功能:通过它转入C程序 @****************************************************************************** .text .global _start _start: ldr r0, =0x53000000 @ WATCHDOG寄存器地址 mov r1, #0x0 str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启 ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K bl main @ 调用C程序中的main函数 halt_loop: b halt_loop Makefile的源码是: key_led.bin : crt0.S key_led.c arm-linux-gcc -g -c -o crt0.o crt0.S arm-linux-gcc -g -c -o key_led.o key_led.c arm-linux-ld -Ttext 0x0000000 -g crt0.o key_led.o -o key_led_elf arm-linux-objcopy -O binary -S key_led_elf key_led.bin arm-linux-objdump -D -m arm key_led_elf > key_led.dis clean: rm -f key_led.dis key_led.bin key_led_elf *.o |
|
|
|
NOR启动时,也是从0运行;
你要重新设置栈,把 ldr sp, =1024*4 改为: ldr sp, =(0x40000000 + 1024*4 ) 栈要指向内存,NOR启动时,0地址这一块对应NOR FLASH,它可像内存一样读不可像内存一样写 |
|
|
|
果然OK了,非常感谢版主的指导。
|
|
|
|
我也在这个实验上发现了问题,同样的代码,烧到Nor flash和Nand flash里,运行的时候,Nor flash闪烁交替的频率要慢一些。
|
|
|
|
|
|
|
|
我还有一些疑问请指点下:NOR FLASH不能像内存一样写,那么程序里面对某个变量进行写的话,比如
dwDat = GPFDAT; // 读取GPF管脚电平状态 那么它怎么写到这个变量上的呢? |
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2181 浏览 6 评论
1983 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4541 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 12:51 , Processed in 0.615430 second(s), Total 56, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号