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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Прерывания Cortex-M3, HardFault_Handler
rat
сообщение Mar 15 2012, 07:12
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 497
Регистрация: 9-06-05
Из: Новосибирск
Пользователь №: 5 852



Пробую прерывания в EFM32TG210. Пакет IAR 6.3 Код настройки:

//_______*** RTC ***_______

/* Enable RTC clock */
CMU->LFACLKEN0 |= CMU_LFACLKEN0_RTC;

RTC->IEN |= RTC_IEN_COMP0;

RTC->CTRL = RTC_CTRL_COMP0TOP | RTC_CTRL_DEBUGRUN;

RTC->COMP0 = 0x10000;

RTC->IFC = RTC_IFC_COMP0;

NVIC_EnableIRQ(RTC_IRQn);

RTC->CTRL |= RTC_CTRL_EN;

Хандлер:

void RTC_IRQHandler(void);
{
int current_time, next_time;

RTC->IFC = RTC_IFC_COMP0;

RTC->COMP0 = 0x10000;

GPIO->P[1].DOUT = (( 1<< 13) & (~(GPIO->P[1].DOUT)));
}

В дебугере вхожу в хандлер по шагам F11, процесс "зависает" - вернее начинает бежать не по шагам, как будто F5 нажал, когда останавливаешь, то в дизассемблере всякие BusFault_Handler, DebugMon_Handler, HardFault_Handler и т.д. Я прерывания не так настраиваю?
Go to the top of the page
 
+Quote Post
Mareng
сообщение Mar 15 2012, 07:28
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



Цитата(rat @ Mar 15 2012, 14:12) *
void RTC_IRQHandler(void);


Наверное проблема в ;
Улетает прерывание в HardFault_Handler.
Go to the top of the page
 
+Quote Post
rat
сообщение Mar 15 2012, 07:44
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 497
Регистрация: 9-06-05
Из: Новосибирск
Пользователь №: 5 852



Цитата(Mareng @ Mar 15 2012, 14:28) *
Наверное проблема в ;
Улетает прерывание в HardFault_Handler.


При попытке убрать ; появляется Error[Pe065]: expected a ";"
Go to the top of the page
 
+Quote Post
Mareng
сообщение Mar 15 2012, 07:46
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



; для начала убрать надо
Go to the top of the page
 
+Quote Post
rat
сообщение Mar 15 2012, 07:54
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 497
Регистрация: 9-06-05
Из: Новосибирск
Пользователь №: 5 852



Цитата(Mareng @ Mar 15 2012, 14:46) *
; для начала убрать надо


При попытке убрать ; появляется Error[Pe065]: expected a ";"

Цитата(rat @ Mar 15 2012, 14:49) *
При попытке убрать ; появляется Error[Pe065]: expected a ";"

Поправил. Ошибка ; исчезла, но попрежнему HardFault_Handler при попытке войти в прерывание
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 15 2012, 07:56
Сообщение #6


Гуру
******

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



QUOTE (rat @ Mar 15 2012, 09:49) *
При попытке убрать ; появляется Error[Pe065]: expected a ";"
Значит ошибка где-то чуть раньше, вероятно в конце предыдущей функции забыли "}". Ибо с ";" это не функция обрабочика прерывания, а объявление функции и не связанный с ним кусок кода.


--------------------
На любой вопрос даю любой ответ
"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
Mareng
сообщение Mar 15 2012, 08:03
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



Цитата(rat @ Mar 15 2012, 14:54) *
Поправил. Ошибка ; исчезла, но попрежнему HardFault_Handler при попытке войти в прерывание

Теперь осталось выяснить адрес какой функции записан в векторе обработчика RTC. Обычно это в startup*.s написано
Go to the top of the page
 
+Quote Post
rat
сообщение Mar 15 2012, 08:16
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 497
Регистрация: 9-06-05
Из: Новосибирск
Пользователь №: 5 852



Цитата(Сергей Борщ @ Mar 15 2012, 14:56) *
Значит ошибка где-то чуть раньше, вероятно в конце предыдущей функции забыли "}". Ибо с ";" это не функция обрабочика прерывания, а объявление функции и не связанный с ним кусок кода.

Это да, поправил. В дизассемблере ошибка выглядит так: сразу после выполнения RTC->CTRL |= RTC_CTRL_EN; следует POP R4, PC вот после этого шага и происходит трабл, загорается "красная рука" (как при F5) и при остановке перечисляется куча фаультных хандлеров.

Цитата(Mareng @ Mar 15 2012, 15:03) *
Теперь осталось выяснить адрес какой функции записан в векторе обработчика RTC. Обычно это в startup*.s написано


В startup_EFM32tg.s написано:

PUBWEAK RTC_IRQHandler
SECTION .text:CODE:REORDER(1)
RTC_IRQHandler
B RTC_IRQHandler
Go to the top of the page
 
+Quote Post
Mareng
сообщение Mar 15 2012, 08:22
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



Можно посмотреть в пдф-е на проц точный адрес вектора RTC, посмотреть реальный адрес функции-обработчика, а потом убедиться(просмотром памяти), что в адресе вектора записан адрес именно этой функции. Тогда уже верняк.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 15 2012, 08:39
Сообщение #10


Гуру
******

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



QUOTE (rat @ Mar 15 2012, 10:16) *
сразу после выполнения RTC->CTRL |= RTC_CTRL_EN; следует POP R4, PC
Это возврат из функции. Куда именно оно должно вернуться? Стек настроен? Что лежит в первых восьми байтах стека перед выполнением этой команды? Там правильный адрес возврата, его никто не затирает? Или это у вас конец main(), в котором вы забыли сделать бесконечный цикл?


--------------------
На любой вопрос даю любой ответ
"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
rat
сообщение Mar 15 2012, 09:12
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 497
Регистрация: 9-06-05
Из: Новосибирск
Пользователь №: 5 852



Цитата(Сергей Борщ @ Mar 15 2012, 15:39) *
Это возврат из функции. Куда именно оно должно вернуться? Стек настроен? Что лежит в первых восьми байтах стека перед выполнением этой команды? Там правильный адрес возврата, его никто не затирает? Или это у вас конец main(), в котором вы забыли сделать бесконечный цикл?

Возврат из функции POP R4, PC при этом в R4 лежит 37E, т.е. должен произойти возврат на адрес 0х37E? Должно вернуться в следующую функцию, но она начинается по адресу 0х384. А по адресам 0х344-0х380 лежит DataTable. В этом дело?
Go to the top of the page
 
+Quote Post
rat
сообщение Mar 15 2012, 10:37
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 497
Регистрация: 9-06-05
Из: Новосибирск
Пользователь №: 5 852




Вопрос разрешился. Не был подключен файл startup_efm32tg.c Спасибо большое за помощь комраду Борщу )
Go to the top of the page
 
+Quote Post
batisto4ka
сообщение Mar 19 2012, 08:00
Сообщение #13


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

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Помогите разобраться с приоритетами прерываний. У меня реализован модбас чере зперрывания от юсарт и считывание внешнего ацп через exti(сигнал готовности данных). Но когда на входе ацп 0, то модбас работает прекрасно. а когда напряжение на вхоже повышается то модбас отвечает через раз.
CODE
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

USART_ITConfig(USART,USART_IT_ERR,ENABLE);
}
NVIC_SetPriority(USART2_IRQn,0); //!!
USART_ITConfig(USARTx,USART_IT_TC,ENABLE);
USART_ITConfig(USARTx,USART_IT_RXNE,ENABLE);

/*===============================================================================
===============================*/
void ADCRDYInterruptConfig (void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Line = EXTI_Line1|EXTI_Line13;
EXTI_Init(&EXTI_InitStructure);
}
/*===============================================================================
===============================*/
void ADCNVIC_Conf (void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*===============================================================================
===============================*/
void ADC2NVIC_Conf (void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}


и еще, возможно ли такое, что когда выполняется бесконечный цикл while, прерывания не срабатывают? потому что запись команд и чтение АЦп сделано через spi и очень часто когда виснет программа я ее останавливаю и останавливается на строчке while (!(SPIx->SR & SPI_SR_RXNE));
Код
uint8_t WriteSPI(SPI_TypeDef *  SPIx,uint8_t val)
{
   SPIx->DR = val;
   while (!(SPIx->SR & SPI_SR_RXNE));//while(!(SPI1->SR & 0x01));
   return SPIx->DR;                  
}


Сообщение отредактировал IgorKossak - Mar 19 2012, 10:17
Причина редактирования: [codebox] для длинных кодов!!!
Go to the top of the page
 
+Quote Post
batisto4ka
сообщение Mar 19 2012, 10:36
Сообщение #14


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

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Явно что-то с вайлом. Первыйй АЦП общается с контроллером через аппартаный SPI и виснет на while (!(SPIx->SR & SPI_SR_RXNE)), а второй АЦП через программно реализованный SPI там в релизации есть задержки и виснет на них на ожидании переполнения от таймера while(!TIMx->SR&TIM_FLAG_Update) {}. АЦП AD7734, камень stm32f103. Кто что скажет/посоветует?
Go to the top of the page
 
+Quote Post
Aaron
сообщение Mar 19 2012, 12:18
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Если хардварный SPI виснет на ожидании SPI_SR_RXNE, то либо SPI неправильно настроен, и надо в первую очередь проверить осциллографом наличие на контактах CLK и chip enable, либо всё же SPI работает, но где-то в системе работает обработчик прерывания по SPI, который сбрасывает событие, и основная программа его поэтому не видит (очень маловероятно).
По поводу ожидания таймера - таймер как-нибудь проверяли, что он запущен и работает? Проблема возникает ТОЛЬКО при работе с АЦП?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th May 2024 - 19:46
Рейтинг@Mail.ru


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