реклама на сайте
подробности

 
 
> Прерывания STM32F050 не работают, если не дёргаешь этот порт, Подскажите куда копать.
shdv
сообщение Jun 16 2014, 05:23
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 27-04-05
Из: Челябинск
Пользователь №: 4 534



Прерывания заведены с ног порта B0 и B2 дабы различать их было можно!
Ноги B9, B10, B11 - включены на выход. До тех пор, пока не начинаю периодично дёргать одну из выходных ног, прерывания от ног B0 и B2 не возникают (если одна нога стоит в 1, этого не достаточно, прерывание возникает если на порт подается меандр...).
Может кто сталкивался с данной проблемой? Убил уже день и ночь на решение, ничего путного в голову не лезет...
Использую Coocox.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
shdv
сообщение Jun 18 2014, 02:01
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 27-04-05
Из: Челябинск
Пользователь №: 4 534



Мне важно знать какой датчик сработал первым.

Два глобальных флага для отработки прерываний внутри бесконечного цикла:
c_flag = 0;
g_flag = 0;

Инициализация внутри main:
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

//enable peripherals clocking
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC|RCC_AHBPeriph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* Connect EXTI0 Line to PB0 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource0);

/* Configure EXTI0 line */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

/* Enable and set EXTI0 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource2);

/* Configure EXTI2 line */
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

/* Enable and set EXTI2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/*GPIO init*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

NVIC_EnableIRQ (EXTI0_1_IRQn);
NVIC_EnableIRQ (EXTI2_3_IRQn);

for(;;)
{if (g_flag == 1)
{
NVIC_DisableIRQ (EXTI0_1_IRQn);
NVIC_DisableIRQ (EXTI2_3_IRQn);

// учитываем срабатывание

NVIC_EnableIRQ (EXTI0_1_IRQn);
NVIC_EnableIRQ (EXTI2_3_IRQn);
c_flag = 0;
g_flag = 0;
}
else {
NVIC_DisableIRQ (EXTI0_1_IRQn);
NVIC_DisableIRQ (EXTI2_3_IRQn);

// учитываем срабатывание

NVIC_EnableIRQ (EXTI0_1_IRQn);
NVIC_EnableIRQ (EXTI2_3_IRQn);
c_flag = 0;
g_flag = 0;
}
}


Обработчики прерываний:

void EXTI0_1_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
if((c_flag==0)&(g_flag==0))
{
c_flag = 0;
g_flag = 1; //флаг будет сброшен в main после того, как срабатывание датчика будет учтено
}
EXTI_ClearITPendingBit(EXTI_Line0);//Очищаем флаг прерывания
}
}

void EXTI2_3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2) != RESET)
{
if((c_flag==0)&(g_flag==0))
{
c_flag = 1;//флаг будет сброшен в main после того, как срабатывание датчика будет учтено
g_flag = 0;
}
EXTI_ClearITPendingBit(EXTI_Line2);//Очищаем флаг прерывания
}
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 11:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016