STM32F100 внешние прерывания

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 394
Зарегистрирован: Сб апр 28, 2012 16:04:14

Сообщение 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;
}
Критикуешь - предлагай. Предлагаешь - делай. Делаешь - отвечай.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 394
Зарегистрирован: Сб апр 28, 2012 16:04:14

Сообщение sx386 »

На другом форуме написано что нужно добавить файл startup_stm32f10x_ld_vl.s в проект.
В каталоге CMSIS есть этот файл.
Добавил путь в Preprocessor

Пытался подключить в заголовке, хотя ни в одном описании такого нет.
Но компилятору не нравиться синтаксис файла

Код: Выделить всё

#include "startup_stm32f10x_ld_vl.s"
Подскажите, что делать ? Куда копать ?
Критикуешь - предлагай. Предлагаешь - делай. Делаешь - отвечай.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Подключить стартап в проект не через препроцессор, а через "Открыть файл" или аналогичное(зависит от IDE).
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Странно что он вообще без стартапа завелся.
Может ему по умолчанию какой-то левый стартап подсовывается(у кейла так), у которого вектора прерываний по другому названы. В результате имеем HardFault и сброс.
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 394
Зарегистрирован: Сб апр 28, 2012 16:04:14

Сообщение 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 
Критикуешь - предлагай. Предлагаешь - делай. Делаешь - отвечай.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение 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щики.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 394
Зарегистрирован: Сб апр 28, 2012 16:04:14

Сообщение sx386 »

Добавил в проект файл:

Код: Выделить всё

system_stm32f10x.c
Проект скомпилировался.
Теперь когда подношу руку, просто зависает.
Контроллер, кажись, продолжает работать, т.к. продолжает генерировать ШИМ.
Код, записанный в обработчик прерывания не выполняется.

Нажал стоп на отладке.
По ходу, оно пытается перейти на прерывание и там зависает.
Но я прописал сброс флага прерывания.

Код: Выделить всё

 EXTI->PR = EXTI_PR_PR0;
Изображение
Критикуешь - предлагай. Предлагаешь - делай. Делаешь - отвечай.
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

sx386 писал(а):По ходу, оно пытается перейти на прерывание и там зависает.
Вот на него и надо повесить брякпоинт и шагая следить за изменениями в регистрах NVIC и периферии чтобы понять где в проге косяк.

Еще часто не лишним бывает добавить обработчики NMI и HardFault с бесконечными циклами while(1) чтобы отловить странные глюки.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 394
Зарегистрирован: Сб апр 28, 2012 16:04:14

Сообщение sx386 »

Когда подвисает, изменяются вот эти регистры.
Изображение
Изображение
Критикуешь - предлагай. Предлагаешь - делай. Делаешь - отвечай.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 394
Зарегистрирован: Сб апр 28, 2012 16:04:14

Сообщение 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.
Критикуешь - предлагай. Предлагаешь - делай. Делаешь - отвечай.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 394
Зарегистрирован: Сб апр 28, 2012 16:04:14

Сообщение sx386 »

Разобрался.

CMSIS была старая.
Скопировал с заменой файла "core_cm3.h" из IAR в CMSIS проекта и всё заработало !
Критикуешь - предлагай. Предлагаешь - делай. Делаешь - отвечай.
Ответить

Вернуться в «ARM»