Страница 1 из 1
STM32F100 внешние прерывания
Добавлено: Пт мар 29, 2013 00:36:32
sx386
STM32F100
Пишу вот этот код, программирую.
Когда подношу руку, все светодиоды, подключённые к контроллеру - гаснут. Т.е. контроллер по ходу перестаёт работать.
Код: Выделить всё
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;
}
Код: Выделить всё
void EXTI0_IRQHandler(void)
{
EXTI->PR = EXTI_PR_PR0;
}
Re: STM32F100 внешние прерывания
Добавлено: Пт мар 29, 2013 15:32:04
sx386
На другом форуме написано что нужно добавить файл startup_stm32f10x_ld_vl.s в проект.
В каталоге CMSIS есть этот файл.
Добавил путь в Preprocessor
Пытался подключить в заголовке, хотя ни в одном описании такого нет.
Но компилятору не нравиться синтаксис файла
Подскажите, что делать ? Куда копать ?
Re: STM32F100 внешние прерывания
Добавлено: Пт мар 29, 2013 15:51:12
uk8amk
Подключить стартап в проект не через препроцессор, а через "Открыть файл" или аналогичное(зависит от IDE).
Re: STM32F100 внешние прерывания
Добавлено: Пт мар 29, 2013 15:56:31
uk8amk
Странно что он вообще без стартапа завелся.
Может ему по умолчанию какой-то левый стартап подсовывается(у кейла так), у которого вектора прерываний по другому названы. В результате имеем HardFault и сброс.
Re: STM32F100 внешние прерывания
Добавлено: Пт мар 29, 2013 16:22:59
sx386
Добавил в проект. На проекте нажимаю "Add->Add Files".
IAR V6.50.3.4676
Код: Выделить всё
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
-----------------------------------------------------------------------------------------
Когда я подключил впервые CMSIS оно выдавало ошибки.
Я просто вырезал код, который выдаёт ошибки.
Может из-за этого не работает ?
Код: Выделить всё
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
Re: STM32F100 внешние прерывания
Добавлено: Пт мар 29, 2013 16:49:44
uk8amk
Ради отключения мозга программеров(особенно начинающих) была изобретена StdPeriph Lib - библиотека инициализации периферии. Туда и идет вызов System Init.
Я ее не использую и отредактировал свой стартап:
Код: Выделить всё
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
;IMPORT SystemInit
; LDR R0, =SystemInit
; BLX R0
LDR R0, =__main
BX R0
ENDP
По второй части вопроса - вы включили в проект что-то лишнее или наоборот что-то не включили. Пусть лучше подскажут IARщики.
Re: STM32F100 внешние прерывания
Добавлено: Пт мар 29, 2013 17:07:28
sx386
Добавил в проект файл:
Проект скомпилировался.
Теперь когда подношу руку, просто зависает.
Контроллер, кажись, продолжает работать, т.к. продолжает генерировать ШИМ.
Код, записанный в обработчик прерывания не выполняется.
Нажал стоп на отладке.
По ходу, оно пытается перейти на прерывание и там зависает.
Но я прописал сброс флага прерывания.

Re: STM32F100 внешние прерывания
Добавлено: Пт мар 29, 2013 19:39:54
uk8amk
sx386 писал(а):По ходу, оно пытается перейти на прерывание и там зависает.
Вот на него и надо повесить брякпоинт и шагая следить за изменениями в регистрах NVIC и периферии чтобы понять где в проге косяк.
Еще часто не лишним бывает добавить обработчики NMI и HardFault с бесконечными циклами while(1) чтобы отловить странные глюки.
Re: STM32F100 внешние прерывания
Добавлено: Пт мар 29, 2013 20:44:18
sx386
Когда подвисает, изменяются вот эти регистры.

Re: STM32F100 внешние прерывания
Добавлено: Сб мар 30, 2013 02:10:26
sx386
То же самое происходит при подключении таймера.
Висит на векторе прерывания.
Вот описание регистров. Перевёл со словарём, но ничего не понял.
VECTACTIVE
Код: Выделить всё
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.
RETTOBASE
Код: Выделить всё
This bit is 1 when the set of all active exceptions minus the IPSR_current_exception yields the empty set.
ACTIVE
Код: Выделить всё
Interrupt active flags:
1 = interrupt active or pre-empted and stacked
0 = interrupt not active or stacked.
Re: STM32F100 внешние прерывания
Добавлено: Сб мар 30, 2013 17:05:58
sx386
Разобрался.
CMSIS была старая.
Скопировал с заменой файла "core_cm3.h" из IAR в CMSIS проекта и всё заработало !