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

STM32L051K6 EEProm HAL винет функция чтения ворда

Приветствию.

Использую STM32L051K6. Пытаюсь сделать чтение из флеш следующим образом:

#define __EEAdr   0x08080001

uint32_t Data:

Data = *(__IO uint32_t*) __EEAdr ;

При выполнении этого кода проц зависает (вылитает в HardFault_Handler)

не пойму что делать.

PS

При чтении по адресу 0x08000001 работает...

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


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

13 минут назад, SergR сказал:

При выполнении этого кода проц зависает (вылитает в HardFault_Handler)

Ну а что-ж ему ещё делать раз Вы мануал не читаете? Невыровненный доступ однако.  :unknw:

Цитата

При чтении по адресу 0x08000001 работает...

Работает??? :shok: Да ладно?! А ничего, что мануал на Cortex-M0+ говорит:

The following data accesses always generate an alignment fault:
• Non word-aligned LDM and POP
• Non word-aligned STM and PUSH
• Non halfword-aligned LDR{S}H and STRH
Non word-aligned LDR and STR.

Вангую что не "работает", а просто компилятор выбросил это "чтение" как неиспользуемое.  :smile:

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


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

21 minutes ago, SergR said:

не пойму что делать.

Адрес нужно выровнить на границу слова и по-чаще обращаться к даташитам.

 

Изменено пользователем Forger

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


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

11 минут назад, Forger сказал:

Адрес нужно выровнить на границу слова и по-чаще обращаться к даташитам.

...и смотреть в листинг (или асм-окно дебаггера) - какие команды там получаются.  :smile:

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


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

При выполнении строки

Data = *(__IO uint32_t*) __EEAdr ;

Влетает в HardFault_Handler, затем рисет по вочдогу...

 

PS

Всё. Работает! Всем Спасибо, Вопрос снят.

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


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

20 минут назад, SergR сказал:

Влетает в HardFault_Handler, затем рисет по вочдогу...

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

 

Открываю за вас документацию, читаю (3.3.3 Reading NVM):

Цитата

To read the NVM content, take any address from Section 3.3.1: NVM organization. The clock of the memory interface must be running. (see MIFEN bit in Section 7.3.12: AHB peripheral clock enable register (RCC_AHBENR)).

Сделали?

 

Читаю дальше (3.5.1 Hard fault):

Цитата

A hard fault is generated on:
• The memory bus if a read access is attempted when RDP is set.
• The memory bus if a read as data is received; then, the memory interface is waiting for
a data/address during a half-page write (after the 1st address and before the 16th
address).
• The register bus if an incorrect value is written in PEKEYR, PRGKEYR, or OPTKEYR.

Тут вашего случая нет?

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


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

7 hours ago, SergR said:

Влетает в HardFault_Handler, затем рисет по вочдогу...

А вы сделайте правильный обработчик этого исключения. Алгоритм в книге Джозефа Ю есть. Правда на m0 там мало что можно выудить, не то, что в m3/m4(f). Но всё же. Чтобы в дальнейшем было понятно, почему фолт.

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


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

On 11/28/2019 at 3:16 AM, haker_fox said:

А вы сделайте правильный обработчик этого исключения. Алгоритм в книге Джозефа Ю есть. Правда на m0 там мало что можно выудить, не то, что в m3/m4(f). Но всё же. Чтобы в дальнейшем было понятно, почему фолт.

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

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


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

1 hour ago, DASM said:

Это типа регистры в исключении вычитать?

Да.

1 hour ago, DASM said:

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

Для этого вычитывается сохранённый во фрейме регистр PC. Но иногда там действительно мусор.

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


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

21 minutes ago, haker_fox said:

Да.

Для этого вычитывается сохранённый во фрейме регистр PC. Но иногда там действительно мусор.

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

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


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

5 hours ago, DASM said:

в лучшем случае увидеть что exception вызвал переключатель потоков, так что не помогало ни разу.

У меня FreeRTOS. Но довольно часто в PC - 1 команда действительно находится адрес процедуры, вызывавшей сбой. А в LR - адрес возврата. Более того, есть hardfault "точные" (precise) и "неточные" (imprecise). Во втором случае узнать адрес причину сбоя несколько проблематично, ибо команда, приведшая к этому, уже давно выполнена (как я понимаю, за счёт кэшей). Так вот, если эти кэши отключить, то исключение превращается в точное, и тогда уже можно заниматься отладкой.

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


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

20 минут назад, haker_fox сказал:

Так вот, если эти кэши отключить, то исключение превращается в точное, и тогда уже можно заниматься отладкой.

Нет, не превратится. Попробуйте. Кроме кешей есть ещё буфер записи. И всякие межшинные бриджи.

По крайней мере на CM3/CM4 - не превратится.

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


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

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

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

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

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

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

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

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

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

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