Jump to content

    
Sign in to follow this  
SergR

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

Recommended Posts

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

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

#define __EEAdr   0x08080001

uint32_t Data:

Data = *(__IO uint32_t*) __EEAdr ;

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

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

PS

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

Share this post


Link to post
Share on other sites
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:

Share this post


Link to post
Share on other sites
11 минут назад, Forger сказал:

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

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

Share this post


Link to post
Share on other sites
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.

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

Share this post


Link to post
Share on other sites
7 hours ago, SergR said:

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

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

Share this post


Link to post
Share on other sites
On 11/28/2019 at 3:16 AM, haker_fox said:

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

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

Share this post


Link to post
Share on other sites
1 hour ago, DASM said:

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

Да.

1 hour ago, DASM said:

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

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

Share this post


Link to post
Share on other sites
21 minutes ago, haker_fox said:

Да.

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

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

Share this post


Link to post
Share on other sites
5 hours ago, DASM said:

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

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

Share this post


Link to post
Share on other sites
20 минут назад, haker_fox сказал:

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this