|
|
  |
Stm32 HardFault_Handler |
|
|
|
Dec 15 2011, 14:03
|
Частый гость
 
Группа: Свой
Сообщений: 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. В чём может быть причина?
|
|
|
|
|
Dec 15 2011, 14:18
|

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

|
Цитата(tag @ Dec 15 2011, 16:03)  Код tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08; Скорее всего происходит попытка записи по несуществующему адресу. tmppriority - это что.
|
|
|
|
|
Dec 16 2011, 06:39
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(Pat @ Dec 15 2011, 17:18)  Скорее всего происходит попытка записи по несуществующему адресу.
tmppriority - это что. Эти функции (в приведённом выше фрагменте) взяты из библиотек которые пилагались к оценочному kit-у tmppriority переменная класса auto
|
|
|
|
|
Dec 16 2011, 06:57
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 16 2011, 08:15
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
Dec 16 2011, 09:50
|

фанат дивана
     
Группа: Свой
Сообщений: 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, но всё же исправьте.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Dec 16 2011, 12:29
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

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

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

|
А, ну да, правильно, я забыл смещение. Короче, в указанных строчках всё в порядке, ищите ошибку в другом месте. Обрезайте проект понемногу, ловите момент, когда ошибка пропадёт. Или наоборот, начните с пустого проекта и добавляйте помаленьку.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Dec 16 2011, 15:59
|
Участник

Группа: Свой
Сообщений: 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);
|
|
|
|
|
Dec 19 2011, 09:09
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(chan @ Dec 16 2011, 18:59)  Проверьте константу RTC_IRQn на всякий случай ... с константой всё нормально
|
|
|
|
|
Dec 20 2011, 13:12
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Всем спасибо за участие. Проблема разрешилась, правда не пойму откуда ноги растут  Я не указал что использовал ОС RL-RTX. Вызов NVIC_Init(&NVIC_InitStructure); производился внутри задачи - ошибка выскакивала, перенес её вызов в точку перед вызовом os_sys_init() ошибка исчезла. Видимо что-то происходит при инициализации ОС.
|
|
|
|
|
Dec 22 2011, 15:31
|

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

|
Цитата(Dron_Gus @ Dec 20 2011, 19:46)  Видимо, доступ к соответствующим регистрам разрешен только в привилегированном режиме. Угу. Информация из первых рук:  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.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|