реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Stm32 HardFault_Handler
tag
сообщение Dec 15 2011, 14:03
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Осваиваю STM32VLDISCOVERY. Запустил RTC и пытаюсь разрешить прерывания:




Код
    NVIC_InitTypeDef NVIC_InitStructure;
    
    // Enable the RTC Interrupt.
    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 10;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 10;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);






При вызове NVIC_Init() процессор вываливается в HardFault_Handler. Посмотрел пошагово эту функцию, при выполнении строки:

Код
tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;


я сразу же попадаю в HardFault_Handler. В чём может быть причина?

Go to the top of the page
 
+Quote Post
Pat
сообщение Dec 15 2011, 14:18
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 27-05-05
Из: Энергодар
Пользователь №: 5 480



Цитата(tag @ Dec 15 2011, 16:03) *
Код
tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;


Скорее всего происходит попытка записи по несуществующему адресу.

tmppriority - это что.
Go to the top of the page
 
+Quote Post
tag
сообщение Dec 16 2011, 06:39
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(Pat @ Dec 15 2011, 17:18) *
Скорее всего происходит попытка записи по несуществующему адресу.

tmppriority - это что.




Эти функции (в приведённом выше фрагменте) взяты из библиотек которые пилагались к оценочному kit-у tmppriority переменная класса auto


Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 16 2011, 06:57
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (tag @ Dec 15 2011, 16:03) *
при выполнении строки:
Спуститесь еще на уровень ниже. Поройдите по дизассемблированному коду и определите - на какой конкретно команде происходит прокол и что находится в используемых регистрах.
[тут ерунду написал, удалил]
В указанной вами строке используется чтение SCB->AIRCR, надо смотреть - действительно ли по этому адресу производится чтение и если нет - разбираться почему.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
tag
сообщение Dec 16 2011, 08:15
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(Сергей Борщ @ Dec 16 2011, 09:57) *
Спуститесь еще на уровень ниже. Поройдите по дизассемблированному коду и определите - на какой конкретно команде происходит прокол и что находится в используемых регистрах.
[тут ерунду написал, удалил]
В указанной вами строке используется чтение SCB->AIRCR, надо смотреть - действительно ли по этому адресу производится чтение и если нет - разбираться почему.





спустился ниже:





Код
       123:     tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
0x08000568 4C1B      LDR      r4,[pc,#108] ; @0x080005D8 <- Вылетает здесь
0x0800056A 6824      LDR      r4,[r4,#0x00]
0x0800056C F40464E0  AND      r4,r4,#0x700
0x08000570 F5C464E0  RSB      r4,r4,#0x700
0x08000574 EA4F2114  LSR      r1,r4,#8


Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 16 2011, 09:50
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Вот эти строчки неверны:
Цитата(tag @ Dec 15 2011, 20:03) *
Код
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 10;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 10;

Там всего 4 бита на них в сумме (на preemption priority и subpriority). Группировка задаётся функцией NVIC_SetPriorityGrouping().
Вряд ли от этого будет HardFault, но всё же исправьте.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
tag
сообщение Dec 16 2011, 10:11
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Исправил, результат тот же. Впрочем, так и должно быть.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 16 2011, 11:47
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(tag @ Dec 16 2011, 14:15) *
Код
0x08000568 4C1B      LDR      r4,[pc,#108]; @0x080005D8 <- Вылетает здесь

Тогда проверьте значение, расположенное по указанному адресу (0x080005D8). Должно быть 0xE000ED00. Если это так, то всё, кранты - в ваш процессор забыли положить ядроsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
tag
сообщение Dec 16 2011, 12:29
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(AHTOXA @ Dec 16 2011, 14:47) *
Тогда проверьте значение, расположенное по указанному адресу (0x080005D8). Должно быть 0xE000ED00. Если это так, то всё, кранты - в ваш процессор забыли положить ядро sm.gif


 по указанному адресу (0x080005D8) значение   0xE000ED0С




Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 16 2011, 15:28
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А, ну да, правильно, я забыл смещение.
Короче, в указанных строчках всё в порядке, ищите ошибку в другом месте. Обрезайте проект понемногу, ловите момент, когда ошибка пропадёт. Или наоборот, начните с пустого проекта и добавляйте помаленьку.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
chan
сообщение Dec 16 2011, 15:59
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 8-05-05
Пользователь №: 4 846



Проверьте константу RTC_IRQn на всякий случай

/* Enable the RTC Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
Go to the top of the page
 
+Quote Post
tag
сообщение Dec 19 2011, 09:09
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(chan @ Dec 16 2011, 18:59) *
Проверьте константу RTC_IRQn на всякий случай



... с константой всё нормально

Go to the top of the page
 
+Quote Post
tag
сообщение Dec 20 2011, 13:12
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Всем спасибо за участие. Проблема разрешилась, правда не пойму откуда ноги растут sm.gif Я не указал что  использовал ОС RL-RTX. Вызов NVIC_Init(&NVIC_InitStructure); производился внутри задачи - ошибка выскакивала, перенес её вызов в точку перед вызовом os_sys_init() ошибка исчезла. Видимо что-то происходит при инициализации ОС.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Dec 20 2011, 15:46
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



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


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Dec 22 2011, 15:31
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Dron_Gus @ Dec 20 2011, 19:46) *
Видимо, доступ к соответствующим регистрам разрешен только в привилегированном режиме.

Угу. Информация из первых рук: wink.gif

The privilege levels for software execution are:
• Unprivileged
The software:
– has limited access to the MSR and MRS instructions, and cannot use the CPS instruction
– cannot access the system timer, NVIC, or system control block
– might have restricted access to memory or peripherals.
Unprivileged software executes at the unprivileged level.
• Privileged
The software can use all the instructions and has access to all resources.
Privileged software executes at the privileged level.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016