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

8 minutes ago, Forger said:

Чтобы функции не вызывались, нужно избегать обращения к соот. области памяти.

А что служит причиной того, что KEil избегает обращения к соответствующей области памяти? Я ничего с шаблоном не делал, кроме инициализации GPIO. Он нулевый. И, так сказать, настроенный производителем. При этом в правильности настройки мной GPIO я не сомневаюсь - в функции init ножка меняет свое состояние по команде.

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


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

1 minute ago, MementoMori said:

А что служит причиной того, что KEil избегает обращения к соответствующей области памяти?

Очевидно - отсутствие этих объектов в указанных областях. 

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


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

16 minutes ago, Forger said:

т. е. линкером ничего там не размещать.

Вот содержимое target.lin  Вы об этом?

; Linker Control File (scatter-loading)
;

PRG 0 PI               ; Programming Functions
{
  PrgCode +0           ; Code
  {
    * (+RO)
  }
  PrgData +0           ; Data
  {
    * (+RW,+ZI)
  }
}

DSCR +0                ; Device Description
{
  DevDscr +0
  {
    FlashDev.o
  }
}

Я полагаю, производитель в этом файле разместил все что нужно. По крайней мере, в мануале про доп. настройки такого рода ничего не написано. Функции-то стандартные, неужели производитель чего-то недоразместил?

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


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

В общем, чистка кода инициализации помогла функция стирания секторов стала вызываться, правда возвращает ошибку. Видимо, дебаггер очень капризен к нагромождениям кода HAL. 

В основной программе работа с qspi идет без проблем, тот же код, вставленный в шаблон дает ошибку на этапе включения разрешения записи.

Еще более странным является то, что дебаггер отказывается работать с алгоритмом, если включаешь HSE. Так и должно быть?

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


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

Не пробовал  собрать мой проект и получить FLM. Отправлял в личных сообщениях? Там без HAL. Ошибку кейл не выдает при заливке. Правда на самом деле и не заливает:biggrin: 

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


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

33 minutes ago, pvo125 said:

Не пробовал  собрать мой проект и получить FLM. Отправлял в личных сообщениях? Там без HAL. Ошибку кейл не выдает при заливке. Правда на самом деле и не заливает:biggrin: 

Открывал я вашу прошивку - понятное дело она не заливает, так как функции заливки не прописаны. И понятно, почему ошибку не выдает - базовые функции возвращают 0. Попробую залить. Я вечером еще попробую поиграться с таймаутами,  еще почищу HAL код, функция стирания сектора у меня вызывается. Но после мнимого их стирания почему то не вызывается ProgramPage. А дебаггер при этом пишет, что хочет залить прошивку, но указывает при этом адрес 0х8хххх. То ли он пропускает этот этап и пытается писать во внутреннюю флеш, то ли он хочет писать во внешнюю, но ошибается адресом.

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


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

В проекте все функции записи страницы стирания сектора и инит прописаны. Они же в основной прошивке корректно работают.

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


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

13 minutes ago, pvo125 said:

проекте все функции записи страницы стирания сектора и инит прописаны. Они же в основной прошивке корректно работают.

Ах, да... я вас спутал с еще одним товарищем по несчастью с, которым списался на эту тему. Глянул Ваш код. Скажите, а вы увкрены, что все, что прописано в spiflash.c, в случае успеха возвращает 0, а при неудаче 1? А то ведь если наоборот, то алгоритм в случае ошибки будет думать, что все ОК.

Насчет Вашего кода - он привлекательно прости, но вот я неуверен, что смогу настроить spi на те же ноги - у меня qspi, да еще и в нестандартной конфигурации, с ремаппингом. Вечером гляну.

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


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

В том то и затык у меня. Эти же две функции запись страницы и очистки сектора хорошои срабатывают в самом проекте который используют эту же spi flash. Но вот в этом алгоритме для загрузки и стирания почему то не работают. Видимо нужно отлаживать сам проект алгоритиа. Делать какие то флаги и светодиода и моргать чтоб понять что вызывается и как. И да у меня сама флэшка qspi но используется старый контроллер который работает в режиме spu.

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


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

6 minutes ago, pvo125 said:

Видимо нужно отлаживать сам проект алгоритиа.

Не факт. Я писал уже выше - выдранный мной откуда-то код работы с qspi дважды вызывал hal_qspi_init. В основной программе контроллеру было пофиг, а вот в алгоритме это приводило к глюкам. Убрал строку - в основной программе ничего не произошло, а в алгоритме заработал вызов функций. То есть, с виду проблема в проекте, на деле же - с кодом.

У меня еще страннность - стирание секторов работает только со второго раза всегда. То есть запускаешь прошивание первый раз - выдается ошибка, запускаешь второй раз - перебираются адреса.

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


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

В общем, причина всех неудач найдена. У меня почему-то не работает sys_tick. В соответствующих функциях Hal_GetTick() возвращает ноль. В результате не отрабатываются таймауты при работе с qspi.

В сети пишут про обработку прерывания systick_handler, но оно у меня даже не вызывается. Вопросами а включены ли прерывания, а каков приоритет, я даже не задаюсь - функция HAL_Init все это отрабатывает.

В обычном проекте я вставляю эту функцию первой же строкой в main(), после чего все работает как часы.

Отсчет времени не работает, даже если меняю systick на TIM6. Его прерывание также не вызывается. То есть проблема со всеми прерываниями.

Скажите, а могут ли быть какие препятствия для прерываний, если код не обычный а является алгоритмом прошивки?  Я вот помню, что когда как-то раз делал бутлодер, нужно было менять что-то в таблице векторов прерываний... здесь ничего такого не надо делать? 

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


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

Ты вообще не понимаешь как процессор работает? Таблицу векторов прерываний сформировал? VTOR на неё натравил? Иначе откуда прерываниям взяться?

Почитал я этот триллер... Даю бесценные советы:

1. Флэшьлоадер нужно делать как можно проще. 

2. Никаких HSE и PLL. Для прошивки вполне достаточно работы от HSI.

3. В женский половой орган HAL. Смотри п.1

4. В ините из инициализации железа оставить конфигурацию GPIO  и  QSPI. На регистрах это с десяток команд, не больше.

5. Никаких прерываний. Если нужны задержки - покрути нопы в цикле.  Это как раз то место, где это уместно. Ничем другим проц в это время не занят.

6. Смотри п.3. Никаких  HAL-инитрв, SystemInit и прочей лабуды. Только реализовать функции, которые требует IDE для прошивки : инициализация, стереть сектор, записать сектор. Строго с теми параметрами на входе и на выходе, которые описаны в документации.

Делов то на 15 минут написать, ещё 15 отладить.

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


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

Спасибо за Ваши советы, обязательно учту их, но когда причина неработоспособности кода фактически локализована и остается ее только устранить - то хочется сделать именно это, а не переписывать заново код работы с qspi (который хорошо себя показал в обычном проекте).

Что касается таблицы векторов прерывания - она конечно же есть в файле .s. А вот про ее перенос я как-то не подумал. Я любитель и делала это один раз, лет пять назад, когда писал бутлодер. У меня один вопрос - адрес таблицы векторов должен указывать в ОЗУ, начинающийся с 0х20000000? А куда конкретно и как понять, куда?

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


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

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

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

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

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

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

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

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

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

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