Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Не получается настроить прерывание на кнопке (STM32F407Discovery)

Непрочитано 05.02.2016, 20:06  
Реостат
Частый гость
 
Регистрация: 29.10.2015
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Реостат на пути к лучшему
Вопрос Не получается настроить прерывание на кнопке (STM32F407Discovery)

Добрый вечер.
Что-то не получается настроить пользовательскую кнопку. Нажимаю, но ничего не происходит. А должно: скорость мигания диода должна меняться.
Вот код:
Код:
#include "cmsis_lib/include/misc.h"
#include "cmsis_lib/include/stm32f4xx_exti.h"
#include "cmsis_lib/include/stm32f4xx_gpio.h"
#include "cmsis_lib/include/stm32f4xx_rcc.h"
#include "cmsis_lib/include/stm32f4xx_syscfg.h"
#include "cmsis_lib/include/stm32f4xx_tim.h"

#define PWM_STEP 5
#define PWM_PERIOD 320
#define PWM_DT PWM_PERIOD/PWM_STEP //64

#define PRESCALER 1000
#define TICKS(t) 16*1e6/PRESCALER*t/(2*PWM_DT)

enum LedMode
{
	TurnOn = 0,
	TurnOff = 1
};
unsigned int modes[] = {TICKS(4), TICKS(2), TICKS(1)}, j;
unsigned char mode, i;

void EXTI0_IRQHandler()
{
	EXTI_ClearITPendingBit(EXTI_Line0);
//
	if(i == 2) i = 0;
	else i++;

	TIM6-›CCR1 = modes[i];
}

void TIM6_DAC_IRQHandler()
{
	if(TIM_GetITStatus(TIM6, TIM_IT_Update) == RESET) return;
	TIM_ClearITPendingBit(TIM6, TIM_IT_Update);

	if(mode == TurnOff)
	{
		j -= PWM_STEP;
		if(j == 0) mode = TurnOn;
	}
	else
	{
		j += PWM_STEP;
		if(j == PWM_PERIOD) mode = TurnOff;
	}
    TIM4-›CCR1 = j;
}

void TIM4_IRQHandler()
{
	TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}

int main(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
	GPIO_InitTypeDef portD;
	GPIO_StructInit(&portD);
	portD.GPIO_Mode = GPIO_Mode_AF;
	portD.GPIO_Pin = GPIO_Pin_12;
	GPIO_Init(GPIOD, &portD);

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef portA;
	GPIO_StructInit(&portA);
	portA.GPIO_Mode = GPIO_Mode_IN;
	portA.GPIO_Pin = GPIO_Pin_0;
	GPIO_Init(GPIOA, &portA);

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
	TIM_TimeBaseInitTypeDef periodTimer;
	TIM_TimeBaseStructInit(&periodTimer);
	periodTimer.TIM_CounterMode = TIM_CounterMode_Up;
	periodTimer.TIM_Period = modes[i = 1];
	periodTimer.TIM_Prescaler = PRESCALER-1;
	TIM_TimeBaseInit(TIM6, &periodTimer);
	TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	TIM_TimeBaseInitTypeDef timer;
	TIM_TimeBaseStructInit(&timer);
	timer.TIM_CounterMode = TIM_CounterMode_Up;
	timer.TIM_Period = PWM_PERIOD;
	timer.TIM_Prescaler = 1000-1;
	TIM_TimeBaseInit(TIM4, &timer);
	GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);

	TIM_OCInitTypeDef pwm;
	TIM_OCStructInit(&pwm);
	pwm.TIM_Pulse = (j = PWM_PERIOD/16);
	pwm.TIM_OCMode = TIM_OCMode_PWM1;
	pwm.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OC1Init(TIM4, &pwm);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
	EXTI_InitTypeDef exti;
	exti.EXTI_Line = EXTI_Line0;
	exti.EXTI_Mode = EXTI_Mode_Interrupt;
	exti.EXTI_Trigger = EXTI_Trigger_Rising;
	exti.EXTI_LineCmd = ENABLE;
	EXTI_Init(&exti);

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitTypeDef nvic;
	nvic.NVIC_IRQChannel = EXTI0_IRQn;
	nvic.NVIC_IRQChannelPreemptionPriority = 0;
	nvic.NVIC_IRQChannelSubPriority = 0;
	nvic.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&nvic);

	TIM_Cmd(TIM4, ENABLE);
	TIM_Cmd(TIM6, ENABLE);
	NVIC_EnableIRQ(TIM4_IRQn);
	NVIC_EnableIRQ(TIM6_DAC_IRQn);
	mode = TurnOff;

    while(1)
    {
    }
}
Может вы зорким глазом увидите, что тут не так?
Реклама:
Реостат вне форума  
Непрочитано 05.02.2016, 20:10  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)

SPL. .
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 05.02.2016, 20:15  
Реостат
Частый гость
 
Регистрация: 29.10.2015
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Реостат на пути к лучшему
По умолчанию Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)

Без философии, пожалуйста.
На других учебных проектах кнопка работает, а тут что-то не хочет.
Реостат вне форума  
Непрочитано 05.02.2016, 20:21  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)

Вы пользоваться дебагом умеете? Поставьте бряк на прерывание - удостоверьтесь что попадаете при нажатии. А далее продолжим...

А про SPL однозначно- вы ожидаете что кто-то так и жаждет копаться в этих простынях????
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 05.02.2016, 20:39  
dgrishin
Почётный гражданин KAZUS.RUN
 
Регистрация: 12.02.2013
Адрес: На болотах
Сообщений: 1,162
Сказал спасибо: 46
Сказали Спасибо 315 раз(а) в 244 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)

RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN , ENABLE);
dgrishin вне форума  
Непрочитано 05.02.2016, 20:45  
Реостат
Частый гость
 
Регистрация: 29.10.2015
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Реостат на пути к лучшему
По умолчанию Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)

Ахаха, не.
Нашел. Не тот регистр модифицировал...
Код:
TIM6-›ARR = modes[i];
Реостат вне форума  
Непрочитано 05.02.2016, 20:55  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)

Реостат, вообще-то именно в CCRx и нужно грузить , и скважность определяется разностью ARR-CCRx.
Но вам можно
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 05.02.2016, 20:59  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,124
Сказал спасибо: 202
Сказали Спасибо 3,284 раз(а) в 2,150 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)

аааа, опять программисты на си ничего понять в проце не могут..... нуну, это свойственно. у меня это все помещается в 4 строчки.
к тому же я б одну большую задачу разделил бы на 3-4 маленьких чтоб понять какая из них не работает.
сначала проверить работает ли прерывание - просто из него включить светодиод хотя бы
потом поуправлять шимом, или чо там у него, просто из программы.....
__________________
кагмаподэ магмаподэ

Последний раз редактировалось индюк; 05.02.2016 в 21:03.
индюк вне форума  
Непрочитано 05.02.2016, 21:00  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)

индюк, это SPL .
PHP код:
void Led_init(void)
     {
         
        RCC-›AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN;
      RCC-›APB1ENR |=RCC_APB1ENR_TIM3EN;
    
      GPIOA-›MODER &= ~(GPIO_MODER_MODER6 |GPIO_MODER_MODER7) ; 
      GPIOA-›MODER |= (GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1);
    GPIOA-›AFR[0] |= (1‹‹4*6)|(1‹‹4*7);         
      GPIOB-›MODER &= ~(GPIO_MODER_MODER1) ;  
      GPIOB-›MODER |= GPIO_MODER_MODER1_1 ;
    GPIOB-›AFR[0] |= (1‹‹4*1);        
         
      TIM3-›PSC = 48-1;
    TIM3-›ARR = 256-1;
    TIM3-›CCR2 = 0;
    TIM3-›CCR1 = 0;
        TIM3-›CCR4 = 0;

        TIM3-›CCMR1 |= (TIM_CCMR1_OC2M_2 |TIM_CCMR1_OC2M_1 |TIM_CCMR1_OC2FE |
                        TIM_CCMR1_OC1M_2 |TIM_CCMR1_OC1M_1 |TIM_CCMR1_OC1FE );
        TIM3-›CCMR2 |= (TIM_CCMR2_OC4M_2 |TIM_CCMR2_OC4M_1 |TIM_CCMR2_OC4FE ); 
        TIM3-›CCER |= TIM_CCER_CC2E |TIM_CCER_CC1E |TIM_CCER_CC4E;
        TIM3-›CR1 |= TIM_CR1_CEN;    
                     
     } 
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 05.02.2016, 21:12  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,124
Сказал спасибо: 202
Сказали Спасибо 3,284 раз(а) в 2,150 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)

а чо за spl то такой???
__________________
кагмаподэ магмаподэ
индюк вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прерывание по совпадению таймера 1 gruffi AVR 38 21.10.2016 22:58
Как настроить прерывание в NXP LPC1343 в IAR? Fangir ARM 2 10.08.2015 21:01
STM32 Не получается настроить термометр ds1621 sanstan ARM 6 19.04.2013 15:43
Как настроить прерывание от таймера реального времени c04 Микроконтроллеры, АЦП, память и т.д 0 25.05.2010 21:19


Часовой пояс GMT +4, время: 09:55.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.