реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F4 discovery И прерывания от таймера
RiseOfDeath
сообщение Oct 2 2013, 10:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 2-10-13
Пользователь №: 78 579



Доброго времени суток. У меня какие-то проблемы с прерываниями от таймера на этой отладке.

Вкратце про отладку:
Контроллер 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 загорается, и больше ничего не происходит).

Что я делаю не так?

Сообщение отредактировал RiseOfDeath - Oct 2 2013, 10:10
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 2 2013, 10:49
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(RiseOfDeath @ Oct 2 2013, 16:08) *
PD14 - разумеется не мигает.

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
RiseOfDeath
сообщение Oct 2 2013, 11:03
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 2-10-13
Пользователь №: 78 579



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



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


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


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

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

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


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

Еще замечу, что в статусной строке Keil, при вызове "отмеченной строки", воникает сообщение Trace: No Synchronization

Сообщение отредактировал RiseOfDeath - Oct 2 2013, 11:04
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 2 2013, 14:06
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А, вон оно как. Ну тогда поставьте extern "C" перед обработчиком прерыванияsm.gif
Код
extern "C" void TIM4_IRQHandler (void)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
RiseOfDeath
сообщение Oct 3 2013, 04:30
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 2-10-13
Пользователь №: 78 579



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



Хм... не понимаю по чему, но это помогло.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 3 2013, 04:54
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Гляньте здесь, чтоб больше не натыкаться на эту проблему.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
RiseOfDeath
сообщение Oct 3 2013, 05:29
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 2-10-13
Пользователь №: 78 579



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

Мой косяк.... привязал случайно не к тому событию.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 21:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.0133 секунд с 7
ELECTRONIX ©2004-2016