图挂了可以去 https://github.com/tanghammer/mini2440_peripherals/blob/master/nand/debug_nand.md

按照前面sdram的代码,启动代码里面关看门狗、初始化存储控制器(主要是BANK0的Norflash和BANK6的SDRAM)、设置栈到SDRAM的最高地址,text段的数据直接从Norflash里面取。

代码如下:

head.S

  1. @*************************************************************************
  2. @ Filehead.S
  3. @ 功能:设置SDRAM,将栈设置到SDRAM,然后继续执行
  4. @*************************************************************************
  5. .equMEM_CTL_BASE, 0x48000000
  6. .equSDRAM_BASE, 0x30000000
  7. .text
  8. .global _start
  9. _start:
  10. b reset
  11. reset:
  12. bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
  13. bl memsetup@ 设置存储控制器
  14. ldr sp, =0x34000000 @ 设置栈
  15. bl main
  16. halt_loop:
  17. b halt_loop
  18. disable_watch_dog:
  19. @ WATCHDOG寄存器写0即可
  20. mov r1, #0x53000000
  21. mov r2, #0x0
  22. str r2, [r1]
  23. mov pc, lr @ 返回
  24. memsetup:
  25. @ 设置存储控制器以便使用SDRAM等外设
  26. mov r1, #MEM_CTL_BASE @ 存储控制器的13个寄存器的开始地址
  27. adrlr2, mem_cfg_val @ 13个值的起始存储地址
  28. add r3, r1, #52 @ 13*4 = 54
  29. @ 依次将内存控制单元对SDRAM初始化的参数写入至寄存器
  30. str_loop:
  31. ldr r4, [r2], #4@ 读取设置值,并让r2加4
  32. str r4, [r1], #4@ 将此值写入寄存器,并让r1加4
  33. cmp r1, r3 @ 判断是否设置完所有13个寄存器
  34. bne str_loop@ 若没有写成,继续
  35. mov pc, lr @ 返回
  36. .align 4
  37. mem_cfg_val:
  38. @ 存储控制器13个寄存器的设置值
  39. .long 0x22011110 @ BWSCON
  40. .long 0x00000700 @ BANKCON0
  41. .long 0x00000700 @ BANKCON1
  42. .long 0x00000700 @ BANKCON2
  43. .long 0x00000700 @ BANKCON3
  44. .long 0x00000700 @ BANKCON4
  45. .long 0x00000700 @ BANKCON5
  46. .long 0x00018005 @ BANKCON6
  47. .long 0x00018005 @ BANKCON7
  48. .long 0x008C07A3 @ REFRESH
  49. .long 0x000000B1 @ BANKSIZE
  50. .long 0x00000030 @ MRSRB6
  51. .long 0x00000030 @ MRSRB7

nand.c

  1. #define LARGER_NAND_PAGE
  2. #define GSTATUS1 (*(volatile unsigned int *)0x560000B0)
  3. #define BUSY 1
  4. #define NAND_SECTOR_SIZE 512
  5. #define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
  6. #define NAND_SECTOR_SIZE_LP 2048
  7. #define NAND_BLOCK_MASK_LP (NAND_SECTOR_SIZE_LP - 1)
  8. typedef unsigned int S3C24X0_REG32;
  9. /* NAND FLASH (see S3C2410 manual chapter 6) */
  10. typedef struct {
  11. S3C24X0_REG32 NFCONF;
  12. S3C24X0_REG32 NFCMD;
  13. S3C24X0_REG32 NFADDR;
  14. S3C24X0_REG32 NFDATA;
  15. S3C24X0_REG32 NFSTAT;
  16. S3C24X0_REG32 NFECC;
  17. } S3C2410_NAND;
  18. /* NAND FLASH (see S3C2440 manual chapter 6, www.100ask.net) */
  19. typedef struct {
  20. S3C24X0_REG32 NFCONF;
  21. S3C24X0_REG32 NFCONT;
  22. S3C24X0_REG32 NFCMD;
  23. S3C24X0_REG32 NFADDR;
  24. S3C24X0_REG32 NFDATA;
  25. S3C24X0_REG32 NFMECCD0;
  26. S3C24X0_REG32 NFMECCD1;
  27. S3C24X0_REG32 NFSECCD;
  28. S3C24X0_REG32 NFSTAT;
  29. S3C24X0_REG32 NFESTAT0;
  30. S3C24X0_REG32 NFESTAT1;
  31. S3C24X0_REG32 NFMECC0;
  32. S3C24X0_REG32 NFMECC1;
  33. S3C24X0_REG32 NFSECC;
  34. S3C24X0_REG32 NFSBLK;
  35. S3C24X0_REG32 NFEBLK;
  36. } S3C2440_NAND;
  37. typedef struct {
  38. void (*nand_reset)(void);
  39. void (*wait_idle)(void);
  40. void (*nand_select_chip)(void);
  41. void (*nand_deselect_chip)(void);
  42. void (*write_cmd)(int cmd);
  43. void (*write_addr)(unsigned int addr);
  44. unsigned char (*read_data)(void);
  45. }t_nand_chip;
  46. static S3C2440_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000;
  47. static t_nand_chip nand_chip;
  48. /* 供外部调用的函数 */
  49. void nand_init(void);
  50. void nand_read(unsigned char *buf, unsigned long start_addr, int size);
  51. /* NAND Flash操作的总入口, 它们将调用S3C2440的相应函数 */
  52. static void nand_reset(void);
  53. static void wait_idle(void);
  54. static void nand_select_chip(void);
  55. static void nand_deselect_chip(void);
  56. static void write_cmd(int cmd);
  57. static void write_addr(unsigned int addr);
  58. static unsigned char read_data(void);
  59. /* S3C2440的NAND Flash处理函数 */
  60. static void s3c2440_nand_reset(void);
  61. static void s3c2440_wait_idle(void);
  62. static void s3c2440_nand_select_chip(void);
  63. static void s3c2440_nand_deselect_chip(void);
  64. static void s3c2440_write_cmd(int cmd);
  65. static void s3c2440_write_addr(unsigned int addr);
  66. static unsigned char s3c2440_read_data(void);
  67. /* S3C2440的NAND Flash操作函数 */
  68. /* 复位 */
  69. static void s3c2440_nand_reset(void)
  70. {
  71. s3c2440_nand_select_chip();
  72. s3c2440_write_cmd(0xff); // 复位命令
  73. s3c2440_wait_idle();
  74. s3c2440_nand_deselect_chip();
  75. }
  76. /* 等待NAND Flash就绪 */
  77. static void s3c2440_wait_idle(void)
  78. {
  79. int i;
  80. volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFSTAT;
  81. while(!(*p & BUSY))
  82. for(i=0; i<10; i++);
  83. }
  84. /* 发出片选信号 */
  85. static void s3c2440_nand_select_chip(void)
  86. {
  87. int i;
  88. s3c2440nand->NFCONT &= ~(1<<1);
  89. for(i=0; i<10; i++);
  90. }
  91. /* 取消片选信号 */
  92. static void s3c2440_nand_deselect_chip(void)
  93. {
  94. s3c2440nand->NFCONT |= (1<<1);
  95. }
  96. /* 发出命令 */
  97. static void s3c2440_write_cmd(int cmd)
  98. {
  99. volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFCMD;
  100. *p = cmd;
  101. }
  102. /* 发出地址 */
  103. static void s3c2440_write_addr(unsigned int addr)
  104. {
  105. int i;
  106. volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;
  107. *p = addr & 0xff;
  108. for(i=0; i<10; i++);
  109. *p = (addr >> 9) & 0xff;
  110. for(i=0; i<10; i++);
  111. *p = (addr >> 17) & 0xff;
  112. for(i=0; i<10; i++);
  113. *p = (addr >> 25) & 0xff;
  114. for(i=0; i<10; i++);
  115. }
  116. static void s3c2440_write_addr_lp(unsigned int addr)
  117. {
  118. int i;
  119. volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;
  120. int col, page;
  121. col = addr & NAND_BLOCK_MASK_LP;
  122. page = addr / NAND_SECTOR_SIZE_LP;
  123. *p = col & 0xff; /* Column Address A0~A7 */
  124. for(i=0; i<10; i++);
  125. *p = (col >> 8) & 0x0f; /* Column Address A8~A11 */
  126. for(i=0; i<10; i++);
  127. *p = page & 0xff; /* Row Address A12~A19 */
  128. for(i=0; i<10; i++);
  129. *p = (page >> 8) & 0xff; /* Row Address A20~A27 */
  130. for(i=0; i<10; i++);
  131. *p = (page >> 16) & 0x03; /* Row Address A28~A29 */
  132. for(i=0; i<10; i++);
  133. }
  134. /* 读取数据 */
  135. static unsigned char s3c2440_read_data(void)
  136. {
  137. volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFDATA;
  138. return *p;
  139. }
  140. /* 在第一次使用NAND Flash前,复位一下NAND Flash */
  141. static void nand_reset(void)
  142. {
  143. nand_chip.nand_reset();
  144. }
  145. static void wait_idle(void)
  146. {
  147. nand_chip.wait_idle();
  148. }
  149. static void nand_select_chip(void)
  150. {
  151. int i;
  152. nand_chip.nand_select_chip();
  153. for(i=0; i<10; i++);
  154. }
  155. static void nand_deselect_chip(void)
  156. {
  157. nand_chip.nand_deselect_chip();
  158. }
  159. static void write_cmd(int cmd)
  160. {
  161. nand_chip.write_cmd(cmd);
  162. }
  163. static void write_addr(unsigned int addr)
  164. {
  165. nand_chip.write_addr(addr);
  166. }
  167. static unsigned char read_data(void)
  168. {
  169. return nand_chip.read_data();
  170. }
  171. /* 初始化NAND Flash */
  172. void nand_init(void)
  173. {
  174. #define TACLS 0
  175. #define TWRPH0 3
  176. #define TWRPH1 0
  177. nand_chip.nand_reset = s3c2440_nand_reset;
  178. nand_chip.wait_idle = s3c2440_wait_idle;
  179. nand_chip.nand_select_chip = s3c2440_nand_select_chip;
  180. nand_chip.nand_deselect_chip = s3c2440_nand_deselect_chip;
  181. nand_chip.write_cmd = s3c2440_write_cmd;
  182. #ifdef LARGER_NAND_PAGE
  183. nand_chip.write_addr = s3c2440_write_addr_lp;
  184. #else
  185. nand_chip.write_addr = s3c2440_write_addr;
  186. #endif
  187. nand_chip.read_data = s3c2440_read_data;
  188. /* 设置时序 */
  189. s3c2440nand->NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);
  190. /* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */
  191. s3c2440nand->NFCONT = (1<<4)|(1<<1)|(1<<0);
  192. /* 复位NAND Flash */
  193. nand_reset();
  194. }
  195. /* 读函数 */
  196. void nand_read(unsigned char *buf, unsigned long start_addr, int size)
  197. {
  198. int i, j;
  199. #ifdef LARGER_NAND_PAGE
  200. if ((start_addr & NAND_BLOCK_MASK_LP) || (size & NAND_BLOCK_MASK_LP)) {
  201. return ; /* 地址或长度不对齐 */
  202. }
  203. #else
  204. if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
  205. return ; /* 地址或长度不对齐 */
  206. }
  207. #endif
  208. /* 选中芯片 */
  209. nand_select_chip();
  210. for(i=start_addr; i < (start_addr + size);) {
  211. /* 发出READ0命令 */
  212. write_cmd(0);
  213. /* Write Address */
  214. write_addr(i);
  215. #ifdef LARGER_NAND_PAGE
  216. write_cmd(0x30);
  217. #endif
  218. wait_idle();
  219. #ifdef LARGER_NAND_PAGE
  220. for(j=0; j < NAND_SECTOR_SIZE_LP; j++, i++) {
  221. #else
  222. for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
  223. #endif
  224. *buf = read_data();
  225. buf++;
  226. }
  227. }
  228. /* 取消片选信号 */
  229. nand_deselect_chip();
  230. return ;
  231. }
  232. int main(void)
  233. {
  234. unsigned int buffer;
  235. unsigned long nandPtr = 0x00000000;
  236. nand_init();
  237. while(1)
  238. {
  239. nand_read((unsigned char *)&buffer, nandPtr, 4);
  240. nandPtr = nandPtr + 4;
  241. }
  242. return 0;
  243. }

Makefile

  1. CROSS_TOOLCHAIN := arm-linux
  2. nand.bin : head.S nand.c
  3. $(CROSS_TOOLCHAIN)-gcc -g -nostdlib -c -o head.o head.S
  4. $(CROSS_TOOLCHAIN)-gcc -g -nostdlib -c -o nand.o nand.c
  5. $(CROSS_TOOLCHAIN)-ld -Ttext 0x00000000 head.o nand.o -o nand_elf
  6. $(CROSS_TOOLCHAIN)-objcopy -O binary -S nand_elf nand.bin
  7. $(CROSS_TOOLCHAIN)-objdump -D -m arm nand_elf > nand.dis
  8. clean:
  9. rm -f nand.dis nand.bin nand_elf *.o

使用arm-linux-gdb + JLinkGDBServer在调试过程中,发现程序有复位现象。

但是我已经在启动代码里面关闭了看门狗,看来是别的中断产生了,直接在查看当前寄存器状态monitor regs

CPSR寄存器显示CPU现在处于Undefined Mode。查看S3C2440数据手册

  1. OPERATING MODES
  2. ARM920T supports seven modes of operation:
  3. - User (usr): The normal ARM program execution state
  4. - FIQ (fiq): Designed to support a data transfer or channel process
  5. - IRQ (irq): Used for general-purpose interrupt handling
  6. - Supervisor (svc): Protected mode for the operating system
  7. - Abort mode (abt): Entered after a data or instruction prefetch abort
  8. - System (sys): A privileged user mode for the operating system
  9. - Undefined (und): Entered when an undefined instruction is executed

未定义模式是指CPU执行了一条未定义的指令。那么就需要看到底是那条指令引起,所以得汇编级别的单步调试。重新加载程序,断点下在main里面

  1. load
  2. b main
  3. c
  4. set disassemble-next-line on
  5. si
  6. si
  7. ...
  8. ...
  9. si

在执行了N条si后,发现当执行到nand_reset函数时,发生了复位。

在执行到0x000004b0

  1. 0x000004b0 <nand_reset+16>: 33 ff 2f e1 blx r3

于是重新启动程序,在0x000004b0下断点b *0x000004b0,在并且打印r3的值

  1. Breakpoint 3, 0x000004b0 in nand_reset () at nand.c:173
  2. 173 nand_chip.nand_reset();
  3. 0x000004a8 <nand_reset+8>: 08 30 9f e5 ldr r3, [pc, #8] ; 0x4b8 <nand_reset+24>
  4. 0x000004ac <nand_reset+12>: 00 30 93 e5 ldr r3, [r3]
  5. => 0x000004b0 <nand_reset+16>: 33 ff 2f e1 blx r3
  6. (gdb) monitor reg r3
  7. Reading register (R3 = 0xFFFFFFFF)
  8. (gdb)

发现R3居然为0xFFFFFFFF,blx到0xFFFFFFFF这个位置显然不对,那r3具体是什么意思呢?结合C代码

  1. static void nand_reset(void)
  2. {
  3. nand_chip.nand_reset();
  4. }

查看反汇编nand.dis,nand_reset函数被翻译为

  1. 000004a0 <nand_reset>:
  2. 000004a0: e92d4800 push {fp, lr}
  3. 000004a4: e28db004 add fp, sp, #4
  4. 000004a8: e59f3008 ldr r3, [pc, #8] ; 4b8 <nand_reset+0x18> ;取nand_chip地址(存在地址0x000004b8,值为0x0000878c),放到r3, r3 = &nand_chip
  5. 000004ac: e5933000 ldr r3, [r3] ;即ldr r3, [r3+0], nand_chip.nand_reset成员偏移为0,这句是取nand_chip.nand_reset函数指针给r3, r3 = nand_chip.nand_reset;
  6. 000004b0: e12fff33 blx r3 ;调用nand_chip.nand_reset()函数
  7. 000004b4: e8bd8800 pop {fp, pc}
  8. 000004b8: 0000878c andeq r8, r0, ip, lsl #15 ;这句不是一条汇编,而是一个数据,是nand_chip这个全局静态变量的地址

再看看nand_chip这个结构体各成员的值:

  1. (gdb) p nand_chip
  2. $1 = {
  3. nand_reset = 0xffffffff,
  4. wait_idle = 0xffffffff,
  5. nand_select_chip = 0xffffffff,
  6. nand_deselect_chip = 0xffffffff,
  7. write_cmd = 0xffffffff,
  8. write_addr = 0xffffffff,
  9. read_data = 0xffffffff
  10. }

设置函数指针全失败。为什么呢?nand_chip这个全局变量的地址是0x000004b8,并且占了接下来的7*4个字节,赋值就是对这块内存区域进行写操作。0x000004b8这个地址是对应到NorFlash上的,而NorFlash是不能通过CPU地址和数据总线直接这么写的。在sdram实验时就说到了这点。可以这么理解:NorFlash如果在执行代码的时候,是只读的。因为Flash的特性是写操作要通过先擦除,再写的复杂时序,CPU单纯的发地址去写是实现不了的。

那如何解决这个问题呢?如果代码在SDRAM里面运行就不会这样了,SDRAM是可以通过CPU地址和数据总线直接访问的,那么在启动代码里面把NorFlash里面的代码拷贝到SDRAM再在内存里面运行。修改head.s:

  1. reset:
  2. bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
  3. bl memsetup @ 设置存储控制器
  4. bl copy_norflash_to_sdram
  5. ldr sp, =0x34000000 @ 设置栈
  6. bl main
  7. .........
  8. .........
  9. .........
  10. copy_norflash_to_sdram:
  11. @ norflash数据全部复制到SDRAM中去
  12. @ Nor启动, norflas起始地址0x00000000SDRAM中起始地址0x30000000
  13. mov r1, #0
  14. ldr r2, =SDRAM_BASE
  15. mov r3, #2*1024*1024 @Norflash大小
  16. lo:
  17. ldr r4, [r1],#4 @ NorFlash读取4字节的数据,并让源地址4字节自增
  18. str r4, [r2],#4 @ 将此4字节的数据复制到SDRAM中,并让目地地址4字节自增
  19. cmp r1, r3 @ 判断是否完成:源地址等于NorFlash大小的未地址
  20. bne 1b @ 若没
  21. mov pc, lo @ 返回

增加一个将NorFlash内容全部拷贝至SDRAM的函数copy_norflash_to_sdram,Makefile作调整,将链接地址设置为0x30000000

  1. CROSS_TOOLCHAIN := arm-linux
  2. nand.bin : head.S nand.c
  3. $(CROSS_TOOLCHAIN)-gcc -g -nostdlib -c -o head.o head.S
  4. $(CROSS_TOOLCHAIN)-gcc -g -nostdlib -c -o nand.o nand.c
  5. $(CROSS_TOOLCHAIN)-ld -Ttext 0x30000000 head.o nand.o -o nand_elf
  6. $(CROSS_TOOLCHAIN)-objcopy -O binary -S nand_elf nand.bin
  7. $(CROSS_TOOLCHAIN)-objdump -D -m arm nand_elf > nand.dis
  8. clean:
  9. rm -f nand.dis nand.bin nand_elf *.o

这个时候再次调试

  1. Writing register (CPSR = 0x000000D3)
  2. Select auto target interface speed (8000 kHz)
  3. (gdb) load
  4. Loading section .text, size 0x7a8 lma 0x30000000
  5. Loading section .data, size 0x4 lma 0x300087a8
  6. Start address 0x30000000, load size 1964
  7. Transfer rate: 127 KB/sec, 982 bytes/write.
  8. (gdb) b main
  9. Breakpoint 1 at 0x30000778: file nand.c, line 285.
  10. (gdb) c
  11. Continuing.
  12. Breakpoint 1, main () at nand.c:285
  13. 285 unsigned long nandPtr = 0x00000000;
  14. (gdb) n
  15. 287 nand_init();
  16. (gdb) s
  17. nand_init () at nand.c:215
  18. 215 nand_chip.nand_reset = s3c2440_nand_reset;
  19. (gdb) s
  20. 216 nand_chip.wait_idle = s3c2440_wait_idle;
  21. (gdb) p nand_chip.nand_reset
  22. $1 = (void (*)(void)) 0x300000b0 <s3c2440_nand_reset>
  23. (gdb) n
  24. 217 nand_chip.nand_select_chip = s3c2440_nand_select_chip;
  25. (gdb) n
  26. 218 nand_chip.nand_deselect_chip = s3c2440_nand_deselect_chip;
  27. (gdb) n
  28. 219 nand_chip.write_cmd = s3c2440_write_cmd;
  29. (gdb) n
  30. 221 nand_chip.write_addr = s3c2440_write_addr_lp;
  31. (gdb) n
  32. 225 nand_chip.read_data = s3c2440_read_data;
  33. (gdb) n
  34. 228 s3c2440nand->NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);
  35. (gdb) n
  36. 230 s3c2440nand->NFCONT = (1<<4)|(1<<1)|(1<<0);
  37. (gdb) n
  38. 233 nand_reset();
  39. (gdb) p nand_chip
  40. $2 = {
  41. nand_reset = 0x300000b0 <s3c2440_nand_reset>,
  42. wait_idle = 0x300000d0 <s3c2440_wait_idle>,
  43. nand_select_chip = 0x3000013c <s3c2440_nand_select_chip>,
  44. nand_deselect_chip = 0x30000198 <s3c2440_nand_deselect_chip>,
  45. write_cmd = 0x300001cc <s3c2440_write_cmd>,
  46. write_addr = 0x30000318 <s3c2440_write_addr_lp>,
  47. read_data = 0x30000484 <s3c2440_read_data>
  48. }

可以看到nand_chip成员可以正常赋值了,nand_chip它的地址也在SDRAM所在的地址范围。继续汇编级的单步调试,

这个问题困扰了我,https://blog.csdn.net/smstong/article/details/53944794, 网上查到这个资料,原来s3c2440指令集里面不包含blx指令,s3c2440的数据手册也可以看出来,它只支持bx、bl、b、bxx(条件跳转)。这就解释的清楚了,blx r3,是由于blx的使用导致了Undefined Mode,blx指令的翻译是由arm-linux-gcc做的,那么只要指定我目标机器的指令集是s3c2440所属的指令集就行了,s3c2440是用的ARM920T核,指令集是ARMv4T。所以Makefile修改一下,指定指令集为armv4t:

  1. CROSS_TOOLCHAIN := arm-linux
  2. nand.bin : head.S nand.c
  3. $(CROSS_TOOLCHAIN)-gcc -march=armv4t -g -nostdlib -c -o head.o head.S
  4. $(CROSS_TOOLCHAIN)-gcc -march=armv4t -g -nostdlib -c -o nand.o nand.c
  5. $(CROSS_TOOLCHAIN)-ld -Ttext 0x30000000 head.o nand.o -o nand_elf
  6. $(CROSS_TOOLCHAIN)-objcopy -O binary -S nand_elf nand.bin
  7. $(CROSS_TOOLCHAIN)-objdump -D -m arm nand_elf > nand.dis
  8. clean:
  9. rm -f nand.dis nand.bin nand_elf *.o

再次编译,反汇编中代码段再也没有blx指令出现了,调试也正常了。单单一个nandflash的读操作就遇到了这么多问题,之前跟着网上的资料做,很多时候都帮我们避开了这些坑,或者说的时候都是一带而过。导致我们对一些知识点没有深刻的理解,所以我觉得要跟着比人做的同时,要从自己的理解角度再实现一遍。其实这里对连接脚本,地址无关代码还需要有更深入的理解,后面再分析分析

s3c2440调试nandflash裸机程序遇到的问题的更多相关文章

  1. 基于KEIL4开发ARM9(S3C2440)的裸机程序

    本文主要介绍如何使用Keil4开发ARM9(S3C2440)裸机程序. 说明: 一.平台: 操作系统:Windows XP系统 KEIL版本:4.73 开发板:ARM9(S3C2440) 二.建立工程 ...

  2. nandflash裸机程序分析

    它包含7个文件: head.S init.c main.c Makefile nand.c nand.lds 我们之前的程序都是在nandflash的前4k放代码,上电后自动拷贝到SRAM中,之后将S ...

  3. 【转载】eclipse调试arm裸机程序

    一.集成开发环境 软件部分:eclipse , GDB Server , Jlink软件 硬件部分:Jlink硬件 准备工作1:从SD/NOR Flash启动,格式化nand flash 准备工作2: ...

  4. JZ2440学习笔记之第一个裸机程序(Keil-MDK)

    CPU:S3C2440, ARM920T, Internal 4KB RAM, Support boot from NAND flash, 128MB for each bank. JZ2440:Me ...

  5. MDK972-EK开发板裸调试设置和裸机程序烧写(转)

    硬件平台:MDK972-EK开发板编译调试软件:KEIL uVision4仿真工具:JLINK V7/V8   本例子从串口输出信息,如图:       KEIL uVision4调试设置如图所示: ...

  6. ok6410[002] ubuntu1604系统下搭配ckermit和dnw基于RAM的裸机程序调试环境

    ubuntu1604系统下搭配ckermit和dnw基于RAM的裸机程序调试环境 系统:  ubuntu16.04 裸板: 飞凌公司OK6410开发板 目标:搭建基于ubuntu1604系统和基于RA ...

  7. s3c2440 lcd 显示图片裸机程序

    因为前面的裸机程序非常的简单,就不写博了. 程序的流程: 1,初始化C SP 2,关看门狗 3,初始化SDRAM 4,读出 NAND FLASH 中的 包含图片的程式放到SDRAM里面 5,跳转到SD ...

  8. S3C2440—1.熟悉裸机开发板

    文章目录 一.板载资源介绍 二.安装驱动及上位机 1.USB的驱动及上位机 2.eop驱动安装 3.安装烧录软件oflash 三.烧写开发板 1.预备知识 2.烧写裸板 3.使用u-boot烧写程序 ...

  9. EB-SAM9G45裸机程序下载方法

    开发板:EB-SAM9G45 这里提供一种裸程序下载的方法. 在官方提供的下载方法中有手动下载和自动下载,它们都离不开SAM-BA软件,而该软件使用比较麻烦,而且操作不当很容易导致电脑蓝屏,还有一个很 ...

随机推荐

  1. 关于解决 https 网站无法加载 http 脚本

    前几天刚配置好https网站 然后今天浏览发现自己网站的地图插件不见了 然后看了一下报错显示 然后百度搜索一番找到了解决办法 <meta http-equiv="Content-Sec ...

  2. nginx 日志记录 自定义详解(分析上报用)

    nginx 日志记录 自定义详解   1.log_format 普通格式 log_format main '$remote_addr - $remote_user [$time_local] $req ...

  3. 四、分离分层的 platform驱动

    学习目标: 学习实现platform机制的分层分离,并基于platform机制,编写led设备和驱动程序: 一.分离分层 输入子系统.usb设备比驱动以及platform类型的驱动等都体现出分离分层机 ...

  4. MFC实现http连接、发送和接收数据

    #include <afxinet.h> // 设置超时 CInternetSession session; session.SetOption(INTERNET_OPTION_CONNE ...

  5. Node.js Express+Mongodb 项目实战

    Node.js Express+Mongodb 项目实战 这是一个简单的商品管理系统的小项目,包含的功能还算挺全的,项目涵盖了登录.注册,图片上传以及对商品进行增.删.查.改等操作,对于新手来说是个很 ...

  6. 微信小程序—day05

    小程序云服务器--环境配置 本来想要买腾讯云的云服务器,作为小程序的服务端的.无奈,腾讯云卖的太贵了,比阿里云要贵一倍,想想还是算了. 但是,没有服务端的接受,小程序的一些功能是实现不了的.找了一圈, ...

  7. Appium最新的服务器初始化参数(Capability)【截止11月29日,后续最新的可以看github】

    键 描述 值 automationName 自动化测试的引擎 Appium (默认)或者 Selendroid platformName 使用的手机操作系统 iOS, Android, 或者 Fire ...

  8. 第五模块:WEB开发基础 第3章·BootStrap&JQuery开发

    01-JQuery介绍 02-jQuery文件引入和加载的区别 03-jQuery的基础选择器 04-jQuery的层级选择器 05-jQuery的基本过滤选择器 06-jQuery的属性选择器 07 ...

  9. C 基本运算

    一 算术运算 C语言一共有34种运算符 包括了常见的加减乘除运算 1. 加法运算+ 除开能做加法运算 还能表示正号: +5, +90 2. 减法运算- 除开能做减法运算 还能表示符号: -10, -2 ...

  10. MaxScript代码补全插件

    MaxScript代码补全插件 作者Nik,原文发布于ScriptSpot 安装后max自带脚本编辑器会有自动补全,效果如下: