Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F100RBT6B +iar+обработчик прерываний
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Kalyan
Добрый вечер! Использую iar for arm играюсь с отладочной платой STM32VLDISCOVERY. Не знаю как написать обработчик прерываний. Я не использую ни каких там библиотек периферии и прочих наворотов. Подключил iostm32f100xB.h и пишу себе. Хочу использовать внешнее прерывание от int0. В файле iostm32f100xB.h нашел номер вектора
#define NVIC_EXTI0 22 /* EXTI Line0 interrupt.
Обработчик пытался написать во так:
#pragma vector=NVIC_EXTI0
__interrupt void event_ (void)
{}
Не работает.
Подскажите кто знает...
vovanse
Как-то так...

int main()
{
SCB->VTOR = FLASH_BASE;
NVIC_EnableIRQ (EXTI0_IRQn);
__enable_irq ();
....
....
....
return 0;
}

__irq void EXTI0_IRQHandler(void)
{
....
....
....
}
Danis
Цитата(Kalyan @ Jan 19 2012, 02:55) *
Не знаю как написать обработчик прерываний. Я не использую ни каких там библиотек периферии и прочих наворотов. Подключил iostm32f100xB.h и пишу себе. Хочу использовать внешнее прерывание от int0.
......
Подскажите кто знает...


Все-таки, ИМХО, для начала откройте и откомпилируйте готовые проекты. Наберетесь опыта, там уж свое напишите. Ну, если сами решите c 0-ля все писать, не забудьте подключить (написать свой) startup_stm32f10x(asm). Этой файл находится в
X:\Program Files\IAR Systems\Embedded Workbench6.xx\arm\examples\ST\STM32F10x\STM32-Eval\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\iar
Kalyan
Что делает SCB->VTOR = FLASH_BASE;?
NVIC_EnableIRQ (EXTI0_IRQn)- это с какой библиотеки: CMSIS или STM32 Peripheral Library ?
Заметил еще такую особенность: флаг прерывания генерируется в регистре EXTI_PR и без глобального разрешения прерываний(__enable_irq ()). Это нормально?
vovanse, использовал ваш вариант обработчика:
__irq void EXTI0_IRQHandler(void) - программа не заходит в него!
Kalyan
Ну не работает и все! Подскажите в чем дело!
Уже использую библиотеку CMSIS.
Вот код:

#include <stm32f10x.h>

int main()
{
RCC->APB2ENR|=(RCC_APB2ENR_IOPCEN|RCC_APB2ENR_IOPAEN); //подали тактирование на порт А и С

GPIOC->CRH|=(GPIO_CRH_MODE8_1|GPIO_CRH_MODE9_1); //настроил РС9, РС8 как выводы с ограниченой скоростью 2МГц
GPIOC->CRH&=~(GPIO_CRH_MODE8_0|GPIO_CRH_MODE9_0|GPIO_CRH_CNF9|GPIO_CRH_CNF8);

GPIOA->CRL&=~(GPIO_CRL_MODE0|GPIO_CRL_CNF0_1); //настроил А0 как плавающий вход
GPIOA->CRL|=GPIO_CRL_CNF0_0;

RCC->APB2ENR|=RCC_APB2ENR_AFIOEN; //включили тактирование альтернативных функций

AFIO->EXTICR[0]&=~AFIO_EXTICR1_EXTI0_PA; //EXTI0 на порт А

EXTI->IMR|=EXTI_IMR_MR0; //На нулевой ножке
EXTI->RTSR|=EXTI_RTSR_TR0; //по фронту

NVIC_EnableIRQ (EXTI0_IRQn); //включить прерывание

__enable_irq(); //глобально разрешить прерывания

while(1)
{
//полезные действия
}
}

void EXTI0_IRQHandler(void)
{
flag^=1;
EXTI->PR|=EXTI_PR_PR0 ; //очистить флаг прерывания
}

Обработчик прерывания находится в main.c.
При нажатии на кнопку программа зависает. Если посмотреть в дизасемблер то прога постоянно крутится в таких метках
Нажмите для просмотра прикрепленного файла
SSerge
Цитата(Kalyan @ Jan 22 2012, 04:55) *
При нажатии на кнопку программа зависает. Если посмотреть в дизасемблер то прога постоянно крутится в таких метках

Линкер не нашел вашего обработчика прерываний, остался дефолтный из ассемблерного файла.
http://electronix.ru/forum/index.php?showt...st&p=997644
electrmen
Цитата
Линкер не нашел вашего обработчика прерываний, остался дефолтный из ассемблерного файла.

Возможно вы не все файлы подключили к проекту. Такое бывает )). Почитайте http://be-em.ru
=GM=
Цитата(Kalyan @ Jan 21 2012, 21:55) *
Ну не работает и все! Подскажите в чем дело!
#include <stm32f10x.h>
При нажатии на кнопку программа зависает

Видимо вы используете стартап файл типа stm32f10x.s. Там по директиве EXPORT подключается обработчик по умолчанию с ловушкой, если не указан никакой другой обработчик (так устроена директива EXPORT). Поставьте обработчик в самом начале файла, а main - в конце, должно помочь.
Сергей Борщ
А в конце может выясниться, что у автора в настройках стоит "компилить в режиме С++" и линкер не видит обработчика из-за того, что он описан без extern "C".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.