ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
671384
Звероящер (30.04.2016 23:50, просмотров: 32771)
Ну так вот. Наигрался я с STM32CubeMX и решил начать сам говнокодить. И споткнулся же об первые грабли с прерываниями. Почитал доки на сам ИАР, вкурил, что надо cstartup.c пристёгивать и все прерывания там описывать. А в итоге - хер какой-то. Пытаюсь в симуляторе найти код обработчика прерывания и не вижу его. Чую, что где-то одной строчки не хватает, но вот где... Код ниже. Это cstartup.c /************************************************** * * This file contains an interrupt vector for Cortex-M written in C. * The actual interrupt functions must be provided by the application developer. * * Copyright 2007 IAR Systems. All rights reserved. * * $Revision: 66254 $ * **************************************************/ #pragma language=extended #pragma segment="CSTACK" extern void __iar_program_start( void ); extern void NMI_Handler( void ); extern void HardFault_Handler( void ); extern void MemManage_Handler( void ); extern void BusFault_Handler( void ); extern void UsageFault_Handler( void ); extern void SVC_Handler( void ); extern void DebugMon_Handler( void ); extern void PendSV_Handler( void ); extern void SysTick_Handler( void ); extern void AssHandler( void ); typedef void( *intfunc )( void ); typedef union { intfunc __fun; void * __ptr; } intvec_elem; // The vector table is normally located at address 0. // When debugging in RAM, it can be located in RAM, aligned to at least 2^6. // If you need to define interrupt service routines, // make a copy of this file and include it in your project. // The name "__vector_table" has special meaning for C-SPY, which // is where to find the SP start value. // If vector table is not located at address 0, the user has to initialize // the NVIC vector table register (VTOR) before using interrupts. #pragma location = ".intvec" const intvec_elem __vector_table[] = { { .__ptr = __sfe( "CSTACK" ) }, __iar_program_start, NMI_Handler, HardFault_Handler, MemManage_Handler, BusFault_Handler, UsageFault_Handler, 0, 0, 0, 0, SVC_Handler, DebugMon_Handler, 0, PendSV_Handler, SysTick_Handler, AssHandler }; #pragma call_graph_root = "interrupt" __weak void NMI_Handler( void ) { while (1) {} } #pragma call_graph_root = "interrupt" __weak void HardFault_Handler( void ) { while (1) {} } #pragma call_graph_root = "interrupt" __weak void MemManage_Handler( void ) { while (1) {} } #pragma call_graph_root = "interrupt" __weak void BusFault_Handler( void ) { while (1) {} } #pragma call_graph_root = "interrupt" __weak void UsageFault_Handler( void ) { while (1) {} } #pragma call_graph_root = "interrupt" __weak void SVC_Handler( void ) { while (1) {} } #pragma call_graph_root = "interrupt" __weak void DebugMon_Handler( void ) { while (1) {} } #pragma call_graph_root = "interrupt" __weak void PendSV_Handler( void ) { while (1) {} } #pragma call_graph_root = "interrupt" __weak void SysTick_Handler( void ) { while (1) {} } void __main( void ); #pragma required=__vector_table void __iar_program_start( void ) { __main(); } А это - main #include <iostm32f10xx4.h> volatile int t = 0; void AssHandler( void ) { GPIOA_ODR = t; } void main() { while(1) { t++; } }