void InterruptInit (void)
{
// Конфигурация линии как вход
#define BUTTON A, 0, HIGH, INPUT_FLOATING,
PIN_CONFIGURATION (BUTTON);
// Установка приоритета
NVIC_SetPriority(EXTI0_IRQn, 15);
// Разрешить прерывание
NVIC_EnableIRQ(EXTI0_IRQn);
// Cогласно документации необходимо разрешить тактирование
// AFIO (альтернативные функции линий ввода-вывода), так как регистры
// управления мультиплексорами находится в данном модуле:
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
// Установка прерывания на порт А вывод 0
AFIO->EXTICR[0] &= ~AFIO_EXTICR1_EXTI0_PA;
AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PA;
// Срабатывание по изменению уровня
EXTI->RTSR |= EXTI_RTSR_TR0;
EXTI->FTSR |= EXTI_FTSR_TR0;
// Разрешить генерацию прерывания от выбранной линии
EXTI->IMR |= EXTI_IMR_MR0;
}
Странно что он вообще без стартапа завелся.
Может ему по умолчанию какой-то левый стартап подсовывается(у кейла так), у которого вектора прерываний по другому названы. В результате имеем HardFault и сброс.
Building configuration: Project - Debug
Updating build tree...
Linking
Error[Li005]: no definition for "SystemInit" [referenced from D:\Common\STM32\STM32F100\Project\Debug\Obj\startup_stm32f10x_ld_vl.o]
Error while running Linker
Total number of errors: 1
Total number of warnings: 0
Building configuration: Project - Debug
Updating build tree...
main.cpp
Error[Pe337]: linkage specification is incompatible with previous "__nounwind __WFI" (declared at line 194 of "C:\Common 86\Embedded Workbench 6.5\arm\inc\c\intrinsics.h") D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1059
Error[Pe337]: linkage specification is incompatible with previous "__nounwind __WFE" (declared at line 193 of "C:\Common 86\Embedded Workbench 6.5\arm\inc\c\intrinsics.h") D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1060
Error[Pe337]: linkage specification is incompatible with previous "__nounwind __SEV" (declared at line 192 of "C:\Common 86\Embedded Workbench 6.5\arm\inc\c\intrinsics.h") D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1061
Error[Pe337]: linkage specification is incompatible with previous "__nounwind __CLREX" (declared at line 190 of "C:\Common 86\Embedded Workbench 6.5\arm\inc\c\intrinsics.h") D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1062
Error[Pe311]: cannot overload functions distinguished by return type alone D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1084
Error[Pe338]: more than one instance of overloaded function "__nounwind __set_PSP" has "C" linkage D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1094
Error[Pe311]: cannot overload functions distinguished by return type alone D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1104
Error[Pe338]: more than one instance of overloaded function "__nounwind __set_MSP" has "C" linkage D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1114
Error[Pe338]: more than one instance of overloaded function "__nounwind __REV16" has "C" linkage D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1124
Error[Pe338]: more than one instance of overloaded function "__nounwind __RBIT" has "C" linkage D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1134
Error[Pe311]: cannot overload functions distinguished by return type alone D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1175
Error[Pe311]: cannot overload functions distinguished by return type alone D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\core_cm3.h 1186
Fatal Error[Pe1696]: cannot open source file "stm32f10x_conf.h" D:\Common\STM32\STM32F100\Project\CMSIS\DeviceSupport\ST\STM32F10x\stm32f10x.h 8297
searched: "D:\Common\STM32\STM32F100\Project\CMSIS\DeviceSupport\ST\STM32F10x\"
searched: "D:\Common\STM32\STM32F100\Project\"
searched: "D:\Common\STM32\STM32F100\Project\CMSIS\CoreSupport\"
searched: "D:\Common\STM32\STM32F100\Project\CMSIS\DeviceSupport\ST\STM32F10x\startup\gcc_ride7\"
searched: "C:\Common 86\Embedded Workbench 6.5\arm\CMSIS\Include\"
searched: "C:\Common 86\Embedded Workbench 6.5\arm\inc\"
searched: "C:\Common 86\Embedded Workbench 6.5\arm\inc\c\"
searched: "C:\Common 86\Embedded Workbench 6.5\arm\inc\ecpp\"
Error while running C/C++ Compiler
Total number of errors: 13
Total number of warnings: 0
Ради отключения мозга программеров(особенно начинающих) была изобретена StdPeriph Lib - библиотека инициализации периферии. Туда и идет вызов System Init.
Я ее не использую и отредактировал свой стартап:
Проект скомпилировался.
Теперь когда подношу руку, просто зависает.
Контроллер, кажись, продолжает работать, т.к. продолжает генерировать ШИМ.
Код, записанный в обработчик прерывания не выполняется.
Нажал стоп на отладке.
По ходу, оно пытается перейти на прерывание и там зависает.
Но я прописал сброс флага прерывания.
Active ISR number field. VECTACTIVE contains the interrupt number of the currently running ISR, including NMI and Hard Fault. A shared handler can use VECTACTIVE to determine which interrupt invoked it. You can subtract 16 from the VECTACTIVE field to index into the Interrupt Clear/Set Enable, Interrupt Clear Pending/SetPending and Interrupt Priority Registers. INTISR[0] has vector number 16.
Reset clears the VECTACTIVE field.