zcgy168

    1. 高通芯片,烧写方法有哪些? 10/5844 嵌入式系统 2010-03-05
      ARM-Flash烧写总结(转) 这部分可能过于简单,很少有人写,但是对于不了解ARM开发过程的人真的简单吗?我是菜鸟,在这卡了3天:) 一般说来有几种方法, 1)板子原来的BOOTLOADER程序或者为烧写而编写的专用ADS程序 比较高级而快速的方法,很多现成的开发板都用这种方法(相对来说有实力的公司),此状态下CPU是运行的,所以速度快。 比如ZLG的,但是对于初学或者不准备细研究硬件的人来说就比较麻烦,因为要编写(改写)ADS烧写程序。愿意的人可以看看。 2)FLUTED 和FLASHPGM一样,使用的好象叫边界扫描法,CPU此时并不运行,因此烧写的比较慢。 在这里也不推荐FLUTED这个软件,原因比较简单,麻烦+速度慢。 因为需要编写(改写)两个配置文件,而且是字符界面。倒是有人说这个软件只能在WIN98下用的说法好象不对(现在有可以让2000和XP下用的方法) 喜欢的朋友可以用用 3)FLASHPGM(推荐) 很简单的程序,GUI界面,速度尚好。 设置很简单,在CPU里选对型号,当然是3 星的44B0。在FLASH里也一样,39LV160,29LV160都有。 确定好地址,RAM地址我的是0XC000000(BANK7上) FLASH地址0X0(BANK0上) 选完了以后读一下FLASH的ID(左下脚的按钮吧)能读出厂家的ID就行。 然后是烧写了,PROGRAME按钮,注意的是FLASHPGM不支持BIN格式,按照下面方法处理。 再有就是尽量在写之前擦一下,PROGRAME菜单里有个选项,打个钩就OK。 具体烧写方法可以看我总结的另一篇文档,在这里只说说UBOOT相关的。 前面说过UBOOT编译以后产生3个文件 u-boot——ELF格式的文件,可以被大多数Debug程序识别; u-boot.bin——二进制bin文件,纯粹的U- BOOT二进制执行代码,不保存ELF格式和调试信息。这个文件一般用于烧录到用户开发板中; u-boot.srec——Motorola S-Record格式,可以通过串行口下载到开发板中。 FLASHPGM不支持BIN格式的,可以烧写u-boot——ELF格式的文件,别看它没扩展名,一样烧写。 还有,如果你懒(和我一样),拿别人现成的BIN文件来烧,FLASHPGM还提供了一个BINTOS19的程序,就在它的安装目录下。具体用法运行它,它自己就告诉你了。 注意:有时(尤其是FLASH里已经有程序的时候)0XC000000会莫名奇妙的提示内存不可以写,有几个方法可以试试:把地址改成0x10000000(好象是缓存地址),之后点EREASE擦除芯片,擦除一般说来是不成功的,最后无论如何都下不去,没关系,这时候关闭擦除对话框,然后0x10000000地址不变,烧FLASH,我一般是烧写一个我自己写的LED测试小程序把内存占上:)。回来这时候再把0X1000000换成0XC000000再按照正常操作,一般可以正常。 这现象的原因就是过去下的程序(多数是不正确的程序)正在运行 占用了RAM与ROM,下个LED测试小程序就是把这几个部分清除掉。 如果以上方法还不正常,可以用另一个程序叫 FLASHP就差2个字母:)很好!在这里对这个程序的作者致敬!! 用这个软件擦FLASH,然后再用FLASHPGM烧,原因是FLASHP擦厉害,但写好象有些问题
    2. #include #include #include "nkintr.h" #include "pkfuncs.h" #include  "s3c2440a_intr.h" #include "s3c2440a_base_regs.h" #include "s3c2440a_ioport.h" #include "s3c2440a_pwm.h" //#include "oal_io.h" #define BUFSIZE 256 static DWORD INTIrq  = IRQ_TIMER1;        // Determined by SMDK2410 board layout. static DWORD INTIntr = SYSINTR_UNDEFINED; volatile S3C2440A_IOPORT_REG  *v_pIOPregs; volatile S3C2440A_PWM_REG     *v_pPWMregs; volatile S3C2440A_INTR_REG    *v_pINTregs; static HANDLE Timer_Event; static HANDLE Timer_Thread; int i1 = 0; int dat = 1; WCHAR achBuffer[BUFSIZE]; BOOL WINAPI DllEntryPoint(HANDLE hinstDLL,                                 DWORD dwReason,                                 LPVOID lpvReserved) {         switch (dwReason)         {         case DLL_PROCESS_ATTACH:          RETAILMSG(1,(TEXT("timer:::::*******DLL_PROCESS_ATTACH******\n")));          break;         case DLL_THREAD_ATTACH:          RETAILMSG(1,(TEXT("timer:::::******DLL_THREAD_ATTACH*******\n")));          break;         case DLL_THREAD_DETACH:          RETAILMSG(1,(TEXT("timer:::::******DLL_THREAD_DETACH******\n")));          break;         case DLL_PROCESS_DETACH:         RETAILMSG(1,(TEXT("timer:::::******DLL_PROCESS_DETACH******\n")));         break;         }      return true; } BOOL TimerINTInit() {         RETAILMSG(1,(TEXT("timer1::::**********KeyInt_Setting***********\r\n")));         //GPIO         v_pIOPregs->GPGCON  &=~(0x3TCON        |=(0x00000001>8),sizeof(S3C2440A_INTR_REG),PAGE_PHYSICAL|PAGE_READWRITE|PAGE_NOCACHE ))                 {                         RETAILMSG(1,(TEXT("timer1::::For S2440IOP: VirtualCopy v_pINTregs failed!\r\n")));                 }         }         } static DWORD Timer1_Thread_Fun() {         while(1)         {                 WaitForSingleObject(Timer_Event,INFINITE);                 RETAILMSG(1,(TEXT("timer1::::Thread id running :times == %d\r\n"),i1));                 i1++;                 if(dat==1)                 {                         v_pIOPregs->GPGDAT |= 0x0100;                         dat = 0;                 }                 else                 {                         v_pIOPregs->GPGDAT &=0xfeff;                         dat =1;                 }         //        v_pINTregs->INTPND        |=(0x00000001

最近访客

< 1/1 >

统计信息

已有42人来访过

  • 芯积分:--
  • 好友:--
  • 主题:--
  • 回复:2

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言