搜索
bottom↓
回复: 42

使用AT91SAM7X256的进来交流一下!

[复制链接]

出0入0汤圆

发表于 2008-7-8 13:09:45 | 显示全部楼层 |阅读模式
拿到板子也快1年了,一直没时间折腾。最近有时间,做了些工作。
1,ucos2.84的移植,官方是IAR的,我不喜欢IAR的汇编风格,一直用ADS1.2,高版本的没破解好。网上下载的百特移植的有bug,移植完后运行全局变量不清零。
2,emac任务,网上有lwip,也有基于uip的,我对uip熟悉一点,在freertos上把那部分代码照搬过来,运行良好,ping 10000次没丢包。
3,sd卡读写操作,fat文件系统。在阿莫上找了找,没有好的,什么周立功我也去看了,文档不丰富,不知所云。我找了一个fatfs,在别人的基础上改了一下,
变动了一下cs和上电部分,测试了读写文件和目录,运行没问题。
4,其他简单任务,串口收发,按键中断,都没问题。

代码稍后

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2008-7-8 13:13:48 | 显示全部楼层
SD卡部分
测试代码
FATFS fs;
DIR dir;
FILINFO fileinfo;
FIL fsrc,fdst;
BYTE buffer[4096];   // file copy buffer
FRESULT res;         // FatFs function common result code
WORD br, bw;         // File R/W count


        res=f_mountdrv();

FatFs = &fs;
res=f_opendir(&dir, "/");
  if(res)
    AT91F_DBGU_Printk("open dir error\r\n");
/*
  if (f_opendir(&dir, "/")==FR_OK) {   //打开根目录正确
    while (f_readdir(&dir, &fileinfo) == FR_OK && fileinfo.fname[0]) {
      AT91F_DBGU_Printk(fileinfo.fname);
      AT91F_DBGU_Printk("\r\n");
    }
  }
*/
  res = f_open(&fsrc, "abc.txt",FA_OPEN_EXISTING | FA_READ);
  if(res)
    AT91F_DBGU_Printk("open error\r\n");
  res = f_open(&fdst, "new123.txt", FA_OPEN_ALWAYS | FA_WRITE);
    if(res)
    AT91F_DBGU_Printk("open error\r\n");
   res = f_lseek(&fdst, fdst.fsize);        //跳到文件指针最后,每次将新的数据放到文件的后面
     if(res)
    AT91F_DBGU_Printk("offset error\r\n");  
for (;;) {
        res = f_read(&fsrc, buffer, sizeof(buffer), &br);
        if (res || br == 0) break;   // error or eof
        res = f_write(&fdst, buffer, br, &bw);
        if (res || bw < br) break;   // error or disk full
    }
        res = f_write(&fdst, "newadd\r\n", 8, &bw);
    // Close all files
    f_close(&fsrc);
    f_close(&fdst);
  AT91F_DBGU_Printk("copy ok\r\n");

中间屏蔽的是读目录文件名部分。
后面部分完成功能是将abc.txt内容粘贴到new123.txt上

点击此处下载 ourdev_342491.rar(文件大小:17K) (原文件名:fs.rar)

出0入0汤圆

 楼主| 发表于 2008-7-8 13:18:16 | 显示全部楼层
emac 任务
void vuIP_TASK(void *p_arg)
{
INT8U err;
INT32S xARPTimer;                                                                //定时                       
static volatile INT32U xStartTime, xCurrentTime;
char xemac_flag=0;
/* The semaphore used by the EMAC ISR to indicate that an Rx frame is ready
for processing. */
//        xSemaphore =OSSemCreate(0) ;                                //创建信号量
        /* Initialize the uIP TCP/IP stack. */
        uip_init();
        uip_arp_init();
       
        /* Initialize the HTTP server. */
//        httpd_init();
          example1_init();
        /* Initialise the local timers. */
        xStartTime = OSTimeGet();
        xARPTimer = 0;

        /* Initialise the EMAC.  A semaphore will be returned when this is
        successful. This routine contains code that polls status bits.  If the
        Ethernet cable is not plugged in then this can take a considerable time.
        To prevent this starving lower priority tasks of processing time we
        lower our priority prior to the call, then raise it back again once the
        initialisation is complete. */
/*
创建任务,初始化
*/
//        uxPriority = uxTaskPriorityGet( NULL );
//        vTaskPrioritySet( NULL, tskIDLE_PRIORITY );
        while( xemac_flag == NULL )
        {
                xemac_flag=xEMACInit();                                //初始化判断
               
        }
//        vTaskPrioritySet( NULL, uxPriority );


        for( ;; )
        {
                /* Let the network device driver read an entire IP packet
                into the uip_buf. If it returns > 0, there is a packet in the
                uip_buf buffer. */
                uip_len = ulEMACPoll();
        /* Was a packet placed in the uIP buffer? */
                if( uip_len > 0 )
                {
                        /* A packet is present in the uIP buffer. We call the
                        appropriate ARP functions depending on what kind of packet we
                        have received. If the packet is an IP packet, we should call
                        uip_input() as well. */
                        if( pucUIP_Buffer->type == htons( UIP_ETHTYPE_IP ) )
                        {
                                uip_arp_ipin();
                                uip_input();

                                /* If the above function invocation resulted in data that
                                should be sent out on the network, the global variable
                                uip_len is set to a value > 0. */
                                if( uip_len > 0 )
                                {
                                        uip_arp_out();
                                        lEMACSend();
                                }
                        }
                        else if( pucUIP_Buffer->type == htons( UIP_ETHTYPE_ARP ) )
                        {
                                uip_arp_arpin();

                                /* If the above function invocation resulted in data that
                                should be sent out on the network, the global variable
                                uip_len is set to a value > 0. */       
                                if( uip_len > 0 )
                                {       
                                        lEMACSend();
                                }
                        }
                }
                else
                {
                        /* The poll function returned 0, so no packet was
                        received. Instead we check if it is time that we do the
                        periodic processing.
                        定时处理相关任务
                        */
                        xCurrentTime = OSTimeGet();

                        if( ( xCurrentTime - xStartTime ) >= RT_CLOCK_SECOND )
                        {
                                INT32S i;

                                /* Reset the timer. */
                                xStartTime = xCurrentTime;

                                /* Periodic check of all connections. */
                                for( i = 0; i < UIP_CONNS; i++ )
                                {
                                        uip_periodic( i );

                                        /* If the above function invocation resulted in data that
                                        should be sent out on the network, the global variable
                                        uip_len is set to a value > 0. */                                       
                                        if( uip_len > 0 )
                                        {
                                                uip_arp_out();
                                                lEMACSend();
                                        }
                                }

                                #if UIP_UDP
                                        for( i = 0; i < UIP_UDP_CONNS; i++ )
                                        {
                                                uip_udp_periodic( i );

                                                /* If the above function invocation resulted in data that
                                                should be sent out on the network, the global variable
                                                uip_len is set to a value > 0. */
                                                if( uip_len > 0 )
                                                {
                                                        uip_arp_out();
                                                        tapdev_send();
                                                }
                                        }
                                #endif /* UIP_UDP */

                                /* Periodically call the ARP timer function. */
                                if( ++xARPTimer == uipARP_FREQUENCY )
                                {       
                                        uip_arp_timer();
                                        xARPTimer = 0;
                                }
                        }
                        else
                        {                               
                                /* We did not receive a packet, and there was no periodic
                                processing to perform.  Block for a fixed period.  If a packet
                                is received during this period we will be woken by the ISR
                                giving us the Semaphore. */
                                //等待信号量
                                OSSemPend(xSemaphore,250,&err);
//                                xSemaphoreTake( xSemaphore, uipMAX_BLOCK_TIME );
                        }
                }
        }
}
注意,每个人的板子可能有些许不同,仔细看xmacinit函数
点击此处下载 ourdev_342492.rar(文件大小:11K) (原文件名:EMAC.rar)
点击此处下载 ourdev_342493.rar(文件大小:87K) (原文件名:uip.rar)

出0入0汤圆

 楼主| 发表于 2008-7-8 13:19:48 | 显示全部楼层
PIO中断
//按键中断服务程序
//读取AIC_IVR自动清除中断

void pio_c_irq_handler ( void )
{

int dummy;
//    AT91C_BASE_AIC->AIC_IVR   = 0;            /* Debug variant of vector read (protect mode is used)   */
//    AT91C_BASE_AIC->AIC_ICCR  =  1 <<  AT91C_ID_PIOA; /* Clear  timer #0 interrupt                             */
           AT91C_BASE_AIC->AIC_EOICR = 0;            /* Signal end of interrupt                               */
    //* Read the output state
/*
    if ( (AT91F_PIO_GetInput(AT91C_BASE_PIOB) & AT91B_LED2 ) == AT91B_LED2 )
    {
       AT91F_PIO_ClearOutput( AT91C_BASE_PIOB, AT91B_LED2);
    }
    else
    {
       AT91F_PIO_SetOutput( AT91C_BASE_PIOB, AT91B_LED2);
    }
*/
LED_Toggle(2);
    //* enable the next PIO IRQ
    dummy =AT91C_BASE_PIOA->PIO_ISR;
    //* suppress the compilation warning
    dummy =dummy;
    //* while SW3 is push wait
//    while ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & AT91B_SW5 ) != AT91B_SW5 );
//*end interrupt


}

/*
按键初始化
设定PB4,PB5按键中断

*/
void pio_init(void)
{


           AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;

        AT91F_PIO_CfgInput(AT91C_BASE_PIOA, AT91B_SW5 | AT91B_SW4);

                                                /* Set the vector address for PIT                      */
/*
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (INT32U)pio_c_irq_handler;
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE
                                          | AT91C_AIC_PRIOR_LOWEST;
    AT91C_BASE_AIC->AIC_ICCR              = 1 << AT91C_ID_PIOA;

        AT91C_BASE_PIOA->PIO_IER =  (AT91B_SW5 | AT91B_SW4);
    AT91C_BASE_AIC->AIC_IECR              = 1 << AT91C_ID_PIOA;
*/

         
        AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_PIOA, PIO_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, pio_c_irq_handler);

        AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,AT91B_SW4|AT91B_SW5);
        AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);       

}

出0入0汤圆

 楼主| 发表于 2008-7-8 13:23:34 | 显示全部楼层
其他的可以参考官方的代码,我基本都是在官方的代码上修修补补,或者照搬。
还有要注意的是,文件系统那部分不能在RAM中运行,RO+RW+Z0超过了64k,必须编译在FLASH中
官方也有DMA版本,可参考修改。

出0入0汤圆

 楼主| 发表于 2008-7-8 13:27:04 | 显示全部楼层
最后,附上启动文件cstartup.s,移植版本参考官方的an1014中的realview部分
那个全局变量不清零的bug我查了很多文档才理清,主要在跳转到main函数那块

;------------------------------------------------------------------------------
;;#------------------------------------------------------------------------------

                                INCLUDE                AT91SAM7X256.inc
RamEnd           EQU                0x00210000

;;#------------------------------------------------------------------------------
;;#- Area Definition
;;#------------------------------------------------------------------------------

;;#---------------------------------------------------------------
;;# ?RESET
;;# Reset Vector.
;;# Normally, segment INTVEC is linked at address 0.
;;# For debugging purposes, INTVEC may be placed at other
;;# addresses.
;;# A debugger that honors the entry point will start the
;;# program in a normal way even if INTVEC is not at address 0.
;;#-------------------------------------------------------------
;;   IMPORT          OS_CPU_IRQ_ISR
    IMPORT  OS_CPU_ARM_ExceptResetHndlr                                        ;复位中断程序
    IMPORT  OS_CPU_ARM_ExceptUndefInstrHndlr                        ;未知指令
    IMPORT  OS_CPU_ARM_ExceptSwiHndlr                                        ;软中断
    IMPORT  OS_CPU_ARM_ExceptPrefetchAbortHndlr                        ;取指异常
    IMPORT  OS_CPU_ARM_ExceptDataAbortHndlr                               
    IMPORT  OS_CPU_ARM_ExceptAddrAbortHndlr
    IMPORT  OS_CPU_ARM_ExceptIrqHndlr
    IMPORT  OS_CPU_ARM_ExceptFiqHndlr       
       
;;//   IMPORT        OS_CPU_FIQ_ISR

;.text
;;#                PROGRAM        ?RESET
;;#                RSEG        INTRAMSTART_REMAP
;;#                RSEG        INTRAMEND_REMAP

;;#                RSEG        ICODE:CODE:ROOT(2)
;                CODE 32        /*; Always ARM mode after reset*/       
;;#                org        0
                AREA        reset, CODE, READONLY
                ;ENTRY
                                ;EXPORT                entry
              ENTRY
                                EXPORT                entry
entry
;;#------------------------------------------------------------------------------
;;#- Exception vectors
;;#--------------------
;;#- These vectors can be read at address 0 or at RAM address
;;#- They ABSOLUTELY requires to be in relative addresssing mode in order to
;;#- guarantee a valid jump. For the moment, all are just looping.
;;#- If an exception occurs before remap, this would result in an infinite loop.
;;#- To ensure if a exeption occurs before start application to infinite loop.
;;#------------------------------------------------------------------------------
re_set
                B           InitReset           ;/* 0x00 Reset handler*/
undefvec
                ldr                        pc,=OS_CPU_ARM_ExceptUndefInstrHndlr                         ;/* 0x04 Undefined Instruction */
swivec
                ldr                        pc,=OS_CPU_ARM_ExceptSwiHndlr                       ;/* 0x08 Software Interrupt*/
pabtvec
                ldr                        pc,=OS_CPU_ARM_ExceptPrefetchAbortHndlr           ;/* 0x0C Prefetch Abort*/
dabtvec
                ldr                        pc,=OS_CPU_ARM_ExceptDataAbortHndlr       ;/* 0x10 Data Abort*/
rsvdvec
                B           rsvdvec             ;/* 0x14 reserved*/
irqvec
                                ;ldr                pc, [pc,#-0xF20]    ; IRQ : read the AIC
                                ldr                 pc,=OS_CPU_ARM_ExceptIrqHndlr
fiqvec              ldr                        pc,=OS_CPU_ARM_ExceptFiqHndlr                        ;/* 0x1c FIQ*/

;;#------------------------------------------------------------------------------
;;#- Function             : FIQ_Handler_Entry
;;#- Treatments           : FIQ Controller Interrupt Handler.
;;#- Called Functions     : AIC_FVR[interrupt]
;;#------------------------------------------------------------------------------



InitReset
;#------------------------------------------------------------------------------
;#- configure the reset mode register . user reset enable
;#------------------------------------------------------------------------------
                                ldr                r0,=0xFFFFFD08
                                ldr     r1,=0xa5000001
                                str                r1,[r0]
                               
;#------------------------------------------------------------------------------
;#- Low level Init (PMC, AIC, ? ....) by C function AT91F_LowLevelInit
;#------------------------------------------------------------------------------
                    IMPORT   AT91F_LowLevelInit

;#define  __iramend         SFB(INTRAMEND_REMAP)

;#- minumum C initialization
;#- call  AT91F_LowLevelInit( void)


            ldr     r13,=RamEnd            ; temporary stack in internal RAM*/
;#--Call Low level init function in ABSOLUTE through the Interworking
            ldr            r0,=AT91F_LowLevelInit
        mov     lr, pc
            bx            r0


;# REMAP memory 0x200000 -> 0x0
; Copy Exception Vectors to Internal RAM
;                                RAM_BASE EQU         0x200000
;                ADR     R8, re_set         ; Source
;                LDR     R9, =RAM_BASE       ; Destination
;                LDMIA   R8!, {R0-R7}        ; Load Vectors
;                STMIA   R9!, {R0-R7}        ; Store Vectors
;                LDMIA   R8!, {R0-R7}        ; Load Handler Addresses
;                STMIA   R9!, {R0-R7}        ; Store Handler Addresses
;                ENDIF


; Remap on-chip RAM to address 0

;MC_BASE EQU     0xFFFFFF00      ; MC Base Address
;MC_RCR  EQU     0x00            ; MC_RCR Offset

;                IF      :DEF:REMAP
;                LDR     R0, =MC_BASE
;               MOV     R1, #1
;               STR     R1, [R0, #MC_RCR]   ; Remap
;                ENDIF


;#------------------------------------------------------------------------------
;#- Stack Sizes Definition
;#------------------------
;#- Interrupt Stack requires 2 words x 8 priority level x 4 bytes when using
;#- the vectoring. This assume that the IRQ management.
;#- The Interrupt Stack must be adjusted depending on the interrupt handlers.
;#- Fast Interrupt not requires stack If in your application it required you must
;#- be definehere.
;#- The System stack size is not defined and is limited by the free internal
;#- SRAM.
;#------------------------------------------------------------------------------

;#------------------------------------------------------------------------------
;#- Top of Stack Definition
;#-------------------------
;#- Interrupt and Supervisor Stack are located at the top of internal memory in
;#- order to speed the exception handling context saving and restoring.
;#- ARM_MODE_SVC (Application, C) Stack is located at the top of the external memory.
;#------------------------------------------------------------------------------

IRQ_STACK_SIZE  equ   (3*8*4)     

;2 words per interrupt priority level

ARM_MODE_USER           EQU     0x10
ARM_MODE_FIQ            EQU     0x11
ARM_MODE_IRQ            EQU     0x12
ARM_MODE_SVC            EQU     0x13
ARM_MODE_ABORT          EQU     0x17
ARM_MODE_UNDEF          EQU     0x1B
ARM_MODE_SYS            EQU     0x1F
I_BIT equ 0x80
F_BIT equ 0x40

;#------------------------------------------------------------------------------
;#- Setup the stack for each mode
;#-------------------------------
                ldr     r0, =RamEnd

;#- Set up Fast Interrupt Mode and set FIQ Mode Stack
                msr     CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT
;#- Init the FIQ register
                    ldr     r8, =AT91C_BASE_AIC

;#- Set up Interrupt Mode and set IRQ Mode Stack
                msr     CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
                mov     r13, r0                     ; Init stack IRQ*/
                sub     r0, r0, #IRQ_STACK_SIZE

;#- Enable interrupt & Set up Supervisor Mode and set Supervisor Mode Stack
                msr     CPSR_c, #ARM_MODE_SVC
                mov     r13, r0                     



;#------------------------------------------------------------------------------
;#- Initialise C variables
;#------------------------
;#- Following labels are automatically generated by the linker.
;#- RO: Read-only = the code
;#- RW: Read Write = the data pre-initialized and zero-initialized.
;#- ZI: Zero-Initialized.
;#- Pre-initialization values are located after the code area in the image.
;#- Zero-initialized datas are mapped after the pre-initialized.
;#- Note on the Data position :
;#- If using the ARMSDT, when no -rw-base option is used for the linker, the
;#- data area is mapped after the code. You can map the data either in internal
;#- SRAM ( -rw-base=0x40 or 0x34) or in external SRAM ( -rw-base=0x2000000 ).
;#- Note also that to improve the code density, the pre_initialized data must
;#- be limited to a minimum.
;#------------------------------------------------------------------------------


                IMPORT      __main

                ldr         r0, =__main
                mov         lr, pc
                bx          r0

;#------------------------------------------------------------------------------
;#- Loop for ever
;#---------------
;#- End of application. Normally, never occur.
;#- Could jump on Software Reset ( B 0x0 ).
;#------------------------------------------------------------------------------

End
            b       End
   


;#---------------------------------------------------------------
;# ?EXEPTION_VECTOR
;# This module is only linked if needed for closing files.
;#其余中断处理
;#---------------------------------------------------------------
                global        AT91F_Default_FIQ_handler
                global        AT91F_Default_IRQ_handler
                global        AT91F_Spurious_handler

                ;CODE 32        /*; Always ARM mode after exeption*/       

AT91F_Default_FIQ_handler
            b     AT91F_Default_FIQ_handler

AT91F_Default_IRQ_handler
            b     AT91F_Default_IRQ_handler

AT91F_Spurious_handler
            b     AT91F_Spurious_handler

;#        ENDMOD

        END

出0入54汤圆

发表于 2008-7-8 13:33:33 | 显示全部楼层
你的是哪块板子,现在用什么编译器啊?
我倒挺喜欢IAR的,至少查找功能挺强的。

出0入0汤圆

 楼主| 发表于 2008-7-8 13:37:58 | 显示全部楼层
IAR我也用,用的少,官方的代码都是IAR的,但库文件IAR和ADS下都通用。
我用的是板子跟官方的有少许差别。
ADS的IDE不如IAR强大,但也很好用,汇编美观,文档丰富。

出0入54汤圆

发表于 2008-7-8 13:43:40 | 显示全部楼层
我手上有个是官方的板子,研究了一段时间就扔下了
因为看了下7X256的价格,太贵了,ARM9也不过如此,所以转向ARM9了。

出0入0汤圆

 楼主| 发表于 2008-7-8 13:52:40 | 显示全部楼层
7x256贵是贵了点,如果不要EMAC可以选择sam7s,便宜很多。
如果算上EMAC,再加上这么大的存储器,也不算太贵,相对单片机来说,很便宜了。
而且flash读写速度单片机简直没法比。
至于ARM9,不移植操作系统太浪费,移植操作系统太麻烦。
还是ARM7什么都能弄明白的好。

出0入0汤圆

 楼主| 发表于 2008-7-8 15:38:02 | 显示全部楼层
关于SD卡的读写
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/efsl_arm/index.html
这个链接处有使用DMA方式的
我也对着改了一下
试了没问题
我前面发的那个代码有个bug,就是TIMER没有处理

出0入0汤圆

发表于 2008-7-11 15:34:04 | 显示全部楼层
"至于ARM9,不移植操作系统太浪费,移植操作系统太麻烦。
还是ARM7什么都能弄明白的好。"

严重同意楼主的说法,ARM9上不管是跑wince还是linux,开发量都是很大的,如果裸奔确实又浪费资源。

我现在在弄7x256的emac部分,dm9161,移植lwip,mdk3.21 环境,但是出了个问题,看了龙一的方法,我把lwip在mdk环境下移植到7x256上后,做了一个 web(192.168.1.10),结果IE浏览器登陆192.168.1.10 正常8次后就不行了,没回应,我发现是系统的pbuf_pool被耗尽了,一直也查不到出错的地方,请问哪个同仁有此移植经验或代码??

出0入0汤圆

发表于 2008-7-11 20:45:13 | 显示全部楼层
支持LZ先

提供些IAR下的TCP/UDP通讯代码吧哈哈

出0入0汤圆

 楼主| 发表于 2008-7-12 12:16:29 | 显示全部楼层
SD卡的DMA方式读还是有问题,
已经研究了3天了。
昨天把数据摘了出来,发现是块读操作时,错了1Bit,单个字节读时0x03,PDA读进来成了0x06。
仔细读了SD卡相关部分,没什么解决方案。
用SPI0和SPI3方式都不行。

出0入0汤圆

 楼主| 发表于 2008-7-12 12:17:02 | 显示全部楼层
回13楼,没有这些代码,呵呵

出0入0汤圆

发表于 2008-7-13 19:41:01 | 显示全部楼层
现在还没接触UCOS等小操作系统,还没有明显感觉到它的优势

请问下,如在实时性要求高的场合,用代码直接写,和用UCOS等系统,响应速度会相差多少呢?

出0入0汤圆

 楼主| 发表于 2008-7-15 10:02:42 | 显示全部楼层
实时性要求高的场合,如果只有一个任务的话,任务又放在中断里面执行的话,速度只会快,不会慢

出0入0汤圆

发表于 2008-7-25 16:35:09 | 显示全部楼层
可怜的我,还在维护一个6个任务,6个中断的软件啊。没有操作系统,但是实时性能要求高!!实在是无语了

出0入0汤圆

发表于 2008-8-9 09:59:50 | 显示全部楼层
搂主,能否把你的7x256+uip的代码共享一下。freertos提供的uip测试代码上增加了usart0后,当us0中断发生后,系统就重新启动了,估计是中断切换的问题。俺解决不了。
谢谢

出0入0汤圆

发表于 2008-8-20 16:02:36 | 显示全部楼层
楼主是否能将代码共享一下,谢谢
增加操作系统后启动代码需要改,崩溃中

出0入0汤圆

发表于 2008-8-22 09:47:54 | 显示全部楼层
楼主:
请问GPIO按键中断那里,    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE
                                          | AT91C_AIC_PRIOR_LOWEST;
为什么它的中断模式设为:AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE,内部上升缘触发呢?这个是内部中断嘛?

出0入0汤圆

 楼主| 发表于 2008-8-22 16:53:00 | 显示全部楼层
回18楼,贴出你的需求
回19楼,楼主已经共享了uip部分的任务设计和代码,这部分从freerots里面摘取的
回20楼,启动代码也已经有了,有心人自然会用,在第6楼
回21楼,这是内部的触发模式,每个中断源都有这么4种触发模式,自己去看datasheet

出0入0汤圆

 楼主| 发表于 2008-8-25 14:21:30 | 显示全部楼层
漏了一个代码,就是英贝德总结得如何RAM调试的代码 lowlevel_init.c
注意最后3句,就是REMAP指令
在RAM中debug方式需要REMAP

//*----------------------------------------------------------------------------
//*----------------------------------------------------------------------------


// Include the board file description
#include "Board.h"

// The following functions must be write in ARM mode this function called directly
// by exception vector
extern void AT91F_Spurious_handler(void);
extern void AT91F_Default_IRQ_handler(void);
extern void AT91F_Default_FIQ_handler(void);

//*----------------------------------------------------------------------------
//* \fn    AT91F_LowLevelInit
//* \brief This function performs very low level HW initialization
//*        this function can be use a Stack, depending the compilation
//*        optimization mode
//*----------------------------------------------------------------------------
//设定主时钟为48Mhz
//设定缺省中断服务程序

void AT91F_LowLevelInit( void)
{
                int            i;
                AT91PS_PMC     pPMC = AT91C_BASE_PMC;
    //* Set Flash Waite sate
        //  Single Cycle Access at Up to 30 MHz, or 40
        //  if MCK = 47923200 I have 50 Cycle for 1 useconde ( flied MC_FMR->FMCN
            AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 <<16)) | AT91C_MC_FWS_1FWS ;

    //* Watchdog Disable
        AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;

        //* Set MCK at 47 923 200
    // 1 Enabling the Main Oscillator:
        // SCK = 1/32768 = 30.51 uSeconde
            // Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms
            //主振荡器启动时间设置(0SCOUNT),主振荡器使能
                   pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN ));
        // Wait the startup time
        //等待启动时间
        while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));
        // 2 Checking the Main Oscillator Frequency (Optional)
        // 3 Setting PLL and divider:
                // - div by 5 Fin = 3,6864 =(18,432 / 5)
                // - Mul 25+1: Fout =        95,8464 =(3,6864 *26)
                // for 96 MHz the erroe is 0.16%
                // Field out NOT USED = 0
                // PLLCOUNT pll startup time esrtimate at : 0.844 ms
                // PLLCOUNT 28 = 0.000844 /(1/32768)
       pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x05) |
                         (AT91C_CKGR_PLLCOUNT & (28<<8)) |
                         (AT91C_CKGR_MUL & (25<<16)));

        // Wait the startup time
        while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));
        // 4. Selection of Master Clock and Processor Clock
        // select the PLL clock divided by 2
            pPMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK | AT91C_PMC_PRES_CLK_2 ;
        // Set up the default interrupts handler vectors
        AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler ;
        for (i=1;i < 31; i++)
        {
          AT91C_BASE_AIC->AIC_SVR = (int) AT91F_Default_IRQ_handler ;
        }
        AT91C_BASE_AIC->AIC_SPU  = (int) AT91F_Spurious_handler ;

#ifdef __DEBUG
        AT91C_BASE_MC->MC_RCR             =  1;
#endif

}

出0入0汤圆

发表于 2008-9-2 10:34:27 | 显示全部楼层
楼主是否用这芯片做过,bootloader+网口,小弟是初学者,多多指教

出0入0汤圆

发表于 2008-9-10 16:11:08 | 显示全部楼层
ralfak,可以有你的联系方式么?我想向你请教下,我的邮箱是dhuazhang@163.com.

出0入0汤圆

 楼主| 发表于 2008-9-10 22:36:41 | 显示全部楼层
回25楼
msn:llm_ralfak@hotmail.com
有问题可以在后面回帖,无须客气
回24楼
bootloader官方有ISP
网口官方有例程,其余参考FREERTOS有uip协议栈的移植

出0入0汤圆

发表于 2008-9-11 10:28:02 | 显示全部楼层
谢谢楼主,
  我现在情况是这样的:我想使用TCP/IP通讯来实现IAP(在应用编程),通过网口通讯来实现下位机软件升级。UIP协议已经完成,可以跟上位机通讯了。差一段boot程序来刷写新的应用程序,还有就是程序地址分配问题(IAR EWARM编译器),前段时间阅读了ATMega系列单片机的bootloader,说AVR单片机的flash分两个区(boot区和app区)通过熔丝位来修改boot区的大小,他们的思路是:在boot区里面常驻一段引导代码,包含了串口通讯程序,通过串口和超级终端接收代码文件(bin格式),然后写入到app区,更新完成后,就跳转到新的应用程序开始执行。现在问题:
1,这款芯片有没有像ATMega系列那样,将flash分成boot区和app区?
2,使用IAR EWARM,如何配置编程时的起始地址?
3,程序如何实现跳转,如升级结束后,程序跳转到新的应用程序的开始地址来执行?

出0入0汤圆

 楼主| 发表于 2008-9-11 20:39:31 | 显示全部楼层
27楼的想法挺好,实现挺困难,通过TCP/IP的升级方式首先没有那么大的空间存储你的固件,如果你外扩RAM那倒是可行。
然后通过boot程序,把RAM里面的数据写到flash里面去。个人觉得AT91SAM7X256通过网络升级固件不太实际。

出0入0汤圆

发表于 2008-9-18 10:59:30 | 显示全部楼层
你好&nbsp;你有qq么&nbsp;可以透露下不?

出0入0汤圆

发表于 2008-11-12 09:46:22 | 显示全部楼层
我还是个菜青虫,好羡慕!

出0入0汤圆

发表于 2009-3-7 18:09:16 | 显示全部楼层
LZ:通过TCP/IP的升级方式首先没有那么大的空间存储你的固件
但是可以写完几页再申请,不必整个BIN文件放到RAM里面

出0入0汤圆

发表于 2009-3-7 18:14:45 | 显示全部楼层
我现在是这样做的,一个工程里面包括:1、网络通讯部分,可以从上位机得到代码数据;2、写FLASH函数。每次向上位机申请三页(256byte/page),写到FLASH某地址处,直到刷新完成,然后跳转到这个地址去执行代码

出0入0汤圆

发表于 2009-3-7 18:44:38 | 显示全部楼层
向楼主贡献的致敬


AT91SAM7X256
Flash:256Kbytes;RAM:64Kbytes。

出0入0汤圆

发表于 2009-8-11 17:39:14 | 显示全部楼层
向楼主贡献的致敬
楼主能把CAN的程序贡献一下吗?我买的开发板带的CAN程序有问题:只能运行一次,第二次调试程序就跑飞了,必须要重新上电后才可以......不知道问题出在哪里?
楼主,能帮帮忙吗?

出0入0汤圆

发表于 2009-9-27 14:35:05 | 显示全部楼层
请高手们指点一下呀,小弟初学,实验课用到AT91SAM7X256,遇到了很多问题无法解决,希望各位高手帮帮忙,谢谢了
1.为了使马达转动,使用AT91SAM7X256 的PWM,但是什么是PWM 和PWM的工作原理和使用方法是什么?
2,为了使用传感器使用AT91SAM7X256 的ADC,ADC是什么?工作原理和使用方法是什么呢?
3,编程实现:用三个感应器控制一个马达,满足下面三个条件:
  1.用触碰感应器控制马达的开关;
  2,用旋转感应器每转10圈改变马达 的速度:
  3,用紫外(光)传感器控制马达的转动方向。
4.编程实现:利用光感应器区分颜色。
  1.区分3中颜色(白色,灰色,黑色);
  2.首先用光感应器把个颜色分门别类;
  3.用光感应器对这颜色表,把对应的颜色在LCD上输出。

出0入0汤圆

发表于 2009-9-27 18:00:09 | 显示全部楼层
题目不起眼,原来是牛贴

出0入0汤圆

发表于 2009-10-16 18:47:47 | 显示全部楼层
楼主您好:
    请问我可以用at91sam7x256来实现IAP功能吗,我需要用xmodem协议来把我的bin文件写入flash中吗?谢谢!!

出0入0汤圆

发表于 2009-10-16 21:02:23 | 显示全部楼层
其实操作系统除了wince和linux,还有别的很多其他操作系统,开源也有的是,如果有这个兴趣,可以研究别的呀!~!我现在就是用ARM9的,也觉得挺好

出0入0汤圆

发表于 2009-12-16 17:00:39 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-5-8 20:46:23 | 显示全部楼层
AT91SAM7X256 看门狗不起作用, 不知道大家是否遇到过?

出0入0汤圆

发表于 2010-12-2 15:51:52 | 显示全部楼层
回复【6楼】ralfak
最后,附上启动文件cstartup.s,移植版本参考官方的an1014中的realview部分
那个全局变量不清零的bug我查了很多文档才理清,主要在跳转到main函数那块

我也遇到全局变量不清零的问题,居然在执行main函数前编译器不生成初始化全局变量代码。没办法只好在程序里再初始化了,

出0入0汤圆

发表于 2010-12-2 15:53:45 | 显示全部楼层
回复【40楼】WOTASOM 突击驾驶员
at91sam7x256 看门狗不起作用, 不知道大家是否遇到过?
-----------------------------------------------------------------------

我用挺好的呢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 22:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表