|
Прерывания Cortex-M3, HardFault_Handler |
|
|
|
Mar 15 2012, 07:28
|
Участник
Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487
|
Цитата(rat @ Mar 15 2012, 14:12) void RTC_IRQHandler(void); Наверное проблема в ; Улетает прерывание в HardFault_Handler.
|
|
|
|
|
Mar 15 2012, 07:46
|
Участник
Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487
|
; для начала убрать надо
|
|
|
|
|
Mar 15 2012, 07:54
|
Местный
Группа: Свой
Сообщений: 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 при попытке войти в прерывание
|
|
|
|
|
Mar 15 2012, 08:03
|
Участник
Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487
|
Цитата(rat @ Mar 15 2012, 14:54) Поправил. Ошибка ; исчезла, но попрежнему HardFault_Handler при попытке войти в прерывание Теперь осталось выяснить адрес какой функции записан в векторе обработчика RTC. Обычно это в startup*.s написано
|
|
|
|
|
Mar 15 2012, 08:16
|
Местный
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 15 2012, 08:22
|
Участник
Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487
|
Можно посмотреть в пдф-е на проц точный адрес вектора RTC, посмотреть реальный адрес функции-обработчика, а потом убедиться(просмотром памяти), что в адресе вектора записан адрес именно этой функции. Тогда уже верняк.
|
|
|
|
|
Mar 19 2012, 08:00
|
Частый гость
Группа: Участник
Сообщений: 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] для длинных кодов!!!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|