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

Вопросы програмирования LPC2294

On 7/21/2023 at 2:36 AM, MPetrovich said:
SCS = 0;

А в остальном то как?

Могло бы работать, возможно и работает. Телепаты и экстрасенсы в отпусках. Проверьте в симуляторе, кейл по-моему это позволяет. Бог знает что у вас там за кроватка :wink2: 

/*Смайлы крутые тут, ностальгические :dance3:, спасибо что сохранили.*/ 

On 7/21/2023 at 2:43 AM, jcxz said:

не имеет смысла.

Наверно имеет если оптимизатор не выкинул.

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


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

9 minutes ago, jcxz said:

не имеет смысла.

Не понял. Счётчик считает от нуля до заданного значения. Что не так?

 

10 minutes ago, jcxz said:

Естественно.

Это для Вас естественно. Я посмотрел схему оценочной платы и там не нашел места, куда выводы BOOT[1:0] подключаются. А если надо подключать, то какую конфигурацию памяти выбирать?

13 minutes ago, jcxz said:

Советую: прежде чем начинать программировать какой-то МК, прочитать на него мануал. Чего вы (как видно по "коду") не сделали.

Вообще то я читал даташит и мануал. Вы лучше скажите в чём ошибка кода.

2 minutes ago, skripach said:

Бог знает что у вас там за кроватка :wink2: 

Нормальная кроватка, проверенная неоднократно. Только позавчера в ней STM32 проверял - всё работает.

LPC2294.jpg

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


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

On 7/21/2023 at 12:58 PM, MPetrovich said:

Не понял. Счётчик считает от нуля до заданного значения. Что не так?

Оптимизатор выкинет

On 7/21/2023 at 12:58 PM, MPetrovich said:

Вообще то я читал даташит и мануал. Вы лучше скажите в чём ошибка кода.

 

У них в таблице векторов прерываний в в пустую ячейку надо что-то записать, чтобы МК понял, что он не пустой, а в нем что-то есть. Некоторые утилиты для прошивки сами это умеют делать.

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


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

12 минут назад, MPetrovich сказал:

Не понял. Счётчик считает от нуля до заданного значения. Что не так?

Цикл не имеет смысла, поэтому будет выкинут оптимизирующим компилятором.

В таких случаях нужно использовать volatile. Вроде уже 100500 раз говорилось.

12 минут назад, MPetrovich сказал:

Это для Вас естественно. Я посмотрел схему оценочной платы и там не нашел места, куда выводы BOOT[1:0] подключаются. А если надо подключать, то какую конфигурацию памяти выбирать?

BOOT-пины задают режим загрузки во всех МК LPC. Соответственно - неверная их установка, приводит к неработе программы. Что у вас там за схема - я не телепат угадывать.

12 минут назад, MPetrovich сказал:

Вообще то я читал даташит и мануал. Вы лучше скажите в чём ошибка кода.

Если бы читали, то знали бы, что IOSET читать не имеет смысла, а IOCLR - так и вообще write-only регистр.

4 минуты назад, dimka76 сказал:

У них в таблице векторов прерываний в в пустую ячейку надо что-то записать, чтобы МК понял, что он не пустой, а в нем что-то есть. Некоторые утилиты для прошивки сами это умеют делать.

Насколько помню: у LPC2xxx вектор 6 таблицы прерываний, если не изменяет память, должен содержать контрольную сумму всех прочих векторов таблицы прерываний. Но если ТС брал за основу чей-то готовый проект, то думаю это должно выполняться автоматом. Если это условие не выполняется, BOOT-ROM не передаст управление такому FLASH-коду.

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


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

On 7/21/2023 at 1:07 PM, jcxz said:

Цикл не имеет смысла, поэтому будет выкинут оптимизирующим компилятором.

В таких случаях нужно использовать volatile. Вроде уже 100500 раз говорилось.

__NOP() еще в цикл можно вставить. 

On 7/21/2023 at 1:07 PM, jcxz said:

Насколько помню: у LPC2xxx вектор 6 таблицы прерываний, если не изменяет память, должен содержать контрольную сумму всех прочих векторов таблицы прерываний. Но если ТС брал за основу чей-то готовый проект, то думаю это должно выполняться автоматом. Если это условие не выполняется, BOOT-ROM не передаст управление такому FLASH-коду.

FlashMagic кажется сам умеет вставлять

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


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

3 минуты назад, dimka76 сказал:

__NOP() еще в цикл можно вставить. 

Оптимизаторы выполняют свою работу обычно после компилятора. А значит NOP-ы также выкинут. Так как он не имеет side effect-а.

PS: Даже если оптимизация выключена или поставлена на минимум, всё равно писать код следует так, как если бы она была включена на максимум.

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


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

On 7/21/2023 at 1:20 PM, jcxz said:

Оптимизаторы выполняют свою работу обычно после компилятора. А значит NOP-ы также выкинут. Так как он не имеет side effect-а.

PS: Даже если оптимизация выключена или поставлена на минимум, всё равно писать код следует так, как если бы она была включена на максимум.

Ассемблерные вставки обычно volatile, поэтому не выкинет.

Вот CMSIS-CM3 для GCC (для ARM7TDMI под рукой ничего нет)

static __INLINE void __NOP()                      { __ASM volatile ("nop"); }

 

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


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

1 hour ago, jcxz said:

В таких случаях нужно использовать volatile. Вроде уже 100500 раз говорилось.

volatile функцию или какую-то переменную? А если на while заменить

while(cnt <= val) /* Delay */
		   cnt++;

всё равно оптимизатору не понравится?

Но даже если оптимизатор выкинет этот цикл, всё равно на выходе должен быть высокочастотный меандр...

1 hour ago, jcxz said:

BOOT-пины задают режим загрузки во всех МК LPC. Соответственно - неверная их установка, приводит к неработе программы. Что у вас там за схема - я не телепат угадывать.

Я в курсе что они задают режим загрузки. Только не знаю что выбрать то из предлагаемых вариантов загрузки.

BOOT[1:0] = 11 selects internal flash memory. Вроде бы так должно быть, поскольку программа после сброса должна из FLASHa выполняться. Правильно я понимаю?

1 hour ago, jcxz said:

Если бы читали, то знали бы, что IOSET читать не имеет смысла, а IOCLR - так и вообще write-only регистр.

А я где-то в коде читаю значения этих регистров?

 

1 hour ago, dimka76 said:

в таблице векторов прерываний в в пустую ячейку надо что-то записать, чтобы МК понял, что он не пустой, а в нем что-то есть

В какую ячейку и что надо записывать?

A в файле Stsrtap.s разве не настраиваются стек и прерывания?

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


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

On 7/21/2023 at 2:28 PM, MPetrovich said:

volatile функцию или какую-то переменную? А если на while заменить

while(cnt <= val) /* Delay */
		   cnt++;

всё равно оптимизатору не понравится?

Те же яйца - вид сбоку :sarcastic:

Вот, как-то так.

volatile uint32_t i;
for(i=0; i<1000UL; ++i){};
On 7/21/2023 at 2:28 PM, MPetrovich said:

В какую ячейку и что надо записывать?

A в файле Stsrtap.s разве не настраиваются стек и прерывания?

Ну вот, а говорили читали доки.

Это не прерываниt, это, как вам уже написал @jcxz, контрольная сумма содержимого векторов прерываний.

И в каждой программе, адреса в этой таблице, могут иметь разные значения. Поэтому не может быть универсального Stsrtap.s

Quote

Criterion for valid user code
Criterion for valid user code: The reserved ARM interrupt vector location (0x0000 0014)
should contain the 2’s complement of the check-sum of the remaining interrupt vectors.
This causes the checksum of all of the vectors together to be 0. The boot loader code
disables the overlaying of the interrupt vectors from the boot block, then checksums the
interrupt vectors in sector 0 of the flash. If the signatures match then the execution control
is transferred to the user code by loading the program counter with 0x0000 0000. Hence
the user flash reset vector should contain a jump instruction to the entry point of the user
application code.

 

 

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


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

16 minutes ago, dimka76 said:

Ну вот, а говорили читали доки.

Читал. И именно этот отрывок читал и перечитывал.

 

16 minutes ago, dimka76 said:

И в каждой программе, адреса в этой таблице, могут иметь разные значения. Поэтому не может быть универсального Stsrtap.s

Честно говоря, первый раз с таким сталкиваюсь. Для STM32 Startap всё делает сам, только частоты кварцев или ещё какие-то "железные" штуки надо подправлять.  А здесь..."вектор сброса флэш-памяти пользователя должен содержать инструкцию перехода к точке входа кода пользовательского приложения"... откуда я знаю где у меня точка входа и какую соответственно инструкцию в какой вектор писать...

Смотрел несколько примеров программ KEILa и там ничего подобного не видел. Если прерывания не используется, то про них и упоминания нет в коде.

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


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

1 минуту назад, MPetrovich сказал:

Честно говоря, первый раз с таким сталкиваюсь. Для STM32 Startap всё делает сам...

И там тоже все то же самое.
 

Цитата

откуда я знаю где у меня точка входа и какую соответственно инструкцию в какой вектор писать...

Точка входа обычно называется весьма стандартно, описана в доке на компилятор. Что там у вас, Keil? Значит точка входа это __main.

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


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

On 7/21/2023 at 3:20 PM, MPetrovich said:

откуда я знаю где у меня точка входа и какую соответственно инструкцию в какой вектор писать...

имя функции = адрес функции

On 7/21/2023 at 3:24 PM, Arlleex said:

Значит точка входа это __main.

Reset_Hanler

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


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

5 minutes ago, Arlleex said:

И там тоже все то же самое.

Но в первый раз написать код для STM32 никаких проблемм не вызвало. Примерно такой же и был - мигалка....

4 minutes ago, dimka76 said:

Reset_Hanler

И что в обработчике сброса надо указать? Где он, кстати должен находиться, в Startap?

; Reset Handler

                EXPORT  Reset_Handler
Reset_Handler   

Это вот оно?

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


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

Только что, dimka76 сказал:

Reset_Hanler

Нет, точка входа в среду выполнения Си-кода (юзер-кода) - __main (в разных компиляторах по-разному зовется).

А ResetHandler - это аппаратная точка входа, и не обязательно она должна служить местом для входа в __main.

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


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

4 minutes ago, Arlleex said:

Нет, точка входа в среду выполнения Си-кода (юзер-кода) - __main (в разных компиляторах по-разному зовется).

А ResetHandler - это аппаратная точка входа, и не обязательно она должна служить местом для входа в __main.

Речь идет о векторе сброса

13 minutes ago, MPetrovich said:

А здесь..."вектор сброса флэш-памяти пользователя должен содержать инструкцию перехода к точке входа кода пользовательского приложения"...

Хотя, что-то не то в этой фразе.

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


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

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

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

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

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

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

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

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

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

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