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

может мне у себя тоже увеличить задержку флеш и виснуть перестанет?
Я не люблю гадать. Вам лучше знать, на какой частоте у вас работает ядро. Откройте описание (flash programming manual на ваш контроллер) и посмотрите, сколько тактов ожидания производитель требует для флеши на этой частоте. Меньше - нельзя, больше - не нужно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

раз повиснет на MAC1 = 0;, другой раз на чтении регистра PHY.

Что Вы имеете ввиду под "повисло"? Теперь с помощью jtag можно определить куда именно попадаете.

 

Если, например, в обработчик исключения Data Abort (DAbt_Handler), то надо анализировать регистр R14 (вычесть 8 и получить адрес инструкции, которая вызвала исключение).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что Вы имеете ввиду под "повисло"? Теперь с помощью jtag можно определить куда именно попадаете.

 

Если, например, в обработчик исключения Data Abort (DAbt_Handler), то надо анализировать регистр R14 (вычесть 8 и получить адрес инструкции, которая вызвала исключение).

Попадает программа в

Vectors         LDR     PC, Reset_Addr

Там и остаётся

 

А вы перед переключением на высокую частоту выставляете такты задержки флеша? Без этого из флеша может читаться и исполняться что угодно. Пока есть команды в буфере предвыборки - все работает. Как пошли считанные после разгона - все: чудеса, исключения и т.д.

Посмотрю, но я эти настройки вообще не трогаю, как автоматом генерится так и работает, в других программах на той же макетке проблем нет, графика работает, USB.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попадает программа в

Vectors         LDR     PC, Reset_Addr

Там и остаётся

это как??

 

стандартные заглушки для того же Abort - да, бесконечный цикл. Но программа-то по Reset уж явно не в цикле крутится...

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попадает программа в

Vectors         LDR     PC, Reset_Addr

Там и остаётся

Вы смотрите в окне исходника или в окне дизассемблера? Уж по этой-то команде он должен уйти на Reset_Addr. А если не уходит - возможно произошел Remap и по этим адресам находится какой-то мусор, который процессор выполнить не может, а отладчик в окне исходника тупо показывает соответствующую этому адресу строку.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорей всего отладчик показывает ерунду, после выполнения присвоения MAC1 = 0; в окне Command начинает выводиться ошибка

***JLink Error: CPU is not halted

А после останова отладчика иногда Keil вообще виснет, но чаще выходит на строку

Vectors         LDR     PC, Reset_Addr

Затем или ни куда больше не идёт или входит в Reset_Handler и остаётся в цикле, см. рисунок, R3 = 0.

post-5709-1380776230_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорей всего отладчик показывает ерунду, после выполнения присвоения MAC1 = 0; в окне Command начинает выводиться ошибка

 

А после останова отладчика иногда Keil вообще виснет, но чаще выходит на строку

Vectors         LDR     PC, Reset_Addr

Затем или ни куда больше не идёт или входит в Reset_Handler и остаётся в цикле, см. рисунок, R3 = 0.

ну нифига себе reset_handler :wacko:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну нифига себе reset_handler :wacko:

Мжно подробнее, а то не пойму впечатление:)

 

Я думаю отладчик при крахе уже не имеет доступа к ARM-у и делает что-то своё.

 

Закрыл я доработку по рекомендации errata.lpc2478_1.1.pdf виснуть на MAC1 = 0;, программа всё равно не работает. Нужно ли это изменение или нет???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мжно подробнее, а то не пойму впечатление :)

ну потому что Reset_Handler и PLL_Loop - это разные вещи :)

 

общее впечатление - проверить настройки PLL и Wait_States для Flash, это уже выше упоминали

 

 

 

 

И еще. Лично натыкался на глючное поведение отладчика, пока не распаял все требуемые резисторы на JTAG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы уверены что инструкция должна быть

LDR PC, Reset_Addr

а не

LDR PC, =Reset_Addr

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну потому что Reset_Handler и PLL_Loop - это разные вещи :)

А вы уверены что инструкция должна быть

LDR PC, Reset_Addr

а не

LDR PC, =Reset_Addr

Ну не знаю, я этот код не пмшу, он автоматически при создании проекта генерится.

Начало кода

				EXPORT  Reset_Handler
Reset_Handler   


; Clock Setup ------------------------------------------------------------------

			IF	  (:LNOT:(:DEF:NO_CLOCK_SETUP)):LAND:(CLOCK_SETUP != 0)
			LDR	 R0, =SCB_BASE
			MOV	 R1, #0xAA
			MOV	 R2, #0x55

;  Configure and Enable PLL
			LDR	 R3, =SCS_Val		 ; Enable main oscillator
			STR	 R3, [R0, #SCS_OFS] 

			IF	  (SCS_Val:AND:OSCEN) != 0  
OSC_Loop		LDR	 R3, [R0, #SCS_OFS]   ; Wait for main osc stabilize
			ANDS	R3, R3, #OSCSTAT
			BEQ	 OSC_Loop
			ENDIF

			LDR	 R3, =CLKSRCSEL_Val   ; Select PLL source clock
			STR	 R3, [R0, #CLKSRCSEL_OFS] 
			LDR	 R3, =PLLCFG_Val
			STR	 R3, [R0, #PLLCFG_OFS] 
			STR	 R1, [R0, #PLLFEED_OFS]
			STR	 R2, [R0, #PLLFEED_OFS]
			MOV	 R3, #PLLCON_PLLE
			STR	 R3, [R0, #PLLCON_OFS]
			STR	 R1, [R0, #PLLFEED_OFS]
			STR	 R2, [R0, #PLLFEED_OFS]

			IF	  (CLKSRCSEL_Val:AND:3) != 2
;  Wait until PLL Locked (if source is not RTC oscillator)
PLL_Loop		LDR	 R3, [R0, #PLLSTAT_OFS]
			ANDS	R3, R3, #PLLSTAT_PLOCK
			BEQ	 PLL_Loop
			ELSE
;  Wait at least 200 cycles (if source is RTC oscillator)
			MOV	 R3, #(200/4)
PLL_Loop		SUBS	R3, R3, #1
			BNE	 PLL_Loop
			ENDIF

M_N_Lock		LDR	 R3, [R0, #PLLSTAT_OFS]
			LDR	 R4, =(PLLSTAT_M:OR:PLLSTAT_N)
			AND	 R3, R3, R4
			LDR	 R4, =PLLCFG_Val
			EORS	R3, R3, R4
			BNE	 M_N_Lock

"PLL и Wait_States для Flash" проверю.

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну не знаю, я этот код не пмшу, он автоматически при создании проекта генерится.

 

А Reset_Addr где?

 

И вообще нафига на асме инициализацию PLL делать? Это все на С прекрасно пишется...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это все на С прекрасно пишется...
Так это ж писать надо! А тут галочки расставил, и "оно самО".

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Reset_Addr где?

В стартовом коде есть строка аля

Reset_Addr      DCD     Reset_Handler

 

В Кейле "оно самО" все нормально генерит. =)

А вот то, что lpc2478 при неправильной инициализации mac улетает в астрал - проходил сам. И обходил (согласно еррате вроде). Но было это пару лет назад, сингулярность дает о себе знать - не помню подробностей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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