Страница 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...

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