skripach 5 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба On 7/21/2023 at 2:36 AM, MPetrovich said: SCS = 0; А в остальном то как? Могло бы работать, возможно и работает. Телепаты и экстрасенсы в отпусках. Проверьте в симуляторе, кейл по-моему это позволяет. Бог знает что у вас там за кроватка /*Смайлы крутые тут, ностальгические , спасибо что сохранили.*/ On 7/21/2023 at 2:43 AM, jcxz said: не имеет смысла. Наверно имеет если оптимизатор не выкинул. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 5 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба 9 minutes ago, jcxz said: не имеет смысла. Не понял. Счётчик считает от нуля до заданного значения. Что не так? 10 minutes ago, jcxz said: Естественно. Это для Вас естественно. Я посмотрел схему оценочной платы и там не нашел места, куда выводы BOOT[1:0] подключаются. А если надо подключать, то какую конфигурацию памяти выбирать? 13 minutes ago, jcxz said: Советую: прежде чем начинать программировать какой-то МК, прочитать на него мануал. Чего вы (как видно по "коду") не сделали. Вообще то я читал даташит и мануал. Вы лучше скажите в чём ошибка кода. 2 minutes ago, skripach said: Бог знает что у вас там за кроватка Нормальная кроватка, проверенная неоднократно. Только позавчера в ней STM32 проверял - всё работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба On 7/21/2023 at 12:58 PM, MPetrovich said: Не понял. Счётчик считает от нуля до заданного значения. Что не так? Оптимизатор выкинет On 7/21/2023 at 12:58 PM, MPetrovich said: Вообще то я читал даташит и мануал. Вы лучше скажите в чём ошибка кода. У них в таблице векторов прерываний в в пустую ячейку надо что-то записать, чтобы МК понял, что он не пустой, а в нем что-то есть. Некоторые утилиты для прошивки сами это умеют делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба 12 минут назад, MPetrovich сказал: Не понял. Счётчик считает от нуля до заданного значения. Что не так? Цикл не имеет смысла, поэтому будет выкинут оптимизирующим компилятором. В таких случаях нужно использовать volatile. Вроде уже 100500 раз говорилось. 12 минут назад, MPetrovich сказал: Это для Вас естественно. Я посмотрел схему оценочной платы и там не нашел места, куда выводы BOOT[1:0] подключаются. А если надо подключать, то какую конфигурацию памяти выбирать? BOOT-пины задают режим загрузки во всех МК LPC. Соответственно - неверная их установка, приводит к неработе программы. Что у вас там за схема - я не телепат угадывать. 12 минут назад, MPetrovich сказал: Вообще то я читал даташит и мануал. Вы лучше скажите в чём ошибка кода. Если бы читали, то знали бы, что IOSET читать не имеет смысла, а IOCLR - так и вообще write-only регистр. 4 минуты назад, dimka76 сказал: У них в таблице векторов прерываний в в пустую ячейку надо что-то записать, чтобы МК понял, что он не пустой, а в нем что-то есть. Некоторые утилиты для прошивки сами это умеют делать. Насколько помню: у LPC2xxx вектор 6 таблицы прерываний, если не изменяет память, должен содержать контрольную сумму всех прочих векторов таблицы прерываний. Но если ТС брал за основу чей-то готовый проект, то думаю это должно выполняться автоматом. Если это условие не выполняется, BOOT-ROM не передаст управление такому FLASH-коду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба 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 кажется сам умеет вставлять Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба 3 минуты назад, dimka76 сказал: __NOP() еще в цикл можно вставить. Оптимизаторы выполняют свою работу обычно после компилятора. А значит NOP-ы также выкинут. Так как он не имеет side effect-а. PS: Даже если оптимизация выключена или поставлена на минимум, всё равно писать код следует так, как если бы она была включена на максимум. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба 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"); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 5 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба 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 разве не настраиваются стек и прерывания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба On 7/21/2023 at 2:28 PM, MPetrovich said: volatile функцию или какую-то переменную? А если на while заменить while(cnt <= val) /* Delay */ cnt++; всё равно оптимизатору не понравится? Те же яйца - вид сбоку Вот, как-то так. 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 5 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба 16 minutes ago, dimka76 said: Ну вот, а говорили читали доки. Читал. И именно этот отрывок читал и перечитывал. 16 minutes ago, dimka76 said: И в каждой программе, адреса в этой таблице, могут иметь разные значения. Поэтому не может быть универсального Stsrtap.s Честно говоря, первый раз с таким сталкиваюсь. Для STM32 Startap всё делает сам, только частоты кварцев или ещё какие-то "железные" штуки надо подправлять. А здесь..."вектор сброса флэш-памяти пользователя должен содержать инструкцию перехода к точке входа кода пользовательского приложения"... откуда я знаю где у меня точка входа и какую соответственно инструкцию в какой вектор писать... Смотрел несколько примеров программ KEILa и там ничего подобного не видел. Если прерывания не используется, то про них и упоминания нет в коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 132 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба 1 минуту назад, MPetrovich сказал: Честно говоря, первый раз с таким сталкиваюсь. Для STM32 Startap всё делает сам... И там тоже все то же самое. Цитата откуда я знаю где у меня точка входа и какую соответственно инструкцию в какой вектор писать... Точка входа обычно называется весьма стандартно, описана в доке на компилятор. Что там у вас, Keil? Значит точка входа это __main. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба On 7/21/2023 at 3:20 PM, MPetrovich said: откуда я знаю где у меня точка входа и какую соответственно инструкцию в какой вектор писать... имя функции = адрес функции On 7/21/2023 at 3:24 PM, Arlleex said: Значит точка входа это __main. Reset_Hanler Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 5 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба 5 minutes ago, Arlleex said: И там тоже все то же самое. Но в первый раз написать код для STM32 никаких проблемм не вызвало. Примерно такой же и был - мигалка.... 4 minutes ago, dimka76 said: Reset_Hanler И что в обработчике сброса надо указать? Где он, кстати должен находиться, в Startap? ; Reset Handler EXPORT Reset_Handler Reset_Handler Это вот оно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 132 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба Только что, dimka76 сказал: Reset_Hanler Нет, точка входа в среду выполнения Си-кода (юзер-кода) - __main (в разных компиляторах по-разному зовется). А ResetHandler - это аппаратная точка входа, и не обязательно она должна служить местом для входа в __main. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 21 июля, 2023 Опубликовано 21 июля, 2023 · Жалоба 4 minutes ago, Arlleex said: Нет, точка входа в среду выполнения Си-кода (юзер-кода) - __main (в разных компиляторах по-разному зовется). А ResetHandler - это аппаратная точка входа, и не обязательно она должна служить местом для входа в __main. Речь идет о векторе сброса 13 minutes ago, MPetrovich said: А здесь..."вектор сброса флэш-памяти пользователя должен содержать инструкцию перехода к точке входа кода пользовательского приложения"... Хотя, что-то не то в этой фразе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться