Метценгерштейн 0 10 января, 2013 Опубликовано 10 января, 2013 · Жалоба именно под проц L хочу настроить ногу РА0 на срабатывание. мне порт РА0 конфигурить как альтернативную функцию или просто как порт на вход? где указать для этого проца, что EXTI0 будет именно на порт А? чего еще не хвататет, чтобы заработало? EXTI->IMR |= EXTI_IMR_MR0; // конфига the mask bits EXTI->RTSR |= EXTI_RTSR_TR0; //настройка фронта-среза EXTI->FTSR |= EXTI_FTSR_TR0; //настройка фронта-среза NVIC_EnableIRQ(EXTI0_IRQn); NVIC_SetPriority(EXTI0_IRQn, 15); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба мне порт РА0 конфигурить как альтернативную функцию или просто как порт на вход?У меня как порт на вход c пулапом. именно под проц LНе для L, но тем не менее.static void mcu_init_ext_interrupts(void) // PD15 interrupt on falling edge { RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // Enable AFIO clock EXTI_DeInit(); EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Line = EXTI_Line15; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStruct); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource15); NVIC_EnableIRQ(EXTI15_10_IRQn); // enable interrupt EXTI 15..10 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба т.е. нога у Вас просто как вход. Не как альтернативная ф-я. А зачем тогда тактирование разрешать альтернативной ф-ии? Вопрос остается- как в L назначить именно порт А на EXTI0? В процах F серии- там по-другому все делается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ek74 0 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба где указать для этого проца, что EXTI0 будет именно на порт А? // Connect EXTI line 0 to PA.0 SYSCFG->EXTICR[EXTI_PinSource0 >> 0x02] = (SYSCFG->EXTICR[EXTI_PinSource0 >> 0x02] & ~(0x0F << ((EXTI_PinSource0 & 0x03) * 4))) | (EXTI_PortSourceGPIOA << ((EXTI_PinSource0 & 0x03) * 4)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба т.е. нога у Вас просто как вход. Не как альтернативная ф-я.Да. А зачем тогда тактирование разрешать альтернативной ф-ии?Не помню уже. Больше года назад писал это. Без этого видимо не работало. Вспомнил! Потому что альтернативная функция может быть только на вывод, а нога то на ввод настраивается. GPIO MODES: * ANALOG * INPUT_FLOATING * INPUT_PULL_DOWN * INPUT_PULL_UP * OUTPUT_PUSH_PULL * OUTPUT_OPEN_DRAIN * ALT_OUTPUT_PUSH_PULL * ALT_OUTPUT_OPEN_DRAIN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 11 января, 2013 Опубликовано 11 января, 2013 (изменено) · Жалоба добавил в проект файл stm32l1xx_syscfg.c и подключил к линии EXTI0 порт А SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); // Connect EXTI line 0 to PA.0 один хрен не работает. Что упускаю еще? Может тактирование разрешить? На порт А подаю RCC->AHBENR |= RCC_AHBENR_GPIOAEN; вот код с обработчиком void EXTI0_IRQHandler(void) { on (LED_Green); EXTI->PR |= EXTI_PR_PR0;//сбросили бит прерывания } ... ... ... GPIOA->MODER &= ~GPIO_MODER_MODER0; //input GPIOA->OTYPER &= ~GPIO_OTYPER_OT_0; //Output push-pull GPIOA->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR0; //40 MHz GPIOA->PUPDR &=~GPIO_PUPDR_PUPDR0; //No pull-up, pull-down //настройка внешнего прерывания на int0 __enable_irq (); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); // Connect EXTI line 0 to PA.0 EXTI->IMR |= EXTI_IMR_MR0; // какую линию выбираем из 23-х (у нас 0-я) EXTI->RTSR |= EXTI_RTSR_TR0; //настройка фронта-среза NVIC_EnableIRQ(EXTI0_IRQn); NVIC_SetPriority(EXTI0_IRQn, 15); Вспомнил! Потому что альтернативная функция может быть только на вывод, а нога то на ввод настраивается. осторожно не соглашусь) А где это сказано? т.к. под UART я настраивал под альтернативную и вход и выход ... //Инициализация выводов: PA9 - USART1_TX, PA10 - USART1_RX RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //Включаем тактирование GPIOА //Для выводов PA9, PA10 выбираем альтернативную функцию работы с USART1 GPIOA->AFR[1] |= (7<<4) | (7<<8); //для PA9 и PA10 задаем значение альтернативной функции - AF7, что соответствует USART1_TX //Инициализации вывода PA10 - USART1_Rx По умолчанию он Input floating GPIOA->MODER |= GPIO_MODER_MODER10_1; //Alternate function mode //Инициализации вывода PA9 - USART1_Tx GPIOA->MODER |= GPIO_MODER_MODER9_1; //Alternate function mode GPIOA->OTYPER &= ~GPIO_OTYPER_OT_9; //Output push-pull GPIOA->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR9_1; //10 MHz GPIOA->PUPDR &=~GPIO_PUPDR_PUPDR9; //No pull-up, pull-down ... Изменено 11 января, 2013 пользователем Метценгерштейн Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба Вот мой обработчик: void __irq EXTI15_10_IRQHandler(void) // Photo flash feedback { #define IRQ_MASK pin_mask(PIN_PHOTO_FEEDBACK) STATIC_ASSERT((IRQ_MASK>=(1UL<<10))&&(IRQ_MASK<=(1UL<<15))); EXTI->PR = IRQ_MASK; // reset flag by writing 1 to its bits location ENTER_CRITICAL_SECTION(); { photo.picture.done = photo.picture.awaiting; // done if awaiting photo.picture.awaiting = 0; } LEAVE_CRITICAL_SECTION(); } Как видите для сброса можно и нужно ИМХО просто писать в EXTI->PR = MASK, а у вас по или: EXTI->PR |= MASK. Не думаю что это критично, но тем не менее так оптимальней. И ещё не уверен на счёт очерёдности сброса флага и выполнения тела обработчика (у меня сначала флаг, потом тело, а у вас наоборот). Про остальное ничего вам не смогу посоветовать, т.к. c STM32L не работал, а отличия от F имеются. Вы посмотрите структурную схему тактовых сигналов для вашего чипа, от туда сразу будет видно какое тактирование необходимо включить. Что касается режимов работы GPIO, так я их все из даташита аккуратненько извлёк и ничего не упустил - это точно. осторожно не соглашусь) А где это сказано? т.к. под UART я настраивал под альтернативную и вход и выход... Ну например в их библиотеке STM32F10x_StdPeriph_Driver, а конкретнее в файле stm32f10x_gpio.h Или в TRM на стр 156 в таблице 20 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 11 января, 2013 Опубликовано 11 января, 2013 (изменено) · Жалоба обработчик void EXTI0_IRQHandler(void) { on (LED_Blue); EXTI->PR |= EXTI_PR_PR0;//сбросили бит прерывания } инициализация void InitPeriph(void) { ... тут инициализация портов на ногах и разрешение тактирования GPIOA GPIOB кнопка PA0- как вход ... //настройка внешнего прерывания на int0 __enable_irq (); RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PA; EXTI->IMR |= EXTI_IMR_MR0; // какую линию выбираем из 23-х (у нас 0-я) EXTI->RTSR |= EXTI_RTSR_TR0; //настройка фронта-среза EXTI->FTSR |= EXTI_FTSR_TR0; NVIC_EnableIRQ(EXTI0_IRQn); NVIC_SetPriority(EXTI0_IRQn, 1); } и при этом всем работать не хочет! Чего не так? Уже в инете посмотрел- все так и инициализируют. Почему не работает? Изменено 12 января, 2013 пользователем Метценгерштейн Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 12 января, 2013 Опубликовано 12 января, 2013 · Жалоба Функция обработчик у Вас так называется ? void EXTI0_IRQHandler(void) { EXTI->PR|=(1<<0); //сбрасываем флаг прерывания } У Вас есть внутрисхемный отладчик ? Можете посмотреть регистры ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 12 января, 2013 Опубликовано 12 января, 2013 (изменено) · Жалоба да, обработчик такой- выше сообщение- там он как раз и есть. есть ST-LINKV2 и IAR. Но с регистрами там что-то при нажатии на кнопку ничего не происходит. Что непосредственно надо смотреть? Изменено 12 января, 2013 пользователем Метценгерштейн Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 12 января, 2013 Опубликовано 12 января, 2013 · Жалоба разобрался- заработало. Причина- был выбран в проекте язык С++, при смене на С- все работает. А почему так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 12 января, 2013 Опубликовано 12 января, 2013 · Жалоба разобрался- заработало. Причина- был выбран в проекте язык С++, при смене на С- все работает. А почему так? Попробуйте так: extern "C" void EXTI0_IRQHandler(void) { EXTI->PR|=(1<<0); //сбрасываем флаг прерывания } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 12 января, 2013 Опубликовано 12 января, 2013 · Жалоба да, заработало. Вспомнил, что уже наступал на эти грабли) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться