Страница 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
и кстати
всего лишь зажигает лампочку. Гасить кто будет ?
Re: Таймер на stm32f429zi
Добавлено: Ср окт 15, 2014 10:38:31
Illigarium
Нафига вам проект? Код - вот. Отвяньте вы от лампочки! Не надо её гасить.

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
Проект в студию...