Здравствуйте. Есть такой код:
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] для длинного кода!!!