打印

读2440 之 有傻 B

[复制链接]
6255|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
itelectron|  楼主 | 2009-11-14 15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
int main(void)
{
Port_Init();
// USB device detection control
rGPGCON &= ~(3<<24); //usb D+ D- 初始化
rGPGCON |=  (1<<24); // output
rGPGUP  |=  (1<<12); // pullup disable
rGPGDAT |=  (1<<12); // output
Isr_Init();
Uart_Init(0,115200);//串口波特率
Uart_Select(0);//串口通道0
rMISCCR=rMISCCR&~(1<<3); // USBD is selected instead of USBH1//选择串口H1
rMISCCR=rMISCCR&~(1<<13); // USB port 1 is enabled.
//  USBD should be initialized first of all.
isUsbdSetConfiguration=0;//USBD设置配置标记
pISR_SWI=(_ISR_STARTADDRESS+0xf0); //for pSOS 在RAM的_ISR_STARTADDRESS处开辟一段空间

UsbdMain();
Delay(0);  //calibrate Delay()
// CLKOUT0/1 select.
//Uart_Printf("CLKOUT0:MPLL in, CLKOUT1:RTC clock.\n");
//Clk0_Enable(0); // 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0
//Clk1_Enable(2); // 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1
Clk0_Disable();//禁止CLKOUT0输出时钟
Clk1_Disable();//禁止CLKOUT0输出时钟
Uart_Printf("\n\n");
Uart_Printf("+---------------------------------------------+\n");
Uart_Printf("| S3C2440A NandFlash Test ver R0.06 2008 Aug  |\n");
Uart_Printf("+---------------------------------------------+\n");
Uart_Printf("For additional menu, Press any key. \n");
Uart_Printf("\n");
download_run=0;
while(1)
{
  if(menuUsed==1)Menu();
  WaitDownload();
}
}

相关帖子

沙发
itelectron|  楼主 | 2009-11-14 15:32 | 只看该作者
pISR_SWI=(_ISR_STARTADDRESS+0xf0);

#define pISR_SWI                (*(unsigned *)(_ISR_STARTADDRESS+0x8))
#define _ISR_STARTADDRESS         0x33ffff00
不知道红色的那段 是不是 修改异常向量表地址?
为什么要修改 还有++0xf0???????????????????????????

使用特权

评论回复
板凳
itelectron|  楼主 | 2009-11-14 15:33 | 只看该作者
难道 是 pISR_SWI=(_ISR_STARTADDRESS+0xf0);        //for pSOS 在RAM的_ISR_STARTADDRESS处开辟一段堆栈空间

使用特权

评论回复
地板
itelectron|  楼主 | 2009-11-14 15:36 | 只看该作者
疑问XX

        U8 tempMem[16];
        U8 key;
       
        checkSum=0;
        downloadAddress=(U32)tempMem; //_RAM_STARTADDRESS;
        downPt=(unsigned char *)downloadAddress;
        //This address is used for receiving first 8 byte.//这个地址是用来接收前8个字节
        downloadFileSize=0;

使用特权

评论回复
5
itelectron|  楼主 | 2009-11-14 15:40 | 只看该作者
U8 tempMem[16];
downloadAddress=(U32)tempMem; //_RAM_STARTADDRESS;
接收前8个字节  难到是  USB 枚举的那前8个字节???????????
U8 tempMem[16]; 为何是16 个 而不是8个  让费空间XXX

使用特权

评论回复
6
itelectron|  楼主 | 2009-11-14 15:43 | 只看该作者
/*******************************/
        /*        Test program download        */
        /*******************************/
        j=0;
       if(isUsbdSetConfiguration==0) //isUsbdSetConfiguration的值是怎么改变的?是中断里改变的么?
        {
                Uart_Printf("USB host is not connected yet.\n");
        }
        while(downloadFileSize==0)
        {
                if(first==1 && isUsbdSetConfiguration!=0)
                {
                        Uart_Printf("USB host is connected. Waiting a download.\n");
                        first=0;
                }
                j++;
                key=Uart_GetKey();//接收串口数据
                if(key!=0)//如串口接收到数据,则禁止自动运行,并显示菜单
                {
                        Menu();
                        first=1; //To display the message,"USB host ...."
                        //在端口下载返回后downloadFileSize不为0,因此不能再执行USB下载!
                }
        }
        Timer_InitEx();//定时器初始化//好象用来计算USB下载时间用的         
        Timer_StartEx();//定时器开启  
        rINTMSK&=~(BIT_DMA2); //中断控制
        ClearEp3OutPktReady();//清除端点3输出 读取
                // indicate the first packit is processed.第一packit的指示处理
                // has been delayed for DMA2 cofiguration.//推迟DMA2的配置
        if(downloadFileSize>EP3_PKT_SIZE)
        {
                if(downloadFileSize<=(0x80000))
                {
                          ConfigEp3DmaMode(downloadAddress+EP3_PKT_SIZE-8,downloadFileSize-EP3_PKT_SIZE);        
                }
                  else
                  {
                          ConfigEp3DmaMode(downloadAddress+EP3_PKT_SIZE-8,0x80000-EP3_PKT_SIZE);
                        //2440比2410的DIDSTCx寄存器多了中断产生条件的控制位,USB的DMA传输为字节计数   
            //防止高频开cache运行时下载大于0x80000字节文件时IsrDma2出错!!! hzh
                        if(downloadFileSize>(0x80000*2))//for 1st autoreload
                        {
                                rDIDST2=(downloadAddress+0x80000-8);  //for 1st autoreload.
                            rDIDSTC2=(1<<2)|(0<<1)|(0<<0);  
                                rDCON2=rDCON2&~(0xfffff)|(0x80000);                          
                                  while(rEP3_DMA_TTC<0xfffff)
                                  {
                                          rEP3_DMA_TTC_L=0xff;
                                          rEP3_DMA_TTC_M=0xff;
                                          rEP3_DMA_TTC_H=0xf;
                                  }
                        }        
                        else
                        {
                                rDIDST2=(downloadAddress+0x80000-8);  //for 1st autoreload.
                                  rDIDSTC2=(1<<2)|(0<<1)|(0<<0);  
                                rDCON2=rDCON2&~(0xfffff)|(downloadFileSize-0x80000);                 
                                  while(rEP3_DMA_TTC<0xfffff)
                                  {
                                          rEP3_DMA_TTC_L=0xff;
                                          rEP3_DMA_TTC_M=0xff;
                                          rEP3_DMA_TTC_H=0xf;
                                  }
                        }
                }
                totalDmaCount=0;
        }
        else
        {
                totalDmaCount=downloadFileSize;
        }

        Uart_Printf("\nNow, Downloading [ADDRESS:%xh,TOTAL:%d]\n",downloadAddress,downloadFileSize);
        Uart_Printf("RECEIVED FILE SIZE:%8d\n",0);
        j=0x10000;
        while(1)
        {
                if( (rDCDST2-(U32)downloadAddress+8)>=j)
                {
                        Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
                           j+=0x10000;
                }
                if(totalDmaCount>=downloadFileSize)break;
        }
        time=Timer_StopEx();
        Uart_Printf("\b\b\b\b\b\b\b\b%8d",downloadFileSize);        
        Uart_Printf("\n(%5.1fKB/S,%3.1fS)\n",(float)(downloadFileSize/time/1000.),time);
        /*******************************/
        /*         Verify check sum                */
        /*******************************/
        Uart_Printf("Now, Checksum calculation\n");
        cs=0;        
        i=(downloadAddress);
        j=(downloadAddress+downloadFileSize-10)&0xfffffffc;
        while(i<j)
        {
                temp=*((U32 *)i);
                i+=4;
                cs+=(U16)(temp&0xff);
                cs+=(U16)((temp&0xff00)>>8);
                cs+=(U16)((temp&0xff0000)>>16);
                cs+=(U16)((temp&0xff000000)>>24);
        }

        i=(downloadAddress+downloadFileSize-10)&0xfffffffc;
        j=(downloadAddress+downloadFileSize-10);
        while(i<j)
        {
                  cs+=*((U8 *)i++);
        }
        checkSum=cs;        
        dnCS=*((unsigned char *)(downloadAddress+downloadFileSize-8-2))+
        (*( (unsigned char *)(downloadAddress+downloadFileSize-8-1) )<<8);

        if(checkSum!=dnCS)
        {
                Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
                return;
        }
        Uart_Printf("Download O.K.\n\n");

使用特权

评论回复
7
午夜粪车| | 2009-11-15 19:11 | 只看该作者
标题党啊,呵呵

使用特权

评论回复
8
juventus9554| | 2009-11-15 19:14 | 只看该作者
我也是被标题吸引进来的

使用特权

评论回复
9
itelectron|  楼主 | 2009-11-15 20:44 | 只看该作者
基于S3C2440的usb down NandFlash程序(2).rar (385.12 KB) 基 2440 KEIL FOR ARM (MDK) USB DOWN NAND

使用特权

评论回复
10
itelectron|  楼主 | 2009-11-15 20:46 | 只看该作者
2440  的寄存器 实在是 太多了!!!

使用特权

评论回复
11
精益求精| | 2009-11-16 09:27 | 只看该作者
hehe...

使用特权

评论回复
12
yuhuihui| | 2009-11-16 15:18 | 只看该作者
哈哈

使用特权

评论回复
13
itelectron|  楼主 | 2009-11-16 15:51 | 只看该作者
LS 门 不要笑啥  帮忙 解决下 问题 哦!!

使用特权

评论回复
14
itelectron|  楼主 | 2009-11-16 15:54 | 只看该作者
pISR_SWI=(_ISR_STARTADDRESS+0xf0);        //for pSOS




最佳答案PSOS是ISI公司研发德产品,该产品推出时间比较早,因此比较成熟,可以支持多种处理器,曾是国际伤应用最广泛德产品,主要应用领域是远程通信,航天,信息家电和工业控制。但该公司已经被风河公司兼并,从VxWorks5.5开始,已将PSOS的主要特点融入VxWorks中。PSOS是一个由标准软组建组成的,可剪裁的实时操作系统。其系统结构可以分为内核层,系统服务层,用户层。

使用特权

评论回复
15
itelectron|  楼主 | 2009-11-16 15:59 | 只看该作者
m26(phsoscm26_2440a) Oscillator cell with enable and feedback resistor

phsoscm26_2440a

使用特权

评论回复
16
itelectron|  楼主 | 2009-11-25 12:43 | 只看该作者
加入 pISR_SWI=   (unsigned) SWI_Handler;

pISR_SWI 是 2级 向量表的地址  

0x08 是 硬件地址 ---> BL 是跳不到 RAM 区的 我们 必须用 LDR 做个飞行 2GB 全程跳跃

使用特权

评论回复
17
itelectron|  楼主 | 2009-11-29 14:23 | 只看该作者
这是s3c44b0的部分启动代码:   
   
  .macro   HANDLER   HandleLabel   
  stmdb sp!,   {r0-r11,   ip,   lr}   /*   push   r0-r11,   ip,   lr   */   
  ldr r0,   =\HandleLabel   
  ldr r1,   [r0]   
  mov lr,   pc   
  bx r1     /*   call   interrupt   routine   */   
  ldmia sp!,   {r0-r11,   ip,   lr}     /*   pop   r0-r11,   ip,   lr   */   
  subs pc,   r14,   #4     /*   interrupt   ret   */   
  .endm   
   
  -----------------------------------------------------------   
   
  .text   
  ENTRY:   
          b   ResetHandler     /*   for   debug                         */   
          b   HandlerUndef     /*   handlerUndef                   */   
          b   HandlerSWI         /*   SWI   interrupt   handler*/   
          b   HandlerPabort     /*   handlerPAbort                 */   
          b   HandlerDabort       /*   handlerDAbort                 */   
          b   .                               /*   handlerReserved             */   
          ldr                     pc,   =HandlerIRQ   
          b   HandlerFIQ   
   
  --------------------------------------------------------------   
  HandlerFIQ: HANDLER   HandleFIQ   
  HandlerIRQ: HANDLER   HandleIRQ   
  HandlerUndef: HANDLER   HandleUndef   
  HandlerSWI: HANDLER   HandleSWI   
  HandlerDabort: HANDLER   HandleDabort   
   
  --------------------------------------------------------------   
   
  .equ HandleReset, _ISR_STARTADDRESS /*   c7fff00   */   
  .equ HandleUndef, _ISR_STARTADDRESS+4   
  .equ HandleSWI, _ISR_STARTADDRESS+4*2   
  .equ HandlePabort, _ISR_STARTADDRESS+4*3   
  .equ HandleDabort, _ISR_STARTADDRESS+4*4   
  .equ HandleReserved, _ISR_STARTADDRESS+4*5   
  .equ HandleIRQ, _ISR_STARTADDRESS+4*6   
  .equ HandleFIQ, _ISR_STARTADDRESS+4*7   
   
  我想请教的是他是怎么根据宏来进入不同的中断服务程序的,比如说软中断,对于不同的目的,我想进入不同中断服务程序,怎么进入阿?     
   
  问题点数:40、回复次数:6Top

[url=]1 楼[/url]hcd007(猎人王)回复于 2006-12-17 00:50:25 得分 0 不太懂,不过软中断可以有不同的中断服务程序吗?   
   
  帮忙定一下!!   
   
  --------------------   
  嵌入式学习中...Top
[url=]2 楼[/url]fengzhiyi1(zhaoqingguo)回复于 2006-12-17 21:26:27 得分 0 怎么没人指点一下啊   期待中..Top
[url=]3 楼[/url]bygreen(bygreen)回复于 2006-12-19 14:00:11 得分 5应该还有个flag是存在寄存器里得,根据它判断进入不同得软中断Top
[url=]4 楼[/url]benjum(小木)回复于 2006-12-20 10:11:49 得分 25"HandlerFIQ:HANDLER   HandleFIQ"   
   
  其中HANDLER是一个宏,用于查找中断处理程序的入口地址。这些地址存放在由HandleXXX指向的表项中,该表定位在RAM高端,基地址为_ISR_STARTADDRESS。   
   
  bootload中应该还有如下的   地址定义   
   
        _ISR_STARTADDRESS   
        HandleReset   #   4   
        HandleUndef   #   4   
        HandleSWI   #   4   
        HandlePabort   #   4   
        HandleDabort   #   4   
        HandleReserved   #   4   
        HandleIRQ   #   4   
        HandleFIQ   #   4   
  ................   
   
  我也刚学中断,个人理解_ISR_STARTADDRESS为中断向量表的基地址   
  假如_ISR_STARTADDRESS为   0x800000000,当IRQ中断时,根据b   HandlerFIQ,先跳转   
  再根据^   _ISR_STARTADDRESS基地址+HandleIRQ   的偏移地址(4*6)得到的中断地址   
  0x80000000+0x00000024=0x80000024   
   
  我也不太确定,请各位高人指正了   
  我也不太确定,请各位高人指正了

使用特权

评论回复
18
itelectron|  楼主 | 2009-11-29 14:29 | 只看该作者
发表于:2007-10-23 20:20:13最近在s3c44b0x板子上跑一个中断程序,总是失败,考虑了所有情况后觉得ISR_STARTADDRESS值是个可能出错的地方。源程序上定义了ISR_STARTADDRESS=0xc77ff00,但发现自己的板子是HY57V641620,这个实际上是一个4BANK*1M*16BIT的SDRAM,那这个地方的ISR_STARTADDRESS是不是应该定义为0xc37ff00,可是还是不对,期望高手帮忙啊。

使用特权

评论回复
19
itelectron|  楼主 | 2009-11-29 14:29 | 只看该作者
回复于:2007-10-24 00:26:54第一,地址的确定,要看你硬件如何接线的。44B0没有MMU,物理地址接的是多少,就是多少;
第二,如果ISR在SDRAM内,那么首先要确保SDRAM是初始化好了的。
第三,你应该尝试去读ISR_STARTADDRESS地方的代码。如果你源程序定义的ISR_STARTADDRESS是0xc77ff00,而你的接线又没有接到那个bank,那么很可能报的错误是data abort 或者预取指令错误等等exception。如果没有exception,只是进了中断就没有出来,那应该是地址可以访问,但是ISR程序有误。你可以通过硬件点灯这类的方式判断是否进入了ISR。
第四,你可以贴一部分代码上来,便于分析问题。

使用特权

评论回复
20
itelectron|  楼主 | 2009-11-29 14:30 | 只看该作者
回复于:2007-10-24 21:37:47先谢谢了,下面是部分程序:
void Led_Display(int LedStatus)
{

    rPDATC=(rPDATC&0x1f1)|((LedStatus&0x7) < <1);
}

void __irq timer0_int(void)
{
  rI_ISPC=BIT_TIMER0;
  mt0cnt++;
  
  if (mt0cnt>100)
  {
      
      mt0cnt=0;
Led_Display(ledstatus);
ledstatus=(~ledstatus)&0x7;
  }
  else ;
  return ;
}

void init_timer0(void)
{
  rINTMSK=BIT_GLOBAL;
   
  
    pISR_TIMER0=(int) timer0_int;
    rINTCON=0x5;
   
   
    rTCFG1=0x00000004;   
    rTCNTB0=(unsigned int)(MCLK_D/(rTCFG0&0x000000ff)/32/100 );  
    rTCON=0x00a;
    rTCON=0x009;
    Uart_Printf("begin \n");
    rINTMSK=~(BIT_GLOBAL|BIT_TIMER0);

}

void __irq eint4567_int(void)
{
rI_ISPC=BIT_EINT4567;
Led_Display(ledstatus);
ledstatus=(~ledstatus)&0x7;

}
void init_eint4567(void)
{
rINTMSK=~(BIT_GLOBAL|BIT_EINT4567);
pISR_EINT4567=(int) eint4567_int;
rINTCON=0x5;
}


/***************************************************************************
Function name: Main
Parameter    : void
Description  : 初始化系统时钟,串口,并调用LCD图片显示实验函数
Return     : void
Argument    :
Autor & date :
****************************************************************************/
void Main(void)
{
int i;
SystemClockInit(); //系统时钟初始化
MemCfgInit(); //设置非Cache区
PortInit(); //端口初始化
CacheEnable(); //Cache允许

SerialSwitch(0); //切换到串口1
SerialChgBaud(115200);     //设置串口波特率,115200
rPCONC=0x0015;
rPUPC=0xffff;


//将中断向量和处理程序拷贝到SDRAM的起始地址
//假设中断跳转指令已经烧写到了FLASH的起始地址!!!
if(Image$$RO$$Base!=(char *)0x0c000000) {
U32 *src = (U32 *)Image$$RO$$Base;
U32 *dst = (U32 *)0x0c000000;
for(i=0x00; i <0x400; i++)
dst[i] = src[i];
}

Uart_Printf( "\nFS44B0XP Timer0 Interrupt Test!\n" );
    init_timer0();

    while((flag!=10));  //等待中断的产生,10次中断后结束
    rTCON=0x0;          //停止
    rINTMSK=BIT_GLOBAL;
    Uart_Printf("\n Timer2 Interrupt Ok\n");
}

-----------------------------------------
IsrIRQ ;using I_ISPR register.
    sub     sp,sp,#4      ;reserved for PC
    stmfd  sp!,{r8-r9}  

;IMPORTANT CAUTION
;if I_ISPC is not used properly, I_ISPR can be 0 in this routine.

    ldr     r9,=I_ISPR
    ldr     r9,[r9]

cmp r9, #0x0 ;If the IDLE mode work-around is used,
;r9 may be 0 sometimes.
beq %F2

    mov     r8,#0x0
0
    movs    r9,r9,lsr #1
    bcs     %F1
    add     r8,r8,#4
    b     %B0

1
    ldr     r9,=HandleADC
    add     r9,r9,r8
    ldr     r9,[r9]
    str     r9,[sp,#8]
    ldmfd  sp!,{r8-r9,pc}

2
ldmfd sp!,{r8-r9}
add sp,sp,#4
subs pc,lr,#4

————————————————————————

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:MARK: zhi kan ji shu

274

主题

2762

帖子

8

粉丝