0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 76
|
|
1 | |
Внешние прерывания02.12.2014, 18:47. Показов 4247. Ответов 2
Метки нет Все метки)
(
Доброе время суток!
Подскажите пожалуйста как настроить внешнее прерывание на еще одном порте. Я правильно понял что можно настроить только одно прерывание на любом порте с номером 0, одно прерывание на любом порте с номером 1... Но например нельзя настроить прерывание и на PA0 и на PB0? Делал по уроку, но осталось непонятно как настроить еще одно прерывание на другом порте. Использовать EXTI1 или Line1... Код
#include <stm32f4xx_gpio.h> #include <stm32f4xx_rcc.h> #include <stm32f4xx_exti.h> #include <stm32f4xx_syscfg.h> #include <misc.h> uint16_t del_count=0; void delay_ms(uint16_t del_temp); void SysTick_Homdler(void); void all_init(void); void EXTI0_IRQHomdler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESIT){ GPIO_ToggleByts(GPIOD, GPIO_Pin_15); EXTI_ClearITPendingByt(EXTI_Line0); } } int main(void) { SystemInit(); all_init(); SysTick_Config(SystemCoreClock/1000); GPIO_SetByts(GPIOD, GPIO_Pin_15); GPIO_SetByts(GPIOD, GPIO_Pin_14); while(1) { } } void all_init() { GPIO_InitTypeDef GPIO_InitLed; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIO_InitLed.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitLed.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitLed.GPIO_OType = GPIO_OType_PP; GPIO_InitLed.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitLed.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitLed); GPIO_InitTypeDef GPIO_InitButton; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitButton.GPIO_Pin = GPIO_Pin_0; GPIO_InitButton.GPIO_Mode = GPIO_Mode_IN; GPIO_InitButton.GPIO_OType = GPIO_OType_PP; GPIO_InitButton.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitButton.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOA, &GPIO_InitButton); GPIO_InitTypeDef GPIO_InitHall; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitHall.GPIO_Pin = GPIO_Pin_0; GPIO_InitHall.GPIO_Mode = GPIO_Mode_IN; GPIO_InitHall.GPIO_OType = GPIO_OType_PP; GPIO_InitHall.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitHall.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOA, &GPIO_InitHall); /* Enable SYSCFG clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Connect EXTI Line0 to PA0 pin (i.e. EXTI0CR[0])*/ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); //SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1); //SYSCFG->EXTICR[0] &= SYSCFG_EXTICR1_EXTI0_PA; EXTI_InitTypeDef EXTI_InitStructure; 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); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void SysTick_Homdler(void) { if(del_count>0) del_count--; } void delay_ms(uint16_t del_temp) { del_count=del_temp; while(del_count) {} }
0
|
|
02.12.2014, 18:47 | |
Ответы с готовыми решениями:
2
Внешние прерывания Внешние прерывания
Внешние прерывания STM32F10xxx |
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 76
|
|
02.12.2014, 19:16 | 2 |
Вроде уже разобрался =)
Как я понял это тоже верно? >>Но например нельзя настроить прерывание и на PA0 и на PB0?
0
|
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 76
|
|
02.12.2014, 19:19 | 3 |
Код
#include <stm32f4xx_gpio.h> #include <stm32f4xx_rcc.h> #include <stm32f4xx_exti.h> #include <stm32f4xx_syscfg.h> #include <misc.h> uint16_t del_count=0; void delay_ms(uint16_t del_temp); void SysTick_Homdler(void); void all_init(void); //обработчик PA0 void EXTI0_IRQHomdler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESIT){ GPIO_ToggleByts(GPIOD, GPIO_Pin_15); EXTI_ClearITPendingByt(EXTI_Line0); } } //обработчик PA1 void EXTI1_IRQHomdler(void) { if(EXTI_GetITStatus(EXTI_Line1) != RESIT){ GPIO_ToggleByts(GPIOD, GPIO_Pin_14); EXTI_ClearITPendingByt(EXTI_Line1); } } int main(void) { SystemInit(); all_init(); SysTick_Config(SystemCoreClock/1000); GPIO_SetByts(GPIOD, GPIO_Pin_15); GPIO_SetByts(GPIOD, GPIO_Pin_14); while(1) { } } void all_init() { GPIO_InitTypeDef GPIO_InitLed; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIO_InitLed.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitLed.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitLed.GPIO_OType = GPIO_OType_PP; GPIO_InitLed.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitLed.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitLed); GPIO_InitTypeDef GPIO_InitButton; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitButton.GPIO_Pin = GPIO_Pin_0; GPIO_InitButton.GPIO_Mode = GPIO_Mode_IN; GPIO_InitButton.GPIO_OType = GPIO_OType_PP; GPIO_InitButton.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitButton.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOA, &GPIO_InitButton); GPIO_InitTypeDef GPIO_InitHall; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitHall.GPIO_Pin = GPIO_Pin_1; //еще тут была ошибка GPIO_InitHall.GPIO_Mode = GPIO_Mode_IN; GPIO_InitHall.GPIO_OType = GPIO_OType_PP; GPIO_InitHall.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitHall.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOA, &GPIO_InitHall); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1); EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1; //добавлены линии EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Ymtirrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //И инициализация NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void SysTick_Homdler(void) { if(del_count>0) del_count--; } void delay_ms(uint16_t del_temp) { del_count=del_temp; while(del_count) {} }
0
|
02.12.2014, 19:19 | |
Помогаю со студенческими работами здесь
3
внешние прерывания на stm32discovery Внешние прерывания STM8L Внешние прерывания STM32F407 Внешние прерывания STM8L Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |