tag 0 15 декабря, 2011 Опубликовано 15 декабря, 2011 · Жалоба Осваиваю 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. В чём может быть причина? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pat 0 15 декабря, 2011 Опубликовано 15 декабря, 2011 · Жалоба tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08; Скорее всего происходит попытка записи по несуществующему адресу. tmppriority - это что. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tag 0 16 декабря, 2011 Опубликовано 16 декабря, 2011 · Жалоба Скорее всего происходит попытка записи по несуществующему адресу. tmppriority - это что. Эти функции (в приведённом выше фрагменте) взяты из библиотек которые пилагались к оценочному kit-у tmppriority переменная класса auto Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 16 декабря, 2011 Опубликовано 16 декабря, 2011 · Жалоба при выполнении строки:Спуститесь еще на уровень ниже. Поройдите по дизассемблированному коду и определите - на какой конкретно команде происходит прокол и что находится в используемых регистрах. [тут ерунду написал, удалил] В указанной вами строке используется чтение SCB->AIRCR, надо смотреть - действительно ли по этому адресу производится чтение и если нет - разбираться почему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tag 0 16 декабря, 2011 Опубликовано 16 декабря, 2011 · Жалоба Спуститесь еще на уровень ниже. Поройдите по дизассемблированному коду и определите - на какой конкретно команде происходит прокол и что находится в используемых регистрах. [тут ерунду написал, удалил] В указанной вами строке используется чтение 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 16 декабря, 2011 Опубликовано 16 декабря, 2011 · Жалоба Вот эти строчки неверны: NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 10; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 10; Там всего 4 бита на них в сумме (на preemption priority и subpriority). Группировка задаётся функцией NVIC_SetPriorityGrouping(). Вряд ли от этого будет HardFault, но всё же исправьте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tag 0 16 декабря, 2011 Опубликовано 16 декабря, 2011 · Жалоба Исправил, результат тот же. Впрочем, так и должно быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 16 декабря, 2011 Опубликовано 16 декабря, 2011 · Жалоба 0x08000568 4C1B LDR r4,[pc,#108]; @0x080005D8 <- Вылетает здесь Тогда проверьте значение, расположенное по указанному адресу (0x080005D8). Должно быть 0xE000ED00. Если это так, то всё, кранты - в ваш процессор забыли положить ядро:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tag 0 16 декабря, 2011 Опубликовано 16 декабря, 2011 · Жалоба Тогда проверьте значение, расположенное по указанному адресу (0x080005D8). Должно быть 0xE000ED00. Если это так, то всё, кранты - в ваш процессор забыли положить ядро :) по указанному адресу (0x080005D8) значение 0xE000ED0С Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 16 декабря, 2011 Опубликовано 16 декабря, 2011 · Жалоба А, ну да, правильно, я забыл смещение. Короче, в указанных строчках всё в порядке, ищите ошибку в другом месте. Обрезайте проект понемногу, ловите момент, когда ошибка пропадёт. Или наоборот, начните с пустого проекта и добавляйте помаленьку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chan 0 16 декабря, 2011 Опубликовано 16 декабря, 2011 · Жалоба Проверьте константу 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tag 0 19 декабря, 2011 Опубликовано 19 декабря, 2011 · Жалоба Проверьте константу RTC_IRQn на всякий случай ... с константой всё нормально Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tag 0 20 декабря, 2011 Опубликовано 20 декабря, 2011 · Жалоба Всем спасибо за участие. Проблема разрешилась, правда не пойму откуда ноги растут :) Я не указал что использовал ОС RL-RTX. Вызов NVIC_Init(&NVIC_InitStructure); производился внутри задачи - ошибка выскакивала, перенес её вызов в точку перед вызовом os_sys_init() ошибка исчезла. Видимо что-то происходит при инициализации ОС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 20 декабря, 2011 Опубликовано 20 декабря, 2011 · Жалоба Видимо, доступ к соответствующим регистрам разрешен только в привилегированном режиме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 22 декабря, 2011 Опубликовано 22 декабря, 2011 · Жалоба Видимо, доступ к соответствующим регистрам разрешен только в привилегированном режиме. Угу. Информация из первых рук: ;) 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться