Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4 discovery И прерывания от таймера
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
RiseOfDeath
Доброго времени суток. У меня какие-то проблемы с прерываниями от таймера на этой отладке.

Вкратце про отладку:
Контроллер stm32f407VG
PD15 и PD14 подключены к светодиодам.

Вкратце код:


main.cpp
Код
#include <stm32f4xx.h>
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_tim.h"
#include "system_stm32f4xx.h"


#include "InitGPIO.h"
#include "InitTimer.h"

#include "misc.h"

int phase1=1;
int phase2=1;
void TIM4_IRQHandler (void);



int main (void)
{
    #ifdef DEBUG
    debug();
    #endif
        
    //__enable_irq();
    InitGPIO();
    InitTimer();

    
    
    while (true)
    {
        if(phase2>0)
        {
            GPIO_SetBits(GPIOD,GPIO_Pin_14);
            phase2*=-1;
        }
        else
        {
            GPIO_ResetBits(GPIOD,GPIO_Pin_14);
            phase2*=-1;
        }    
        for(int i =0; i< 1000000; i++);
    }
}


void TIM4_IRQHandler (void)
{    
    if(phase1>0)
    {
        GPIO_SetBits(GPIOD,GPIO_Pin_15);
        phase1*=-1;
    }
    else
    {
        GPIO_ResetBits(GPIOD,GPIO_Pin_15);
        phase1*=-1;
    }    
    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    return;
}


(InitTimer.h содержит только прототип, по этому его не привожу)
InitTimer.cpp
Код
#include "InitTimer.h"
#include <stm32f4xx.h>
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_tim.h"
#include "misc.h"

#define TIMER_PRESCALER    720

TIM_TimeBaseInitTypeDef timer;

void InitTimer()
{    
    
    RCC_APB1PeriphClockCmd ( RCC_APB1Periph_TIM4, ENABLE );
    
    
    TIM_TimeBaseStructInit(&timer);
    timer.TIM_Period = 50;
    timer.TIM_Prescaler = TIMER_PRESCALER;
    TIM_TimeBaseInit ( TIM4, &timer );

    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM4, ENABLE );
    NVIC_EnableIRQ(TIM4_IRQn); //   <<<< Отмеченная строчка.
}


И так... что я имею:

PD15 - мигает.
PD14 - разумеется не мигает.

Раскоменчиваю отмеченую строку и.... микроконтроллер просто зависает (при этом светодиод PD15 загорается, и больше ничего не происходит).

Что я делаю не так?
AHTOXA
Цитата(RiseOfDeath @ Oct 2 2013, 16:08) *
PD14 - разумеется не мигает.

Он мигает, только очень быстро. Скорее всего, компилятор выкинул ваш цикл задержки.
Попробуйте заменить его на
Код
    for(volatile int i =0; i< 1000000; i++);
RiseOfDeath
Цитата(AHTOXA @ Oct 2 2013, 14:49) *
Он мигает, только очень быстро. Скорее всего, компилятор выкинул ваш цикл задержки.
Попробуйте заменить его на
Код
    for(volatile int i =0; i< 1000000; i++);



Упс.. оговорка вышла. PD15 и PD14 перепутал.


Следует читать как:


И так... что я имею:

PD14 - мигает.
PD15 - разумеется не мигает.

Раскоменчиваю отмеченную строку и.... микроконтроллер просто зависает (при этом светодиод PD15 загорается, и больше ничего не происходит).


Ну и, если убрать задержку - он просто горит (он не успевает погаснуть, по крайней мере человеческий глаз этого не успевает заметить).

Еще замечу, что в статусной строке Keil, при вызове "отмеченной строки", воникает сообщение Trace: No Synchronization
AHTOXA
А, вон оно как. Ну тогда поставьте extern "C" перед обработчиком прерыванияsm.gif
Код
extern "C" void TIM4_IRQHandler (void)
RiseOfDeath
Цитата(AHTOXA @ Oct 2 2013, 18:06) *
А, вон оно как. Ну тогда поставьте extern "C" перед обработчиком прерыванияsm.gif
Код
extern "C" void TIM4_IRQHandler (void)



Хм... не понимаю по чему, но это помогло.
AHTOXA
Гляньте здесь, чтоб больше не натыкаться на эту проблему.
RiseOfDeath
Хотя появилась другая проблема - таймер вообще не реагирует на Prescaler и Period - значения отличающиеся в тысячу работают одинаково (смотрел осциллографом)

Мой косяк.... привязал случайно не к тому событию.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.