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" { extern "C" {
#endif #endif
#include "interrupt.h"
#include "hardwareDescription.h" #include "hardwareDescription.h"
/*! interrupt types. These act as indexes for the */ /*! interrupt types. These act as indexes for the */
@ -67,52 +68,11 @@ typedef enum {
intTypeEND intTypeEND
}intrType_t; }intrType_t;
static uint32_t intHandlerList[intTypeEND]={0}; //static uint32_t intHandlerList[intTypeEND]={0};
static const uint8_t interruptTypeIndexList[intTypeEND] = extern volatile void (*intHandlerArray[intTypeEND])();
{
TIM1_BRK_UP_TRG_COM_IRQn, extern const uint8_t interruptTypeIndexList[intTypeEND];
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
};
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -1,5 +1,6 @@
#include "interrupt.h" #include "interrupt.h"
#include "hwd_interrupt.h" #include "hwd_interrupt.h"
#include "pin.h"
/** /**
* @brief Default Handler * @brief Default Handler
@ -8,6 +9,53 @@
*/ */
static void defaultHandler(){}; 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( void intInit(
intrType_t intType, intrType_t intType,
intHandler_t handler, intHandler_t handler,
@ -15,8 +63,11 @@ void intInit(
{ {
NVIC_SetPriority(interruptTypeIndexList[intType], priority); NVIC_SetPriority(interruptTypeIndexList[intType], priority);
// TODO: add index ceck! // check if index is correct
intHandlerList[intType] = (uint32_t)handler; if(intType >= intTypeEND) return;
//intHandlerList[intType] = handler;
intHandlerArray[intType] = handler;
} }
void intEnableAll() void intEnableAll()

@ -1,12 +1,15 @@
#include "timer.h" #include "timer.h"
#include "interrupt.h" #include "interrupt.h"
#include "hwd_interrupt.h"
#include <stdlib.h>
#define BASE ((TIM_TypeDef *)timerBase_Addr_List[timer]) #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)\ #define HANDLE_INT_FLAG(flagReg, flagMask, intType)\
do {if ((flagReg) & (flagMask)) {\ do {if ((flagReg) & (flagMask)) {\
(flagReg) &= ~(flagMask);\ (flagReg) &= ~(flagMask);\
((intHandler_t)(intHandlerList[(intType)]))();\ if(intHandlerArray[(intType)] == NULL) continue;\
intHandlerArray[(intType)]();\
}} while (0) }} while (0)
void timerReset(timerNo_t timer) void timerReset(timerNo_t timer)
@ -26,7 +29,7 @@ void timerActivateBus(timerNo_t timer)
if(timerBus_No[timer]==1) if(timerBus_No[timer]==1)
{ {
RCC->APB1ENR |= (1<<timerBus_En_bitPos[timer]); RCC->APB1ENR |= (1<<timerBus_En_bitPos[timer]);
return; return;
} }
RCC->APB2ENR |= (1<<timerBus_En_bitPos[timer]); RCC->APB2ENR |= (1<<timerBus_En_bitPos[timer]);
} }
@ -259,9 +262,9 @@ void timerThrowError(timerError_t error)
void TIM1_BRK_UP_TRG_COM_IRQHandler() 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_BREAK);
HANDLE_INT_FLAG(TIM1->SR,TIM_SR_BIF,TIM1_UPDATE); HANDLE_INT_FLAG(TIM1->SR,TIM_SR_UIF,TIM1_UPDATE);
HANDLE_INT_FLAG(TIM1->SR,TIM_SR_BIF,TIM1_TRIGGER); HANDLE_INT_FLAG(TIM1->SR,TIM_SR_TIF,TIM1_TRIGGER);
HANDLE_INT_FLAG(TIM1->SR,TIM_SR_BIF,TIM1_COMMUNICATION); HANDLE_INT_FLAG(TIM1->SR,TIM_SR_COMIF,TIM1_COMMUNICATION);
} }
void TIM1_CC_IRQHandler() void TIM1_CC_IRQHandler()
@ -273,8 +276,24 @@ void TIM1_CC_IRQHandler()
} }
void TIM2_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_UIF,TIM2_UPDATE);
/*
HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC1IF,TIM2_COUNTERCOMPARE_1); 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_CC2IF,TIM2_COUNTERCOMPARE_2);
HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC3IF,TIM2_COUNTERCOMPARE_3); 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_CC2OF,TIM2_CAPTURECOMPARE_2);
HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC3OF,TIM2_CAPTURECOMPARE_3); HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC3OF,TIM2_CAPTURECOMPARE_3);
HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC4OF,TIM2_CAPTURECOMAPRE_4); HANDLE_INT_FLAG(TIM2->SR,TIM_SR_CC4OF,TIM2_CAPTURECOMAPRE_4);
*/
} }
void TIM3_IRQHandler() void TIM3_IRQHandler()
@ -309,7 +329,7 @@ void TIM16_IRQHandler()
HANDLE_INT_FLAG(TIM16->SR,TIM_SR_UIF,TIM16_UPDATE); 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_CC1OF,TIM17_CAPTURECOMPARE_1_OVERCAPTURE);
HANDLE_INT_FLAG(TIM17->SR,TIM_SR_BIF,TIM17_BREAK); HANDLE_INT_FLAG(TIM17->SR,TIM_SR_BIF,TIM17_BREAK);

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

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

Loading…
Cancel
Save