Страница 1 из 3

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

Добавлено: Чт июн 13, 2013 12:41:26
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

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

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

Добавлено: Чт июн 13, 2013 12:58:09
Satyr
Ну а таблицу то прерываний прилинковал ? -))
TIM6_DAC_IRQHandler из откуда дергается ?

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

Добавлено: Чт июн 13, 2013 14:06:36
Looper
Satyr писал(а):Ну а таблицу то прерываний прилинковал ? -))
TIM6_DAC_IRQHandler из откуда дергается ?

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

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

Добавлено: Чт июн 13, 2013 14:33:28
Satyr
Looper писал(а):
Satyr писал(а):Ну а таблицу то прерываний прилинковал ? -))
TIM6_DAC_IRQHandler из откуда дергается ?

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

В хеадере может быть прописан максимум ее формат, задекларированы функции.
Нужен компилируемый файл с таблицей прерываний (Си, асм по вкусу).

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

Добавлено: Чт июн 13, 2013 14:34:45
Satyr
Как вариант, в библиотеке с сайта СТ они в папке Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\iar валяются.
бери под свой тип МК и всё

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

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

p.s. у STM32 по другому адресу лежит.

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

Добавлено: Пт июн 14, 2013 07:37:53
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».

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

Добавлено: Пт июн 14, 2013 19:36:51
optima
STM32F101V8 в этом камне TIM6 отсутствует!

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

Добавлено: Вт июн 18, 2013 17:04:28
dosikus
Looper писал(а):Приветствую всех!

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

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


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


В симуляторе проверяете ?

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

Добавлено: Вт июн 18, 2013 19:07:35
Satyr
dosikus писал(а):В симуляторе проверяете ?

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

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

Добавлено: Вт июн 18, 2013 20:23:08
dosikus
Satyr писал(а):В симуляторе все проще - там еще на ожидании PLL Ready все навечно встает -)))))))))))))


В IAR в симуляторе прерывания включать надо . Остальное как то обходит , и готовность кварца и PLL ...

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

Добавлено: Ср июл 17, 2013 06:46:48
Psych
Наверно поздно, но прерывания в иаре пишется не как функция!!
Попробуйте:

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

#pragma vector=TIM6_DAC_IRQHandler
__interrupt void TIM6(void)
{
}

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

Добавлено: Ср июл 17, 2013 12:07:17
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--;
   }
 }

И ведь работает. И в ИАРе..

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

Добавлено: Пн июл 29, 2013 22:34:13
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-е не работает, почему и как это решить?
Заранее спасибо!

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

Добавлено: Пн июл 29, 2013 22:48:49
Myp3ik
RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

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

Может все же RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

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

Добавлено: Пн июл 29, 2013 22:54:52
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)
{
}
}


видимо, какая-то ошибка.

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

Добавлено: Пн июл 29, 2013 23:03:25
Myp3ik
Я в иаре использую такой вид обработчика прерываний

void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line0);
}
}

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

Добавлено: Вт июл 30, 2013 09:31:28
bishop-strip
Спасибо за ответы, но
Спойлерvoid EXTI0_IRQHandler(void)

и так тоже не работает...
Выскакивает exception... :o

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

Добавлено: Вт июл 30, 2013 09:48:37
bishop-strip
Скажите пожалуйста, как вы настраиваете контроллер на работу с внешними прерываниями?

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

Добавлено: Вт июл 30, 2013 10:04:18
Satyr
Функцию можно назвать хоть ГуёМаё() - это как раз не важно.
Лишь бы в таблицу прерываний она встала.
А этому тут, как я вижу, уделяют третьестепенное внимание.