Skip to content
Snippets Groups Projects
Commit 51ed38dc authored by Davide Mor's avatar Davide Mor
Browse files

[ExternalInterrupts] Added disableExternalInterrupt and changeInterruptTrigger

parent efc36c92
No related branches found
No related tags found
No related merge requests found
/* Copyright (c) 2019 Skyward Experimental Rocketry
* Author: Alvise de'Faveri Tron
* Author: Alvise de'Faveri Tron, Luca Erbetta, Davide Mor
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
......@@ -358,29 +358,73 @@ constexpr unsigned GetEXTICR_register_value(unsigned P, unsigned N)
return (ConvertGPIO_BASEtoUnsigned(P) << ((N % 4) * 4));
}
void enableExternalInterrupt(unsigned int gpioPort, unsigned int gpioNumber,
constexpr unsigned GetEXTICR_register_mask(unsigned P, unsigned N)
{
return (0b1111 << ((N % 4) * 4));
}
void enableExternalInterrupt(unsigned int gpioPort, unsigned int gpioNum,
InterruptTrigger trigger, unsigned int priority)
{
auto exitcrRegValue = GetEXTICR_register_value(gpioPort, gpioNumber);
auto exticrRegValue = GetEXTICR_register_value(gpioPort, gpioNum);
{
FastInterruptDisableLock dLock;
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
SYSCFG->EXTICR[int(gpioNumber / 4)] |= exitcrRegValue;
SYSCFG->EXTICR[int(gpioNum / 4)] |= exticrRegValue;
}
EXTI->IMR |= 1 << gpioNumber;
EXTI->IMR |= 1 << gpioNum;
if (trigger == InterruptTrigger::RISING_EDGE ||
trigger == InterruptTrigger::RISING_FALLING_EDGE)
EXTI->RTSR |= 1 << gpioNumber;
EXTI->RTSR |= 1 << gpioNum;
if (trigger == InterruptTrigger::FALLING_EDGE ||
trigger == InterruptTrigger::RISING_FALLING_EDGE)
EXTI->FTSR |= 1 << gpioNumber;
EXTI->FTSR |= 1 << gpioNum;
NVIC_EnableIRQ(static_cast<IRQn_Type>(GetEXTI_IRQn(gpioNum)));
NVIC_SetPriority(static_cast<IRQn_Type>(GetEXTI_IRQn(gpioNum)), priority);
}
void disableExternalInterrupt(unsigned int gpioPort, unsigned int gpioNum)
{
NVIC_DisableIRQ(static_cast<IRQn_Type>(GetEXTI_IRQn(gpioNum)));
EXTI->RTSR &= ~(1 << gpioNum);
EXTI->FTSR &= ~(1 << gpioNum);
EXTI->IMR &= ~(1 << gpioNum);
NVIC_EnableIRQ(static_cast<IRQn_Type>(GetEXTI_IRQn(gpioNumber)));
NVIC_SetPriority(static_cast<IRQn_Type>(GetEXTI_IRQn(gpioNumber)),
priority);
auto exticrRegMask = GetEXTICR_register_mask(gpioPort, gpioNum);
{
FastInterruptDisableLock dLock;
SYSCFG->EXTICR[int(gpioNum / 4)] &= ~exticrRegMask;
}
}
void changeInterruptTrigger(unsigned int gpioPort, unsigned int gpioNum,
InterruptTrigger trigger)
{
switch (trigger)
{
case InterruptTrigger::RISING_EDGE:
EXTI->RTSR |= 1 << gpioNum;
EXTI->FTSR &= ~(1 << gpioNum);
break;
case InterruptTrigger::FALLING_EDGE:
EXTI->RTSR &= ~(1 << gpioNum);
EXTI->FTSR |= 1 << gpioNum;
break;
case InterruptTrigger::RISING_FALLING_EDGE:
EXTI->RTSR |= 1 << gpioNum;
EXTI->FTSR |= 1 << gpioNum;
break;
}
}
\ No newline at end of file
/* Copyright (c) 2020 Skyward Experimental Rocketry
* Author: Luca Erbetta
* Author: Luca Erbetta, Davide Mor
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
......@@ -22,6 +22,8 @@
#pragma once
#include <interfaces/gpio.h>
enum class InterruptTrigger
{
RISING_EDGE,
......@@ -41,3 +43,59 @@ enum class InterruptTrigger
void enableExternalInterrupt(unsigned int gpioPort, unsigned int gpioNum,
InterruptTrigger trigger,
unsigned int priority = 15);
/**
* @brief Enables external interrupts on the provided pin.
* Remember to set the GPIO to input mode!
*
* @param gpio Pin (eg: PC4)
* @param trigger Interrupt detection trigger (rising edge, falling or both)
* @param priority Interrupt priority [0-15], 0 = Highest priority
*/
inline void enableExternalInterrupt(miosix::GpioPin gpio,
InterruptTrigger trigger,
unsigned int priority = 15)
{
enableExternalInterrupt(gpio.getPort(), gpio.getNumber(), trigger,
priority);
}
/**
* @brief Disables external interrupts on the provided pin.
*
* @param gpioPort Port of the pin (eg: GPIOC_BASE)
* @param gpioNum Pin number (eg: 4 for PC4)
*/
void disableExternalInterrupt(unsigned int gpioPort, unsigned int gpioNum);
/**
* @brief Disables external interrupts on the provided pin.
*
* @param gpio Pin (eg: PC4)
*/
inline void disableExternalInterrupt(miosix::GpioPin gpio)
{
disableExternalInterrupt(gpio.getPort(), gpio.getNumber());
}
/**
* @brief Changes interrupt trigger on an enabled interrupt.
*
* @param gpioPort Port of the pin (eg: GPIOC_BASE)
* @param gpioNum Pin number (eg: 4 for PC4)
* @param trigger Interrupt detection trigger (rising edge, falling or both)
*/
void changeInterruptTrigger(unsigned int gpioPort, unsigned int gpioNum,
InterruptTrigger trigger);
/**
* @brief Changes interrupt trigger on an enabled interrupt.
*
* @param gpio Pin (eg: PC4)
* @param trigger Interrupt detection trigger (rising edge, falling or both)
*/
inline void changeInterruptTrigger(miosix::GpioPin gpio,
InterruptTrigger trigger)
{
changeInterruptTrigger(gpio.getPort(), gpio.getNumber(), trigger);
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment