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

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

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

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

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

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


Закрытая тема
Опции темы
Непрочитано 05.02.2016, 20:06   #1
Реостат
Частый гость
 
Регистрация: 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   #2
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)

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

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

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

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

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

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

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

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

Последний раз редактировалось индюк; 05.02.2016 в 21:03.
индюк вне форума  
Непрочитано 05.02.2016, 21:00   #9
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
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   #10
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,712
Сказал спасибо: 189
Сказали Спасибо 3,194 раз(а) в 2,071 сообщении(ях)
индюк на пути к лучшему
По умолчанию 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, время: 03:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot