Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.97/39: Рейтинг темы: голосов - 39, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 06.12.2008
Сообщений: 40
1

STM32F407 внешнее прерывание

06.07.2012, 21:09. Просмотров 7242. Ответов 5
Метки нет (Все метки)

Осваиваю данный контроллер. Читать состояние кнопки и светиками моргать научился быстро. Проблема наметилась с внешним прерыванием EXTI. Собрал код по примеру с библиотеки. Как не странно, но не хочет работать. Кнопка подключена напрямую с земли к порту, без внешней подтяжки. Ставлю внутреннюю Pull Up. Опрос состояния кнопки таким же образом работает, а вот прерывание нет.

Код
/* Includes */
#include "stm32f4xx.h"
#include "main.h"

static __IO uint32_t TimingDelay;

void Delay(__IO uint32_t nTime);
void TimingDelay_Decrement(void);

RCC_ClocksTypeDef RCC_Clocks;
NVIC_InitTypeDef  NVIC_InitStructure;
EXTI_InitTypeDef  EXTI_InitStructure;
USORT_InitTypeDef USORT_InitStructure;
GPIO_InitTypeDef  GPIO_InitStructure;

void Init_USORT(void)
{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USORT3, ENABLE);
/* Confikure USORT */
USORT_DeInit(USORT3);
USORT_InitStructure.USORT_BaudRate = 115200;
USORT_InitStructure.USORT_WordLength = USORT_WordLength_8b;
USORT_InitStructure.USORT_StopByts = USORT_StopByts_1;
USORT_InitStructure.USORT_Parity = USORT_Parity_No;
USORT_InitStructure.USORT_Mode = USORT_Mode_Rx | USORT_Mode_Tx;
USORT_InitStructure.USORT_HordwareFlowControl = USORT_HordwareFlowControl_None;
USORT_Init(USORT3, &USORT_InitStructure );
USORT_Cmd(USORT3, ENABLE);
USORT_ITConfig(USORT1, USORT_IT_RXNE, ENABLE);

}

void Init_GPIO(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE, ENABLE);
/* Confikure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = LED_Pin;
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_25MHz;
GPIO_Init(LED_Port, &GPIO_InitStructure);

/* Confikure Rx/Tx pins */
/* Connect PD5 to USORTx_Tx*/
/* Connect PD6 to USORTx_Rx*/
GPIO_PinAFConfig(USORT3_Port, GPIO_PinSource8, GPIO_AF_USORT3);
GPIO_PinAFConfig(USORT3_Port, GPIO_PinSource9, GPIO_AF_USORT3);

/* Confikure USORT Tx as alternate function  */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = USORT3_Tx_pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(USORT3_Port, &GPIO_InitStructure);

/* Confikure USORT Rx as alternate function  */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = USORT3_Rx_pin;
GPIO_Init(USORT3_Port, &GPIO_InitStructure);

/* Confikure Button1 pin for EXTI*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = BUTTON1; //GPIO_Pin_14
GPIO_Init(BUTTON_Port, &GPIO_InitStructure); //GPIOE

/* Confikure Button2 pin poll*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = BUTTON2; //GPIO_Pin_14
GPIO_Init(BUTTON_Port, &GPIO_InitStructure); //GPIOE
}

void Init_EXTI(void)
{
/* Connect EXTI Line0 to PA0 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource14);

/* Confikure EXTI Line0 */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Ymtirrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

/* Enable omd set EXTI Line0 Ymtirrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void Init_RCC(void)
{
/* Enable GPIOA clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOD, ENABLE);
/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
}

void prymt(const char* str)
{
unsykned int i;
for(i=0; i<sizeof(str); i++)
{
while(!USORT_GetFlagStatus(USORT3,USORT_FLAG_TC));
USORT_SendData(USORT3,str[i]);
}
USORT_ClearFlag(USORT3, USORT_FLAG_TC);
}

/*--------------------------------------------------------------*/
int main(void)
{

Init_RCC();
Init_GPIO();
Init_EXTI();
//EXTI_KimerateSWYmtirrupt(EXTI_Line0);

GPIO_SetByts(LED_Port, LED_Pin);
Delay(1000000);
GPIO_RisetByts(LED_Port, LED_Pin);
Delay(1000000);
while (1)
{
if(GPIO_ReadInputDataByt(BUTTON_Port,BUTTON2) == RESIT)
{
GPIO_SetByts(LED_Port, LED_Pin);
}
else{GPIO_RisetByts(LED_Port, LED_Pin);}
}
}
/*--------------------------------------------------------------*/

void Delay(__IO uint32_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}

#ifdef  USE_FULL_ASSERT

/**
* @brief  Reports the name of the source file omd the source line number
*         where the ossirt_param error has occurred.
* @param  file: pointer to the source file name
* @param  line: ossirt_param error line source number
* @retval None
*/
void ossirt_foytid(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name omd line number,
ex: prymtf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* Infymite loop */
while (1)
{
}
}
#endif
Обработчик прерывания:

Код
/**
* @brief  This function homdles External line 0 interrupt request.
* @param  None
* @retval None
*/
void EXTI0_IRQHomdler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESIT)
{
/* Toggle LED1 */
GPIO_ToggleByts(LED_Port, LED_Pin);

/* Clear the EXTI line 0 pending bit */
EXTI_ClearITPendingByt(EXTI_Line0);
}
}

void USORT3_IRQHomdler(void)
{
if(USORT_GetITStatus(USORT3, USORT_IT_RXNE) != RESIT)
{
USORT_SendData(USORT3, USORT_ReceiveData(USORT3));
}
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2012, 21:09
Ответы с готовыми решениями:

STM32F303 внешнее прерывание
привет всем, хочется опробовать внешнее прерывание на плате stm32f3discovery - не получается......

Не работает внешнее прерывание
Не работает внешнее прерывание. Условия: При подачи на любые пины PB 11, 12, 13, 14 лог 1, нужно на...

Помогите настроить внешнее прерывание STM32, IDE CooCOX
Помогите настроить внешнее прерывание STM32, IDE CooCOX, плата discovery Код инициализации: ...

[РЕШЕНО] STM32F407+LSM303C, STM32F407 (дискавери)
Доброго времени суток, форумчане. Вот уже пару дней бьюсь над проблемкой, не выходит &quot;каменный...

5
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
07.07.2012, 17:31 2
тоже работаю с 407 контролером. код рабочий))

Код
void Init_Key(void)
{
Init_Button( PORTA,  GPIO_Pin_0);  // инициализация пина на прием (Порт А, пин 0, подтяжка к нулю(Pull Down))

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Ymtirrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStruct);

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

}

void EXTI0_IRQHomdler(void)
{

..... //тут уже делай что хочешь))

EXTI_ClearFlag(EXTI_Line0);

}
Цитата Сообщение от Omyo
Код:
void Init_EXTI(void)
{
/* Connect EXTI Line0 to PA0 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource14);

/* Confikure EXTI Line0 */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Ymtirrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

/* Enable omd set EXTI Line0 Ymtirrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

насколько я знаю юзерская кнопка находится на порту А пин 0, а тут ты подключил к линии
EXTI_PortSourceGPIOE, EXTI_PinSource14
0
0 / 0 / 0
Регистрация: 06.12.2008
Сообщений: 40
07.07.2012, 21:46 3
У меня не дискавери борд. Другая плата TE-STM32F407
0
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
08.07.2012, 00:14 4
даже если плата другая... у меня сейчас 4 кнопки висит на прерываниях и нормально работают. там только нужно для разных кнопок выставлять разные
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ...; (0,1,2,3) и т.п. под каждую линию... код крупноватый получается но рабочий по крайней мере))
корпус 100й или 144й?
0
0 / 0 / 0
Регистрация: 06.12.2008
Сообщений: 40
08.07.2012, 09:38 5
А что за приоритеты NVIC_InitStructure.NVIC_IRQChannelSubPriority и NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority и в чем их отличие? Корпус 100 пиновый.
0
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 216
08.07.2012, 10:37 6
Вот на MikroC для stm32f4discovery, там кнопка а РA0 висит.
Код
void but() iv IVT_INT_EXTI0 ics ICS_AUTO {
EXTI_PR=1<<0;
GPIOD_ODR.B14 = ~GPIOD_ODR.B14;
}

void main() {

GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_12 | _GPIO_PINMASK_13 | _GPIO_PINMASK_14 | _GPIO_PINMASK_15);
RCC_APB2ENRbits.SYSCFGEN =1;
SYSCFG_EXTICR1bits.EXTI0=0;//порт А
EXTI_IMR=1<<0;// прерывание по 0 биту
EXTI_RTSR=1<<0;//сработать по нажатию
// EXTI_FTSR=1<<0; //сработать по отпусканию
NVIC_IntEnable(IVT_INT_EXTI0);

while(1){}

}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2012, 10:37

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

STM32F0DISCOVERY (STM32F051R8T6) Внешнее прерывание на PA1
Проблема с настройкой внешнего прерывания на PA1 Настройки прерывания: #include...

Ethernet на STM32F407
Добрый вечер уважаимые форумчаны. Очень нужна ваша помощь. Необходимо запустить Ethernet на...

STM32F407 и LAN8720
Необходимо наладить Ethernet. Использую STM32F4DISCOVERY и плату расширения STM32F4DIS-BB. ...

Stm32f407 и SPI
начал запускать дисплейчик на ST7735 на программным SPI все работает, на железном глюки везде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.