STM32, IAR и прерывания

Кто любит RISC в жизни, заходим, не стесняемся.
Looper
Родился
Сообщения: 2
Зарегистрирован: Чт июн 13, 2013 12:34:00

STM32, IAR и прерывания

Сообщение Looper »

Приветствую всех!

Использую процессор STM32F101V8 и среду разработки IAR. Требуется помощь при работе с прерываниями.
Имеется вот такой код:

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

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void SystemInit(void)
{
 
}
// Обработка прерывания
void TIM6_DAC_IRQHandler(void)
{
  TIM6->SR &= ~TIM_SR_UIF; //сбросили флаг
GPIOD->ODR^=GPIO_Pin_4; //Инвертируем состояние светодиода
}

int main()
{
GPIO_InitTypeDef PORT;
//Тактируем порт и таймер
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
//Настраиваем порт
PORT.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
PORT.GPIO_Mode = GPIO_Mode_Out_PP;
PORT.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &PORT);
TIM6->PSC = 8000 - 1; // настраиваем делитель на 1000 тиков в секунду
TIM6->ARR = 1000 ; // Прерывание раз в секунду
TIM6->DIER |= TIM_DIER_UIE; //Разрешаем прерывание от таймера
TIM6->CR1 |= TIM_CR1_CEN; // Начинаем отсчет
NVIC_EnableIRQ(TIM6_DAC_IRQn); //Разрешаем TIM6_DAC_IRQn прерывания
__enable_irq();
while(1)
{
//Ничего не делаем, ждем прерывания
}
 
}


Проблема в том, что на прерывание МК не реагирует, отсюда вопрос:
что-то не так в коде или это какая-то фишка IAR'а, так как я читал, что есть какие-то нюансы с его настройкой?

/summon SMT32_IAR_GURU

Заранее спасибо за помощь!
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32, IAR и прерывания

Сообщение Satyr »

Ну а таблицу то прерываний прилинковал ? -))
TIM6_DAC_IRQHandler из откуда дергается ?
Looper
Родился
Сообщения: 2
Зарегистрирован: Чт июн 13, 2013 12:34:00

Re: STM32, IAR и прерывания

Сообщение Looper »

Satyr писал(а):Ну а таблицу то прерываний прилинковал ? -))
TIM6_DAC_IRQHandler из откуда дергается ?

Мне казалось, что таблица прерываний прописана в "stm32f10x.h", нет?
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32, IAR и прерывания

Сообщение Satyr »

Looper писал(а):
Satyr писал(а):Ну а таблицу то прерываний прилинковал ? -))
TIM6_DAC_IRQHandler из откуда дергается ?

Мне казалось, что таблица прерываний прописана в "stm32f10x.h", нет?

В хеадере может быть прописан максимум ее формат, задекларированы функции.
Нужен компилируемый файл с таблицей прерываний (Си, асм по вкусу).
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32, IAR и прерывания

Сообщение Satyr »

Как вариант, в библиотеке с сайта СТ они в папке Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\iar валяются.
бери под свой тип МК и всё
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32, IAR и прерывания

Сообщение Satyr »

Вобщем если в мапе линкера строчки типа
__vector_table 0x00000000 Data Gb cstartup.o [1]
не обнаруживается, то с работой прерываний будет не очень :))

p.s. у STM32 по другому адресу лежит.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Re: STM32, IAR и прерывания

Сообщение amv2000 »

Так вроде таблица векторов в файле startup_stm32f10x_md_vl.s, я его цепляю и всё работает.
startup_stm32f10x_xx.s- набор файлов для каждой линейки семейства STM32, обеспечивающие инициализацию стека и таблицу векторов прерываний;
Выбираем в зависимости от линейки процессора.
startup_stm32f10x_cl.s - линейка «Connectivity Line»;
startup_stm32f10x_hd.s - линейки high-density «Access Line» и «Performance Line»;
startup_stm32f10x_hd_vl.s - линейка high-density «Value Line»;
startup_stm32f10x_ld.s - линейки low-density «Access Line» и «Performance Line»;
startup_stm32f10x_ld_vl.s - линейка low-density «Value Line»;
startup_stm32f10x_md.s - линейки medium-density «Access Line» и «Performance Line»;
startup_stm32f10x_md_vl.s - линейка medium-density «Value Line»;
startup_stm32f10x_xl.s - линейки xl-density «Access Line» и «Performance Line».
Аватара пользователя
optima
Прорезались зубы
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Re: STM32, IAR и прерывания

Сообщение optima »

STM32F101V8 в этом камне TIM6 отсутствует!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32, IAR и прерывания

Сообщение dosikus »

Looper писал(а):Приветствую всех!

Использую процессор STM32F101V8 и среду разработки IAR. Требуется помощь при работе с прерываниями.
Имеется вот такой код:

Проблема в том, что на прерывание МК не реагирует, отсюда вопрос:
что-то не так в коде или это какая-то фишка IAR'а, так как я читал, что есть какие-то нюансы с его настройкой?


Заранее спасибо за помощь!


В симуляторе проверяете ?
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32, IAR и прерывания

Сообщение Satyr »

dosikus писал(а):В симуляторе проверяете ?

В симуляторе все проще - там еще на ожидании PLL Ready все навечно встает -)))))))))))))
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32, IAR и прерывания

Сообщение dosikus »

Satyr писал(а):В симуляторе все проще - там еще на ожидании PLL Ready все навечно встает -)))))))))))))


В IAR в симуляторе прерывания включать надо . Остальное как то обходит , и готовность кварца и PLL ...
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: STM32, IAR и прерывания

Сообщение Psych »

Наверно поздно, но прерывания в иаре пишется не как функция!!
Попробуйте:

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

#pragma vector=TIM6_DAC_IRQHandler
__interrupt void TIM6(void)
{
}
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: STM32, IAR и прерывания

Сообщение ut1wpr »

Psych писал(а):Наверно поздно, но прерывания в иаре пишется не как функция!!

1. Уберите оба восклицательных знака.
2. Прочитайте заголовок темы.
Почему только с прагмой?
Не забыли, это не АВР?

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

INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 25)
 {
   if (TIM4_GetFlagStatus(TIM4_FLAG_Update)){
      TIM4_ClearFlag(TIM4_FLAG_Update);
      if( DelayTimer ) DelayTimer--;
   }
 }

И ведь работает. И в ИАРе..
С уважением,
Виктор.
bishop-strip
Открыл глаза
Сообщения: 71
Зарегистрирован: Чт окт 28, 2010 11:20:39

Re: STM32, IAR и прерывания

Сообщение bishop-strip »

Товаризи, помогите разобраться с прерываниями.
Работаю с платой STM32F4DISCOVERY. На ней есть кнопка (приявязана к порту A0)
В атоллике написал код:

Спойлерvoid initPushButtonInterrupt()
{
/* Включаем порт А */
RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

SYSCFG_EXTILineConfig((uint8_t)GPIOA, EXTI_PinSource0);
EXTI_InitTypeDef EXTI_InitStucture;
EXTI_InitStucture.EXTI_Line = EXTI_Line0;
EXTI_InitStucture.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStucture.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStucture.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStucture);

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
EXTI_ClearITPendingBit(EXTI_Line0);
NVIC_EnableIRQ(EXTI0_IRQn);
}

__interrupt void EXTI0()
{
//...код...
EXTI_ClearITPendingBit(EXTI_Line0);
}


Работал нормально. ОДнако в IAR-е не работает, почему и как это решить?
Заранее спасибо!
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: STM32, IAR и прерывания

Сообщение Myp3ik »

RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

Это как понимать :))

Может все же RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
Иван Сусанин - первый полупроводник :solder:
bishop-strip
Открыл глаза
Сообщения: 71
Зарегистрирован: Чт окт 28, 2010 11:20:39

Re: STM32, IAR и прерывания

Сообщение bishop-strip »

Возможно вы правы)
Но как только я нажимаю кнопку контроллер переходит в эту функцию:

Спойлер/**
* @brief This function handles Hard Fault exception.
* @param None
* @retval None
*/
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}


видимо, какая-то ошибка.
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: STM32, IAR и прерывания

Сообщение Myp3ik »

Я в иаре использую такой вид обработчика прерываний

void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
Иван Сусанин - первый полупроводник :solder:
bishop-strip
Открыл глаза
Сообщения: 71
Зарегистрирован: Чт окт 28, 2010 11:20:39

Re: STM32, IAR и прерывания

Сообщение bishop-strip »

Спасибо за ответы, но
Спойлерvoid EXTI0_IRQHandler(void)

и так тоже не работает...
Выскакивает exception... :o
bishop-strip
Открыл глаза
Сообщения: 71
Зарегистрирован: Чт окт 28, 2010 11:20:39

Re: STM32, IAR и прерывания

Сообщение bishop-strip »

Скажите пожалуйста, как вы настраиваете контроллер на работу с внешними прерываниями?
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32, IAR и прерывания

Сообщение Satyr »

Функцию можно назвать хоть ГуёМаё() - это как раз не важно.
Лишь бы в таблицу прерываний она встала.
А этому тут, как я вижу, уделяют третьестепенное внимание.
Ответить

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