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
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)
SPL. .
__________________
Осторожно , злой кот
|
|
|
|
05.02.2016, 20:15
|
#3
|
Частый гость
Регистрация: 29.10.2015
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)
Без философии, пожалуйста.
На других учебных проектах кнопка работает, а тут что-то не хочет.
|
|
|
|
05.02.2016, 20:21
|
#4
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)
Вы пользоваться дебагом умеете? Поставьте бряк на прерывание - удостоверьтесь что попадаете при нажатии. А далее продолжим...
А про SPL однозначно- вы ожидаете что кто-то так и жаждет копаться в этих простынях????
__________________
Осторожно , злой кот
|
|
|
|
05.02.2016, 20:39
|
#5
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,038
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)
RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN , ENABLE);
|
|
|
|
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
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)
Реостат, вообще-то именно в CCRx и нужно грузить , и скважность определяется разностью ARR-CCRx.
Но вам можно
__________________
Осторожно , злой кот
|
|
|
|
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
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
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;
}
|
__________________
Осторожно , злой кот
|
|
|
|
05.02.2016, 21:12
|
#10
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,712
Сказал спасибо: 189
Сказали Спасибо 3,194 раз(а) в 2,071 сообщении(ях)
|
Re: Не получается настроить прерывание на кнопке (STM32F407Discovery)
а чо за spl то такой???
__________________
кагмаподэ магмаподэ
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:31.
|
|