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 /* 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 * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
...@@ -358,29 +358,73 @@ constexpr unsigned GetEXTICR_register_value(unsigned P, unsigned N) ...@@ -358,29 +358,73 @@ constexpr unsigned GetEXTICR_register_value(unsigned P, unsigned N)
return (ConvertGPIO_BASEtoUnsigned(P) << ((N % 4) * 4)); 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) InterruptTrigger trigger, unsigned int priority)
{ {
auto exitcrRegValue = GetEXTICR_register_value(gpioPort, gpioNumber); auto exticrRegValue = GetEXTICR_register_value(gpioPort, gpioNum);
{ {
FastInterruptDisableLock dLock; FastInterruptDisableLock dLock;
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; 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 || if (trigger == InterruptTrigger::RISING_EDGE ||
trigger == InterruptTrigger::RISING_FALLING_EDGE) trigger == InterruptTrigger::RISING_FALLING_EDGE)
EXTI->RTSR |= 1 << gpioNumber; EXTI->RTSR |= 1 << gpioNum;
if (trigger == InterruptTrigger::FALLING_EDGE || if (trigger == InterruptTrigger::FALLING_EDGE ||
trigger == InterruptTrigger::RISING_FALLING_EDGE) trigger == InterruptTrigger::RISING_FALLING_EDGE)
EXTI->FTSR |= 1 << gpioNumber; EXTI->FTSR |= 1 << gpioNum;
NVIC_EnableIRQ(static_cast<IRQn_Type>(GetEXTI_IRQn(gpioNumber))); NVIC_EnableIRQ(static_cast<IRQn_Type>(GetEXTI_IRQn(gpioNum)));
NVIC_SetPriority(static_cast<IRQn_Type>(GetEXTI_IRQn(gpioNumber)), NVIC_SetPriority(static_cast<IRQn_Type>(GetEXTI_IRQn(gpioNum)), priority);
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);
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 /* 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 * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#pragma once #pragma once
#include <interfaces/gpio.h>
enum class InterruptTrigger enum class InterruptTrigger
{ {
RISING_EDGE, RISING_EDGE,
...@@ -41,3 +43,59 @@ enum class InterruptTrigger ...@@ -41,3 +43,59 @@ enum class InterruptTrigger
void enableExternalInterrupt(unsigned int gpioPort, unsigned int gpioNum, void enableExternalInterrupt(unsigned int gpioPort, unsigned int gpioNum,
InterruptTrigger trigger, InterruptTrigger trigger,
unsigned int priority = 15); 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.
Please register or to comment