STM32f4. Внешние прерывания по кнопке.
Приветствую! Имеется stm32f4discovery и подключенная к ней внешняя кнопка. Нужно, чтобы при нажатии на внешнюю кнопку на определенных пинах выставлялась 1 или 0. Кто-нибудь делал такое, используя внешние прерывания?
Вроде немного разобрался. Здесь конкретно моя задача: к stm32f4discovery подключена внешняя кнопка. При ее нажатии должна "включится" кнопка User на плате, которая в свою очередь при ее нажатии включает светодиоды по кругу. Если внешняя кнопка не нажата, то кнопка User "не включена". Рабочий код:
Код: Выделить всё
#include "stm32f4xx.h"
void delay(__IO uint32_t nCount)
{
while(nCount--)
{
}
}
void EXTI15_10_IRQHandler(void)
{
EXTI->PR |=EXTI_PR_PR13;
if ((GPIOC->IDR & 0x04000000)!=0x04000000)
{
if ((GPIOA->IDR & 0x01)==0x01)
{
GPIO_SetBits(GPIOD, GPIO_Pin_12);
delay(0x111111);
GPIO_SetBits(GPIOD, GPIO_Pin_13);
delay(0x111111);
GPIO_SetBits(GPIOD, GPIO_Pin_14);
delay(0x111111);
GPIO_SetBits(GPIOD, GPIO_Pin_15);
delay(0x111111);
GPIO_ResetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
delay(0x111111);
}}
else
{ GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOD, &GPIO_InitStructure);
SystemInit();
//***********RCC****************
RCC->APB2ENR |=RCC_APB2ENR_SYSCFGEN;
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;
//***********GPIOC**************
GPIOC->MODER &=~GPIO_MODER_MODER13;
GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR13;
//***********SYSCFG*************
SYSCFG->EXTICR[3] |= SYSCFG_EXTICR4_EXTI13_PC;// PC13
//***********EXTI***************
EXTI->IMR |=(EXTI_IMR_MR13);
EXTI->RTSR |=(EXTI_RTSR_TR13);
EXTI->FTSR |=(EXTI_FTSR_TR13);
//***********NVIC***************
NVIC_EnableIRQ(EXTI15_10_IRQn);
NVIC_SetPriority(EXTI15_10_IRQn,14);
while(1)
{
}
}
delay() в прерывании - это плохо. Очень плохо Не надо так делать. Попробуй следующий алгоритм: Настрой внешние прерывания для кнопки 1 и 2. Прерывание кнопки 1 и 2 должно реагировать как на возрастающий так и на спадающий фронт (нажата/отжата) При нажатии кнопки 1 ты попадаешь в обработчик прерывания, который включает EXTI прерывания для кнопки 2. При отпускании кнопки - выключает. В обработчике прерываний кнопки 2 выставляешь флаг (присваиваешь в переменную 0 или 1) согласно которой в main() светодиоды по кругу будут включатся (или выключатся при отпущенной кнопке)
Вернуться в «Микроконтроллеры и ПЛИС»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей