working interrupt handler list with makro for handling the interrupt flags inside the ISR

master
polymurph 2 years ago
parent 157d3f61ad
commit a97b1885f5

@ -19,6 +19,7 @@
extern "C" {
#endif
#include "interrupt.h"
#include "hardwareDescription.h"
/*! interrupt types. These act as indexes for the */
@ -67,52 +68,11 @@ typedef enum {
intTypeEND
}intrType_t;
static uint32_t intHandlerList[intTypeEND]={0};
//static uint32_t intHandlerList[intTypeEND]={0};
static const uint8_t interruptTypeIndexList[intTypeEND] =
{
TIM1_BRK_UP_TRG_COM_IRQn,
TIM1_BRK_UP_TRG_COM_IRQn,
TIM1_BRK_UP_TRG_COM_IRQn,
TIM1_BRK_UP_TRG_COM_IRQn,
TIM1_CC_IRQn,
TIM1_CC_IRQn,
TIM1_CC_IRQn,
TIM1_CC_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM14_IRQn,
TIM14_IRQn,
TIM14_IRQn,
TIM16_IRQn,
TIM16_IRQn,
TIM16_IRQn,
TIM16_IRQn,
TIM16_IRQn,
TIM17_IRQn,
TIM17_IRQn,
TIM17_IRQn,
TIM17_IRQn,
TIM17_IRQn
};
extern volatile void (*intHandlerArray[intTypeEND])();
extern const uint8_t interruptTypeIndexList[intTypeEND];
#ifdef __cplusplus
}

@ -1,5 +1,6 @@
#include "interrupt.h"
#include "hwd_interrupt.h"
#include "pin.h"
/**
* @brief Default Handler
@ -8,6 +9,53 @@
*/
static void defaultHandler(){};
volatile void (*intHandlerArray[intTypeEND])() = {NULL};
const uint8_t interruptTypeIndexList[intTypeEND] =
{
TIM1_BRK_UP_TRG_COM_IRQn,
TIM1_BRK_UP_TRG_COM_IRQn,
TIM1_BRK_UP_TRG_COM_IRQn,
TIM1_BRK_UP_TRG_COM_IRQn,
TIM1_CC_IRQn,
TIM1_CC_IRQn,
TIM1_CC_IRQn,
TIM1_CC_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM2_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM3_IRQn,
TIM14_IRQn,
TIM14_IRQn,
TIM14_IRQn,
TIM16_IRQn,
TIM16_IRQn,
TIM16_IRQn,
TIM16_IRQn,
TIM16_IRQn,
TIM17_IRQn,
TIM17_IRQn,
TIM17_IRQn,
TIM17_IRQn,
TIM17_IRQn
};
void intInit(
intrType_t intType,
intHandler_t handler,
@ -15,8 +63,11 @@ void intInit(
{
NVIC_SetPriority(interruptTypeIndexList[intType], priority);
// TODO: add index ceck!
intHandlerList[intType] = (uint32_t)handler;
// check if index is correct
if(intType >= intTypeEND) return;
//intHandlerList[intType] = handler;
intHandlerArray[intType] = handler;
}
void intEnableAll()

@ -1,12 +1,15 @@
#include "timer.h"
#include "interrupt.h"
#include "hwd_interrupt.h"
#include <stdlib.h>
#define BASE ((TIM_TypeDef *)timerBase_Addr_List[timer])
// debug notes: the makro works. what seems to not work is the indexing and calling the handler!
#define HANDLE_INT_FLAG(flagReg, flagMask, intType)\
do {if ((flagReg) & (flagMask)) {\
(flagReg) &= ~(flagMask);\
((intHandler_t)(intHandlerList[(intType)]))();\
if(intHandlerArray[(intType)] == NULL) continue;\
intHandlerArray[(intType)]();\
}} while (0)
void timerReset(timerNo_t timer)
@ -259,9 +262,9 @@ void timerThrowError(timerError_t error)
void TIM1_BRK_UP_TRG_COM_IRQHandler()
{
HANDLE_INT_FLAG(TIM1->SR,TIM_SR_BIF,TIM1_BREAK);
HANDLE_INT_FLAG(TIM1->SR,TIM_SR_BIF,TIM1_UPDATE);
HANDLE_INT_FLAG(TIM1->SR,TIM_SR_BIF,TIM1_TRIGGER);
HANDLE_INT_FLAG(TIM1->SR,TIM_SR_BIF,TIM1_COMMUNICATION);
HANDLE_INT_FLAG(TIM1->SR,TIM_SR_UIF,TIM1_UPDATE);
HANDLE_INT_FLAG(TIM1->SR,TIM_SR_TIF,TIM1_TRIGGER);
HANDLE_INT_FLAG(TIM1->SR,TIM_SR_COMIF,TIM1_COMMUNICATION);
}
void TIM1_CC_IRQHandler()
@ -274,7 +277,23 @@ void TIM1_CC_IRQHandler()
void TIM2_IRQHandler()
{
/*
if(TIM2->SR & TIM_SR_UIF) {
TIM2->SR &= ~TIM_SR_UIF;
if(intHandlerArray[TIM2_UPDATE] == NULL) return;
//pinToggle(pinB3);
intHandlerArray[TIM2_UPDATE]();
// debug info: not working here!
//((intHandler_t)(intHandlerList[TIM2_UPDATE]))();
}
*/
HANDLE_INT_FLAG(TIM2->SR,TIM_SR_UIF,TIM2_UPDATE);
/*
HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC1IF,TIM2_COUNTERCOMPARE_1);
HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC2IF,TIM2_COUNTERCOMPARE_2);
HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC3IF,TIM2_COUNTERCOMPARE_3);
@ -284,6 +303,7 @@ void TIM2_IRQHandler()
HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC2OF,TIM2_CAPTURECOMPARE_2);
HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC3OF,TIM2_CAPTURECOMPARE_3);
HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC4OF,TIM2_CAPTURECOMAPRE_4);
*/
}
void TIM3_IRQHandler()
@ -309,7 +329,7 @@ void TIM16_IRQHandler()
HANDLE_INT_FLAG(TIM16->SR,TIM_SR_UIF,TIM16_UPDATE);
}
void TIM117_IRQHandler()
void TIM17_IRQHandler()
{
HANDLE_INT_FLAG(TIM17->SR,TIM_SR_CC1OF,TIM17_CAPTURECOMPARE_1_OVERCAPTURE);
HANDLE_INT_FLAG(TIM17->SR,TIM_SR_BIF,TIM17_BREAK);

@ -60,6 +60,10 @@ typedef enum {
pwm_inverted /*!< Inverted PWM mode */
} timerOutputCompareMode_t ;
void timerStart(timerNo_t timer);
/*!
* @brief Reset the timer to its default state
* @param timer The handle of the desired timer

@ -21,10 +21,12 @@ extern "C" {
#endif
#include <stdint.h>
#include <stdlib.h>
#include "hwd_interrupt.h"
/*! interrupt callback type for the handler */
typedef void (*intHandler_t)(void);
//void (*intHandlerArray[intTypeEND])()={NULL};
/**
* @brief Initialize Interrupt

Loading…
Cancel
Save