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

Таймер на stm32f429zi

Добавлено: Сб окт 11, 2014 12:58:37
Illigarium
Не работает прерывание. Народ, помогите, я только новичок, особо не разбираюсь.

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

#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_tim.h"

#define TIMER_PRESCALER	720
 
uint16_t previousState;
GPIO_InitTypeDef port;
TIM_TimeBaseInitTypeDef timer;
void initAll()
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    GPIO_StructInit(&port);
    port.GPIO_Mode = GPIO_Mode_OUT;
    port.GPIO_Pin = GPIO_Pin_14;
    port.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOB, &port);
    TIM_TimeBaseStructInit(&timer);
    timer.TIM_Prescaler = TIMER_PRESCALER;
    timer.TIM_Period = 50;
    TIM_TimeBaseInit(TIM4, &timer);	
}
int main()
{
    __enable_irq();
    initAll();
    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM4, ENABLE);
    NVIC_EnableIRQ(TIM4_IRQn); //<--- problem
    while(1)
    {
	__NOP();
    }		
}
 
void TIM4_IRQHandler()
{	
    GPIO_SetBits(GPIOG, GPIO_Pin_14); //red led
    if (previousState == 0)
    {
	previousState = 1;
	timer.TIM_Period = 50;
	TIM_TimeBaseInit(TIM4, &timer);	
	TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    }
    else
    {
	previousState = 0;
	timer.TIM_Period = 250;
	TIM_TimeBaseInit(TIM4, &timer);	
	TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    }	
}


P.S. пользовал stm32f429i-discovery

Re: Таймер на stm32f429zi

Добавлено: Сб окт 11, 2014 20:08:41
Zud
Возможно не хватает что-то типа :

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

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
т.е. настройки контроллера прерывания.

Re: Таймер на stm32f429zi

Добавлено: Вс окт 12, 2014 01:28:56
Illigarium
Не пашет :(

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

#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_tim.h"
#include "misc.h"

#define TIMER_PRESCALER	720
 
uint16_t previousState;
GPIO_InitTypeDef port;
TIM_TimeBaseInitTypeDef timer;
NVIC_InitTypeDef NVIC_InitStructure;

void initAll()
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    GPIO_StructInit(&port);
    port.GPIO_Mode = GPIO_Mode_OUT;
    port.GPIO_Pin = GPIO_Pin_14;
    port.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOB, &port);
    TIM_TimeBaseStructInit(&timer);
    timer.TIM_Prescaler = TIMER_PRESCALER;
    timer.TIM_Period = 50;
    TIM_TimeBaseInit(TIM4, &timer);	
}
int main()
{
    __enable_irq();
    initAll();
    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM4, ENABLE);
	  NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    NVIC_EnableIRQ(TIM4_IRQn); //<--- problem
    while(1)
    {
	__NOP();
    }		
}
 
void TIM4_IRQHandler()
{	
		GPIO_SetBits(GPIOG, GPIO_Pin_14);
    if (previousState == 0)
    {
	previousState = 1;
	timer.TIM_Period = 50;
	TIM_TimeBaseInit(TIM4, &timer);	
	TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    }
    else
    {
	previousState = 0;
	timer.TIM_Period = 250;
	TIM_TimeBaseInit(TIM4, &timer);	
	TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    }	
}


Re: Таймер на stm32f429zi

Добавлено: Вс окт 12, 2014 07:45:16
urry
GPIO_Init(GPIOB,
Не наблюдаю в тексте его тактирование.

Re: Таймер на stm32f429zi

Добавлено: Вс окт 12, 2014 10:37:05
HHIMERA
SPL + злокопипаст = абсолютное зло...

Не вяжется как-то...
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);

и
GPIO_Init(GPIOB, &port);

Или... всё по рангу... и согласно купленным билетам???

Re: Таймер на stm32f429zi

Добавлено: Пн окт 13, 2014 15:06:41
Illigarium
Я переделывал код с учебника под свою плату. Забыл исправить. Но суть не в том. На включении NVIC прерывания контроллер виснет.

Re: Таймер на stm32f429zi

Добавлено: Пн окт 13, 2014 15:18:02
dosikus
Illigarium писал(а): Но суть не в том. На включении NVIC прерывания контроллер виснет.
И в этом также. :)))
Что за учебник ? Стартап подключен?
Короче можно только гадать, пока проект целиком не предоставишь...

Re: Таймер на stm32f429zi

Добавлено: Пн окт 13, 2014 15:32:26
Illigarium
Естессна :)) .

Re: Таймер на stm32f429zi

Добавлено: Пн окт 13, 2014 17:19:40
dosikus
Естесно что? :)))
Где проект?

Re: Таймер на stm32f429zi

Добавлено: Вт окт 14, 2014 22:55:56
Zud
и кстати

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

GPIO_SetBits(GPIOG, GPIO_Pin_14);
всего лишь зажигает лампочку. Гасить кто будет ?

Re: Таймер на stm32f429zi

Добавлено: Ср окт 15, 2014 10:38:31
Illigarium
Нафига вам проект? Код - вот. Отвяньте вы от лампочки! Не надо её гасить. :facepalm:

Re: Таймер на stm32f429zi

Добавлено: Ср окт 15, 2014 11:08:36
dosikus
Illigarium писал(а):Нафига вам проект?
Тебе помощь нужна?
Или бум и далее гадать?
Illigarium писал(а): я только новичок, особо не разбираюсь.

Re: Таймер на stm32f429zi

Добавлено: Чт окт 16, 2014 15:19:47
Illigarium

Re: Таймер на stm32f429zi

Добавлено: Чт окт 16, 2014 16:59:43
dosikus
Illigarium, проект создан через ж.
Структура проекта - полная бездумная мешанина.
Но это все мелочи - проект создан в плюсах а не С и это естественно не осознано.
Для С++ хэндлеры прерываний надо обрамлять в

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

#ifdef __cplusplus extern "C" { #endif

handler()

#ifdef __cplusplus
 }
#endif

Файл startup_stm32f429_439xx.s отсутствует в проекте.
Проект настроен на 25МГц кварц - эти грабли вылезут потом ...

Illigarium, придется тебе забросить SPL и заняться вплотную С .
Иначе в дальнейшем все будет еще хуже ...

Re: Таймер на stm32f429zi

Добавлено: Чт окт 30, 2014 14:09:19
Illigarium
Переделал в си. Добавил стартап. Нифига не работает.

Re: Таймер на stm32f429zi

Добавлено: Чт окт 30, 2014 17:18:23
dosikus
Проект в студию...