Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка в тестовом проекте Keil.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Oleg_IT
Помогите разрбраться.
Делаю простой тестовый проект для LPC2478

Код
#include <stdio.h>
#include <LPC24xx.H>

int main (void)  {

  while (1) {
   ;  /* ... */  
  }  
}


При запуске дебагера выдает ошибку в файле LPC2400.s
*** error 65: access violation at 0xA0033000 : no 'read' permission
при исполнении кода в помеченной (//!!!!) строке

Код
EMC_DYN_RASCAS3_Val EQU 0x00000303
……………………………..
; Dummy read  (set SDRAM Mode register)
IF      (EMC_DYNCS0_SETUP != 0)
LDR     R4, =DYN_MEM0_BASE
LDR     R5, =(EMC_DYN_RASCAS0_Val:AND:0x00000300); get CAS Latency
LSR     R5, #4                                    ; set CAS Latency    (Bit4..6)
IF      ((EMC_DYN_CFG0_Val:AND:0x00004000) != 0)
ORR     R5, R5, #0x02                              ; set burst length 4 (Bit0..2)
LSL     R5, #11
ELSE
ORR     R5, R5, #0x03                              ; set burst length 8 (Bit0..2)
LSL     R5, #12
ENDIF
ADD     R4, R4, R5                 //!!!!
LDR     R4, [R4, #0]
ENDIF
IF      (EMC_DYNCS1_SETUP != 0)


С другими МК, например LPC2129, дебагер работает нормально. Правда и Startup у них разный.

Вторая проблема с DMA
Есть код (пример написанный не мной)

Код
#define DMA_SRC            0x7FD00000    
#define DMA_DST            0x7FD01000    
…………………………………..
volatile BYTE *TXBuffer = (BYTE *)(DMA_SRC);
volatile BYTE *SRXBuffer = (BYTE *)(DMA_DST);
………………………………………….
  for ( i = 0; i < BUFSIZE; i++ )    /* clear buffer */
  {
    TXBuffer[i] = i;
    RXBuffer[i] = 0;
  }


При присвоении элементам буферов значений возникают ошибки
*** error 65: access violation at 0x7FD00000 : no 'write' permission
*** error 65: access violation at 0x7FD01000 : no 'write' permission
*** error 65: access violation at 0x7FD00001 : no 'write' permission
*** error 65: access violation at 0x7FD01001 : no 'write' permission
………………………….


Дебагер с DMA работать не может?
kurtis
Может поможет http://www.keil.com/support/docs/814.htm
Oleg_IT
К сожалению не помогло, т.к. эта ошибка возникает в коде Startup, который мной не писан и генерится автоматически.
zltigo
QUOTE (Oleg_IT @ Aug 24 2010, 12:48) *
К сожалению не помогло, т.к. эта ошибка возникает в коде Startup, который мной не писан и генерится автоматически.

Никто за Вас не будет инициализировать до работы с дополнительными банками памяти ни контроллеры USB, ни контроллер динамической памяти. Пока они не инициализированы, там нет памяти и будете "лететь".

Oleg_IT
Согласен, что я что-то не доделал, но что?
По первому вопросу ошибка возникает в Startup, я добавил в сгенерённый Keil-ом проект файл *.c с пустой функцией main(), ни к каким банкам памяти ни контроллерам USB обращения нет.

По второму вопросу (проблема с DMA) инициализация DMA идёт при старте программы, вне main() и подпрограмм
Код
#define DMA_SRC            0x7FD00000    
#define DMA_DST            0x7FD01000    
…………………………………..
volatile BYTE *TXBuffer = (BYTE *)(DMA_SRC);
volatile BYTE *SRXBuffer = (BYTE *)(DMA_DST);

Это не правильно? Этот код из примера, а т.к. по ARM-ам я только учусь поэтому пришедший код с Keil и с макеткой считаю правильным. Наверное не прав. Но не думаю, что эти программы не проверены.
Oleg_IT
Проверил.
Все пустые (с пустой main функцией) проекты LPC24x у меня не работают, все установки по умолчанию. Те же проекты LPC23x работают нормально. Для проектов LPC24x надо ещё что-то доделывать?


По проблеме с DMA, установки доступа к памяти привёл в приложении. Для нормальной работы с DMA какие-то регистры ещё инициализировать нужно?
Wano
Цитата(Oleg_IT @ Aug 27 2010, 09:02) *
Все пустые (с пустой main функцией) проекты LPC24x у меня не работают


Хорошо бы сжатый проект приложить. Вопрос решится на раз-два.
Oleg_IT
Два примера по двум проблемам.
Wano
Утверждать не буду(кажется видел в примерах), но вроде можно в Keil подсунуть ini файл, чтобы симулировать внешнюю SDRAM - память выше 0xA0000000. Ну если не используется, просто выключить EMC в стартапе.
Oleg_IT
Выключить SDRAM??? А с чего она по умолчанию включена? И что, стартап её тестирует? И где это выключается? Спасибо, хоть понял, что это к внешней памяти относится (по мануалу эта область обозначена как Reserved).

А что со вторым примером?
Wano
Цитата(Oleg_IT @ Aug 27 2010, 12:50) *
по мануалу эта область обозначена как Reserved


По какому мануалу? 72-я страница манула на 24хх


Table 65. Memory bank selection
Chip select pin Address range Memory type Size of range
CS0 0x8000 0000 - 0x80FF FFFF Static 16 MB
CS1 0x8100 0000 - 0x81FF FFFF Static 16 MB
CS2 0x8200 0000 - 0x82FF FFFF Static 16 MB
CS3 0x8300 0000 - 0x83FF FFFF Static 16 MB
DYCS0 0xA000 0000 - 0xAFFF FFFF Dynamic 256 MB
DYCS1 0xB000 0000 - 0xBFFF FFFF Dynamic 256 MB
DYCS2 0xC000 0000 - 0xCFFF FFFF Dynamic 256 MB
DYCS3 0xD000 0000 - 0xDFFF FFFF Dynamic 256 MB

p.s. не совсем про размещение, а про ноги, но по той теме.
Oleg_IT
У меня 73 страница (Rev. 04). Да, надо ещё привыкнуть к этим описаниям.

Разобрался, как выключить SDRAM, заменяю 1 на 0 в строке
EMC_SETUP EQU 1

Но дальше идёт
EMC_BASE EQU 0xFFE08000 ; EMC Base Address
Откуда тогда адрес 0xA0000000 берётся?

Wano
EMC рубится одной галкой из кейловского стартапа: открываем стартап -> снизу Config Wizard -> напротив EMC убрать галку.

Вам стоит начать с книжки Трэвора Мартина, а так ...
Oleg_IT
Есть у меня такая книга, начал читать. Но время не ждёт, приходится бежать впереди паровозаsmile.gif
Спасибо, помогли с этим вопросом разобраться.
Allregia
У меня тоже вопрос по теме, хотя и с другим процом - скачал с Кейла примеры к демоборду mcb1700, беру mcb1700_http_demo.
Загружаю в Кейл, жму Ф7 и получаю кучу ошибок.
Не хочень компилировать \web и создавать web.c, - пока не понял на что ругается но там есть (был с самого начала) уже кем-то созданный ранее, а в \obj лежит уже скомпилированный http_demo.axf.
Но когда я пытаюсь скомилировать, оно ругается даже на конструкции типа:
Код
  PINCON->PINSEL1 &= ~(3<<18);                   /* P0.25 is GPIO */
  PINCON->PINSEL1 |=  (1<<18);                   /* P0.25 is AD0.2 */

  SC->PCONP       |=  (1<<12);                   /* Enable power to ADC block */

  ADC->ADCR        =  (1<< 2) |                  /* select AD0.2 pin */


Потому что в lpc17xx.h нет "SC, PINCON, ADC", там они "LPC_SC, LPC_PINCON, LPC_ADC"!
Аналогично и в других .с-файлах.
Я конечно могу пройтись по ним и исправить. или переопределить, но вопрос - а как-же оно было скомпилировано?! (А ведь было потому что присутствует изначально .axf)
Или я что-то не так делаю?
igorsk
Наверно исходники делались со старой версией хидеров.
Allregia
Цитата(igorsk @ Sep 1 2010, 00:58) *
Наверно исходники делались со старой версией хидеров.


Не знаю "старой" или "новой", но я понял в чем дело - файл в самом Кейле LPC17xx.h и такой жу файл в CMSIS - разные, в последнем - без префикса.

Теперь осталось понять. как этой самой CMSIS не в демках а в своих проектах пользоваться.

P.S. Я вобще на АРМы/Кортексы только перелез, и с Кейлом никогда не работал (до этого много работал в IAR MSP430/AVR и MPLAB HiTechC ).
Oleg_IT
Прошу прощения, я всё о своём. Не удаётся решить проблему с DMA. Я и начальный адрес менял в менеджере проекта и размер блока, нет доступа к этому участку памяти. В книжке об этом ни чего не нашёл. Вероятно что-то ещё проинициализировать нужно. А что...?
cf7k
Цитата(Oleg_IT @ Sep 3 2010, 20:20) *
Прошу прощения, я всё о своём......

#define DMA_SRC 0x7FD00000
#define DMA_DST 0x7FD01000


Воткнул в свой проект Ваш кусок кода... все прекрасно работает... Хотя никаких дополнительных усилий по инициализации сего блока памяти не предпринимал...
Попробуйте ради экперимента разместить в основной области памяти, попробуйте снизить скорость JTAG'a, можете попробовать из SEGGER'a напрямую записать в эту память.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.