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

 
 
> Прерывания 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
 
Start new topic
Ответов
ohmjke
сообщение Apr 1 2012, 15:38
Сообщение #2


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

Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094



Здравствуйте. Есть такой код:
CODE
#define STM32F10X_MD_VL
#include "stm32f10x.h"

uint8_t change = 0;

void __EXTI0_IRQHandler (void) {
if (change == 0) {
change = 1;
GPIOC->BSRR = GPIO_BSRR_BS8 | GPIO_BSRR_BR9;
} else {
change = 0;
GPIOC->BSRR = GPIO_BSRR_BR8 | GPIO_BSRR_BS9;
};
EXTI->PR = EXTI_PR_PR0;
};

static __INLINE void system_init (void) {
RCC->CR |= RCC_CR_HSEON;
while (!(RCC->CR & RCC_CR_HSERDY)) {};
RCC->CFGR |= RCC_CFGR_PLLMULL_0 | RCC_CFGR_PLLSRC;
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY)) {};
RCC->CFGR |= RCC_CFGR_SW_1;
while (!(RCC->CFGR & RCC_CFGR_SWS_PLL)) {};
RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN |
RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN);
};

int __main (void) {
system_init ();
GPIOC->CRH &= ~GPIO_CRH_CNF8 & ~GPIO_CRH_CNF9 & ~GPIO_CRH_MODE8 & ~GPIO_CRH_MODE9;
GPIOC->CRH |= GPIO_CRH_MODE8_0 | GPIO_CRH_MODE8_1 | GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;

AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PA;
EXTI->FTSR |= EXTI_RTSR_TR0;
EXTI->RTSR |= EXTI_RTSR_TR0;
EXTI->IMR |= EXTI_IMR_MR0;
NVIC_SetPriority (EXTI0_IRQn, 15);
NVIC_EnableIRQ (EXTI0_IRQn);
__enable_irq ();

GPIOC->BSRR = GPIO_BSRR_BR8 | GPIO_BSRR_BS9;

while (1) {
};
};

При этом содержимое *.s файла такое:
CODE
sram_base EQU 0x20000000
sram_size EQU 0x2000
stack_top EQU (sram_base + sram_size)
;------------------------------------------------
AREA reset, DATA, READONLY
DCD stack_top
DCD RESET_Handler
DCD 0;NMI_Handler ; NMI Handler
DCD 0;HardFault_Handler ; Hard Fault Handler
DCD 0;MemManage_Handler ; MPU Fault Handler
DCD 0;BusFault_Handler ; Bus Fault Handler
DCD 0;UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0;SVC_Handler ; SVCall Handler
DCD 0;DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD 0;PendSV_Handler ; PendSV Handler
DCD 0;SysTick_Handler ; SysTick Handler
; External Interrupts
DCD 0;WWDG_IRQHandler ; Window Watchdog
DCD 0;PVD_IRQHandler ; PVD through EXTI Line detect
DCD 0;TAMPER_IRQHandler ; Tamper
DCD 0;RTC_IRQHandler ; RTC
DCD 0;FLASH_IRQHandler ; Flash
DCD 0;RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD 0;EXTI1_IRQHandler ; EXTI Line 1
DCD 0;EXTI2_IRQHandler ; EXTI Line 2
DCD 0;EXTI3_IRQHandler ; EXTI Line 3
DCD 0;EXTI4_IRQHandler ; EXTI Line 4
DCD 0;DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD 0;DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD 0;DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD 0;DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD 0;DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD 0;DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD 0;DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD 0;ADC1_IRQHandler ; ADC1
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0;EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD 0;TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15
DCD 0;TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16
DCD 0;TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17
DCD 0;TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD 0;TIM2_IRQHandler ; TIM2
DCD 0;TIM3_IRQHandler ; TIM3
DCD 0 ; Reserved
DCD 0;I2C1_EV_IRQHandler ; I2C1 Event
DCD 0;I2C1_ER_IRQHandler ; I2C1 Error
DCD 0;0 ; Reserved
DCD 0 ; Reserved
DCD 0;SPI1_IRQHandler ; SPI1
DCD 0 ; Reserved
DCD 0;USART1_IRQHandler ; USART1
DCD 0;USART2_IRQHandler ; USART2
DCD 0 ; Reserved
DCD 0;EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD 0;RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD 0;CEC_IRQHandler ; HDMI-CEC
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0;TIM6_DAC_IRQHandler ; TIM6 and DAC underrun
DCD 0;TIM7_IRQHandler ; TIM7
;------------------------------------------------
AREA main_code, CODE, READONLY
RESET_Handler PROC
ENTRY
IMPORT __main
LDR R0, =__main
BX R0
ENDP

EXTI0_IRQHandler\
PROC
IMPORT __EXTI0_IRQHandler
ENDP
;------------------------------------------------
AREA stack, DATA, READWRITE
SPACE 0x1000
;------------------------------------------------
END


Прогоняю его в отладчике, при нажатии на кнопку устанавливается бит PR0 регистра EXTI_PR, но перехода к обработчику прерывания не происходит, программа так и крутится в бесконечном цикле. Никак не могу понять, что я делаю не так?

Сообщение отредактировал IgorKossak - Apr 1 2012, 17:03
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- rat   Прерывания Cortex-M3   Mar 15 2012, 07:12
- - Mareng   Цитата(rat @ Mar 15 2012, 14:12) void RTC...   Mar 15 2012, 07:28
|- - rat   Цитата(Mareng @ Mar 15 2012, 14:28) Навер...   Mar 15 2012, 07:44
- - Mareng   ; для начала убрать надо   Mar 15 2012, 07:46
|- - rat   Цитата(Mareng @ Mar 15 2012, 14:46) ; для...   Mar 15 2012, 07:54
|- - Сергей Борщ   QUOTE (rat @ Mar 15 2012, 09:49) При попы...   Mar 15 2012, 07:56
||- - rat   Цитата(Сергей Борщ @ Mar 15 2012, 14:56) ...   Mar 15 2012, 08:16
||- - Сергей Борщ   QUOTE (rat @ Mar 15 2012, 10:16) сразу по...   Mar 15 2012, 08:39
||- - rat   Цитата(Сергей Борщ @ Mar 15 2012, 15:39) ...   Mar 15 2012, 09:12
||- - rat   Вопрос разрешился. Не был подключен файл startup_e...   Mar 15 2012, 10:37
|- - Mareng   Цитата(rat @ Mar 15 2012, 14:54) Поправил...   Mar 15 2012, 08:03
- - Mareng   Можно посмотреть в пдф-е на проц точный адрес вект...   Mar 15 2012, 08:22
- - batisto4ka   Помогите разобраться с приоритетами прерываний. У ...   Mar 19 2012, 08:00
- - batisto4ka   Явно что-то с вайлом. Первыйй АЦП общается с контр...   Mar 19 2012, 10:36
- - Aaron   Если хардварный SPI виснет на ожидании SPI_SR_RXNE...   Mar 19 2012, 12:18
- - batisto4ka   Да, только при работе с АЦП. Еще есть один вопрос,...   Mar 19 2012, 13:42
- - Aaron   Конечно, организовать можно по-разному, и смешать ...   Mar 20 2012, 07:10
- - batisto4ka   CODEvoid EXTI1_IRQHandler(void) { static uint8_t ...   Mar 20 2012, 08:40
- - Aaron   Дак судя по коду вообще получается, что у вас пери...   Mar 20 2012, 09:22
- - batisto4ka   ну это не весь код естесственно, это сами обработч...   Mar 20 2012, 11:30
- - Aaron   я это понимаю. но из кода функций WriteSPI и ADC_D...   Mar 20 2012, 12:52
- - batisto4ka   они не зависают,а подвисают..если сделать функцию ...   Mar 20 2012, 13:08
- - ohmjke   Решил проблему, мой косяк был. Надо было делать не...   Apr 2 2012, 13:44
- - lead_seller   to batisto4ka: 1. По зависанию SPI в цикле ожидан...   Apr 3 2012, 17:44


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

 


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


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