Перейти к содержанию
    

VladislavS

Свой
  • Постов

    1 240
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные VladislavS


  1. По поводу AT91RM9200-29lv160d.bin точно не скажу. Но вы всегда можете на сайте у автора скачать исходники и посмореть (поправить это дело).

     

    По моему проекту на все вопросы отвечу конечно. Для начала можно почитать в iar-вском хэлпе. Я все равно лучше не напишу. :) А насчет поддерживаемых микросхем, так протокол обмена у них стандартный, а отличие только в сигнатурах. Скачиваете даташит, смотрите сигнатуру и вставляете куда надо - все элементарно.

  2. В варианте 1 есть поддержка DataFlash, просто файл так называется.

     

    А вариант 2 сейчас выложу, только форум поборю... Блин, как архив rar загрузить?

    Пишет: Ошибка загрузки. У Вас нет прав для загрузки файла с таким расширением.

    Что за нафиг. Я же его уже выкладывал когда-то.

     

    Вобщем, вот этот файл. Скачаете, переименуйте расширение txt в rar.

    FL_AT91RM9200_AM29_AT45.txt

  3. На AT91RM9200 это вынлядит так. Думаю все основные моменты на AT91SAM7S64 будут теми же.

      //Настройка AIC
      AIC_IDCR=0xFFFFFFFF; //Запретим все прерывания
      for(unsigned int i=0; i<8; i++) AIC_EOICR=0;  
      AIC_IECR=(1<<1); //Разрешим прерывания Source 1
      ST_IER=(1<<2);  //Разрешить прерывания RTTINC
      AIC_SVR1=(int) &Interrupt_Source1;     
      __enable_interrupt();
      
    
    void Interrupt_Source1(void)
    {
      int st_sr=ST_SR;
      if(st_sr&0x00000004)
      { //Прерывание RTC (1 раз в секунду)
       
      }
    }
      
      
    #pragma vector=0x18
    __irq __arm void interrupt_handler(void)
    {
      void (*interrupt_task)();
      unsigned int vector;
      vector = AIC_IVR; // Get interrupt vector.
      interrupt_task = (void(*)())vector;
      AIC_IVR = 0; // Acknowledge interrupt in VIC.
      (*interrupt_task)(); // Execute the task associated with this interrupt.
      AIC_EOICR=0;
      return;
    }

  4. Уточните, пожалуйста, вообще нет в системе команд - команд записи в сегменты кода или из-за того, что программа обычно во flash?

     

    Команда записи в сегмент кода есть - процессор сам себя может перепрограммировать. Но, так как адресные пространства данных и кода раздельные, у контроллера в штатных режимах работы данные в RAM, а код во FLASH. AVR это вам не ARM, зато намного проще.

  5. Извини, но твоя проблема не стоит выеденного яица. Напиши весь код в теле обработчика прерывания и все. Неужели твои функции настолько ГИГАНТСКИЕ, что нельзя объединить? Не забывай - это прерывание и код должен быть очень коротким и быстрым. А если код обработчика прерывания настолько большой, что его проблемно сделать без функций, то насколько в процентном соотношении он увеличится от добавления сохранения в стек?

  6. в классических системах это делается немного по другому.  В теле Вашего прерывания должен находиться переход (call) на адрес расположенный в оперативной памяти (строго фиксировано), где размещается еще один вызов функции (переключение на функцию) адресс которой подставляется (настраивается в данный момент времени) в зависимости от логики работы программы. Так Вы получаете расширение ресурсов своего преравания.  Что касается скорости выполнения, то здесь теряется время на дополнительный вызов. На asm это реализуется просто, как это сделать корректно на 'C' - надо подумать.

     

    С AVR это не пройдет, так как адресное пространство кода и данных раздельное и сегменты кода во flash лежать обычно.

  7. То же от IAR. Оценивать хорошо это или плохо не бурусь.

     

    Это какой версией компилятора компилировалось? Какие опции оптимизации были установлены?

     

    Последней вестимо - 4.30a. Из опций - оптимизация по скорости или по размеру дает один и тот же результат.

  8. То же от IAR. Оценивать хорошо это или плохо не бурусь.

     

    ARM

    a:
         DS8 4096
    `b`:
         DS8 4096
    
    copy0:
         STMDB       SP!,{R4-R11}      ;; Push
         MOV         R2,#+0x80
    ??copy0_0:
         MOV         R3,R1
         MOV         R12,R0
         LDMIA       R12,{R4-R11}
         STMIA       R3,{R4-R11}
         ADD         R0,R0,#+0x20
         ADD         R1,R1,#+0x20
         SUBS        R2,R2,#+0x1
         BNE         ??copy0_0
         LDMIA       SP!,{R4-R11}      ;; Pop
         BX          LR                ;; return
    
    main:
          STR         LR,[SP, #-4]!    ;; Push
          LDR         R0,??main_0      ;; a
          ADD         R1,R0,#+0x1000
          BL          copy0
          LDR         LR,[SP], #+0x4    ;; Pop
          BX          LR                ;; return
    ??main_0:
          DC32        a

     

    Thumb

    a:
          DS8 4096
    `b`:
          DS8 4096
          PUSH        {R4,LR}
          MOV         R2,#+0x80
    ??copy0_0:
          MOV         R4,#+0x20
    ??copy0_1:
          SUB         R4,R4,#+0x4
          LDR         R3,[R0, R4]
          STR         R3,[R1, R4]
          BNE         ??copy0_1
          ADD         R0,#+0x20
          ADD         R1,#+0x20
          SUB         R2,R2,#+0x1
          BNE         ??copy0_0 
          POP         {R4}
          POP         {R0}
          BX          R0                ;; return
    
    main:
           PUSH        {LR}
           LDR         R0,??main_0       ;; a
           MOV         R1,#+0x80
           LSL         R1,R1,#+0x5       ;; #+0x1000
           ADD         R1,R0,R1
           BL          copy0
    
           POP         {R0}
           BX          R0                ;; return
           NOP         
    ??main_0:
           DC32        a

  9. Реальные гланды :)

     

    Вот так работает в более десятка разных устройств и мастреров, и слэйвов:

    #pragma vector=USART_TXC_vect
    __interrupt void UTX()
    {
     PORTC&=~(1<<PC5);
    };
    
    #pragma vector=USART_RXC_vect
    __interrupt void URX()
    {
     unsigned char RCV_data = UDR;
    }
    
    void SendUART(unsigned char data)
    {
     while ( !(UCSRA&(1<<UDRE)) );
     PORTC|=(1<<PC5);
     UDR=data;
    };

    На PC5, как нетрудно догадаться, висит R/W

  10. В принципе, IAR-ом c FlashLoader-ом можно прошить любой предварительно подготовленный файл в формате simple-code. Про этот формат есть в его доках. То есть, можно скомпилить чем хочешь в бинарник, сделать несложный конвертер в simple-code и шить. Но это, по большомуу счету, извращение. Намного проще залить по X-Modem вот это http://www.ucrouter.ru/download/AT91RM9200-29lv160d.bin и шить что хочешь и куда хочешь. FlashLoader удобен когда весь проект в IAR сделан и отлаживается.

  11. По директиве LDR надо просто почитать о методах адресации. Я в этом не силен.

     

    Запись

    -Z(DATA)CODE_I=RAMSTART-RAMEND
    
    -QCODE_I=CODE_ID

    сделана для функций, которые при инициализации сегментов копируются из ПЗУ в ОЗУ и оттуда запускаются. В программе такие функции имеют модификатор __ramfunc.

  12. При BMS=0 Flash начинается с адреса 0x00000000 и копия с 0x10000000, а SRAM c 0x00200000

     

    При BMS=1 Flash начинается с адреса 0x10000000, а SRAM c 0x00000000 и копия с 0x00200000

     

    Remap лучше делать, так как вектора прерываний читаются из SRAM быстрее, чем из FLASH. Кэширование это немного сглаживает, но не до конца - разница в скорости исполнения кода небольшая есть.

  13. Вот тебе XCL для "тупого апликэйшина", работающего из FLASH при BMS=0. На коком MCK твой "тупой апликэйшин" работает? На забудь перед переходом с часового кварца на основной сделать что-то типа

    SMC_CSR0= (1<<13)|(1<<12)|(3<<8)|(1<<7)|5; //DWB=1 | BAT=1 | TDF=3 | WSEN | NWS=4

     

     

    -carm
    
    -DRAMSTART=200040
    -DRAMEND=203FFF
    
    -DROMSTART=40
    -DROMEND=1FFFFF
    
    -Z(CODE)INTVEC=00-3F
    
    -Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND
    -Z(CODE)SWITAB=ROMSTART-ROMEND
    
    -Z(CODE)CODE=ROMSTART-ROMEND
    
    -Z(CONST)CODE_ID=ROMSTART-ROMEND
    
    -Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND
    -Z(CONST)CHECKSUM=ROMSTART-ROMEND
    
    //************************************************
    // Data segments.
    //************************************************
    
    -Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND
    
    //************************************************
    // __ramfunc code copied to and executed from RAM.
    //************************************************
    
    -Z(DATA)CODE_I=RAMSTART-RAMEND
    
    -QCODE_I=CODE_ID
    
    //*************************************************************************
    // Stack and heap segments.
    //*************************************************************************
    
    -D_CSTACK_SIZE=400
    // -D_SVC_STACK_SIZE=10
    -D_IRQ_STACK_SIZE=100
    -D_HEAP_SIZE=0000
    
    -Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
    // -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND
    -Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND
    -Z(DATA)HEAP+_HEAP_SIZE=RAMSTART-RAMEND

  14. Есть опыт SDRAM на 100 Мгц на AT91RM9200. Плата шестислойка со средним слоем полностью залитым GND. Без резисторов, длины линий специально не выравнивал, но по возможности короткими делал.

     

    ЗЫ: Знаю что так делать нехорошо, просто эксперимент на стабильность.

  15. Ну блин, когда BMS=0, то FLASH с адреса 0x00000000 начинается, а SRAM с 0x200000.

     

    -DRAMSTART=200040

    -DRAMEND=203FFF

     

    -DSDRAMSTART=20000000

    -DSDRAMEND=21FFFFFF

     

    -DROMSTART=40

    -DROMEND=1FFFFF

     

    Вот с таким XCL сможешь из FLASH стартануть, только не забудь в low_level_init SDRAM инициализировать.

     

     

    //   INTVEC     -- Exception vector table.
    //   SWITAB     -- Software interrupt vector table.
    //   ICODE      -- Startup (cstartup) and exception code.
    //   DIFUNCT    -- Dynamic initialization vectors used by C++.
    //   CODE       -- Compiler generated code.
    //   CODE_I     -- Compiler generated code declared __ramfunc (executes in RAM)
    //   CODE_ID    -- Initializer for CODE_I (ROM).
    // -------------
    // Data segments - may be placed anywhere in memory.
    // -------------
    //   CSTACK     -- The stack used by C/C++ programs (system and user mode).
    //   IRQ_STACK  -- The stack used by IRQ service routines.
    //   SVC_STACK  -- The stack used in supervisor mode
    //                 (Define other exception stacks as needed for
    //                 FIQ, ABT, UND).
    //   HEAP       -- The heap used by malloc and free in C and new and
    //                 delete in C++.
    //   INITTAB    -- Table containing addresses and sizes of segments that
    //                 need to be initialized at startup (by cstartup).
    //   CHECKSUM   -- The linker places checksum byte(s) in this segment,
    //                 when the -J linker command line option is used.
    //   DATA_y     -- Data objects.
    //
    // Where _y can be one of:
    //
    //   _AN        -- Holds uninitialized located objects, i.e. objects with
    //                 an absolute location given by the @ operator or the
    //                 #pragma location directive. Since these segments
    //                 contain objects which already have a fixed address,
    //                 they should not be mentioned in this linker command
    //                 file.
    //   _C         -- Constants (ROM).
    //   _I         -- Initialized data (RAM).
    //   _ID        -- The original content of _I (copied to _I by cstartup) (ROM).
    //   _N         -- Uninitialized data (RAM).
    //   _Z         -- Zero initialized data (RAM).
    
    -carm
    
    -DRAMSTART=200040
    -DRAMEND=203FFF
    
    -DSDRAMSTART=20000000
    -DSDRAMEND=21FFFFFF
    
    -DROMSTART=40
    -DROMEND=1FFFFF
    
    -Z(CODE)INTVEC=00-3F
    
    -Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND
    -Z(CODE)SWITAB=ROMSTART-ROMEND
    
    -Z(CODE)CODE=ROMSTART-ROMEND
    
    -Z(CONST)CODE_ID=ROMSTART-ROMEND
    
    -Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND
    -Z(CONST)CHECKSUM=ROMSTART-ROMEND
    
    //************************************************
    // Data segments.
    //************************************************
    
    -Z(DATA)DATA_I,DATA_Z,DATA_N=SDRAMSTART-SDRAMEND
    
    //************************************************
    // __ramfunc code copied to and executed from RAM.
    //************************************************
    
    -Z(DATA)CODE_I=SDRAMSTART-SDRAMEND
    
    -QCODE_I=CODE_ID
    
    //*************************************************************************
    // Stack and heap segments.
    //*************************************************************************
    
    -D_CSTACK_SIZE=800
    // -D_SVC_STACK_SIZE=10
    -D_IRQ_STACK_SIZE=300
    -D_HEAP_SIZE=4000
    
    -Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
    // -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND
    -Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND
    -Z(DATA)HEAP+_HEAP_SIZE=SDRAMSTART-SDRAMEND

  16. Ну из твоих постов не было очевидно, что ты проверяешь то что в SDRAM лежит. А что значит "прыжок" в твоем понимании? Почему ты переход по адресу 0x20000000 делаешь? Там ведь вектора прерываний в начале. А в нулевом стоит команда перехода на __program_start. Ты уверен что у тебя код скомпилирован так, что __program_start в SDRAM попадает? Посмотри Memory map, там все видно будет. Возможно, тебе нужно делать "прыжок", как ты говоришь, по адресу 0x20000040. А лучше написать XCL правильно и загружать код в соответствии с этим XCL.

  17. JTAG по тебе плачет. Недавно только на дружественном этому форуме кто-то спрашивал: "И что вы там JTAGом отлаживаете?". Мне кажется что это как раз тот случай.

     

    А SDRAM А.C.Пушкин инициализирует? Ну хоть убейте, но никогда не поверю, что можно вслепую это сделать.

×
×
  • Создать...