Skip to content

Commit

Permalink
Configure NMI
Browse files Browse the repository at this point in the history
  • Loading branch information
polesskiy-dev committed Nov 19, 2023
1 parent b556d01 commit b7fa61f
Show file tree
Hide file tree
Showing 8 changed files with 358 additions and 37 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#
#Sun Nov 19 20:07:57 TRT 2023
#Sun Nov 19 20:16:43 TRT 2023
default.languagetoolchain.version=4.35
default.Pack.dfplocation=/Applications/microchip/mplabx/v6.15/packs/Microchip/SAMD21_DFP/3.6.144
default.com-microchip-mplab-mdbcore-simulator-Simulator.md5=aa9d1097190a66d1314d421a6f2603b4
Expand Down
2 changes: 1 addition & 1 deletion firmware/src/config/default/harmony-manifest-success.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@


project: iot-risk-data-logger-nfc-samd21
creation_date: 2023-11-19T20:07:56.611+03:00[Europe/Istanbul] # ISO 8601 format: https://www.w3.org/TR/NOTE-datetime
creation_date: 2023-11-19T20:16:42.617+03:00[Europe/Istanbul] # ISO 8601 format: https://www.w3.org/TR/NOTE-datetime
operating_system: Mac OS X
mcc_mode: IDE # [IDE|Standalone|Headless]
mcc_version: v5.3.7
Expand Down
5 changes: 2 additions & 3 deletions firmware/src/config/default/interrupts.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,11 @@ void __attribute__((optimize("-O1"), long_call, noreturn, used))Dummy_Handler(vo
}

/* MISRAC 2012 deviation block start */
/* MISRA C-2012 Rule 8.6 deviated 19 times. Deviation record ID - H3_MISRAC_2012_R_8_6_DR_1 */
/* MISRA C-2012 Rule 8.6 deviated 18 times. Deviation record ID - H3_MISRAC_2012_R_8_6_DR_1 */
/* Device vectors list dummy definition*/
extern void PM_Handler ( void ) __attribute__((weak, alias("Dummy_Handler")));
extern void SYSCTRL_Handler ( void ) __attribute__((weak, alias("Dummy_Handler")));
extern void WDT_Handler ( void ) __attribute__((weak, alias("Dummy_Handler")));
extern void EIC_Handler ( void ) __attribute__((weak, alias("Dummy_Handler")));
extern void NVMCTRL_Handler ( void ) __attribute__((weak, alias("Dummy_Handler")));
extern void DMAC_Handler ( void ) __attribute__((weak, alias("Dummy_Handler")));
extern void EVSYS_Handler ( void ) __attribute__((weak, alias("Dummy_Handler")));
Expand Down Expand Up @@ -121,7 +120,7 @@ const H3DeviceVectors exception_table=
.pfnSYSCTRL_Handler = SYSCTRL_Handler,
.pfnWDT_Handler = WDT_Handler,
.pfnRTC_Handler = RTC_InterruptHandler,
.pfnEIC_Handler = EIC_Handler,
.pfnEIC_Handler = EIC_InterruptHandler,
.pfnNVMCTRL_Handler = NVMCTRL_Handler,
.pfnDMAC_Handler = DMAC_Handler,
.pfnUSB_Handler = DRV_USBFSV1_USB_Handler,
Expand Down
1 change: 1 addition & 0 deletions firmware/src/config/default/interrupts.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ void vPortSVCHandler (void);
void xPortPendSVHandler (void);
void xPortSysTickHandler (void);
void RTC_InterruptHandler (void);
void EIC_InterruptHandler (void);
void DRV_USBFSV1_USB_Handler (void);
void SERCOM0_I2C_InterruptHandler (void);
void SERCOM1_SPI_InterruptHandler (void);
Expand Down
87 changes: 80 additions & 7 deletions firmware/src/config/default/peripheral/eic/plib_eic.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@
// Section: Global Data
// *****************************************************************************
// *****************************************************************************
/* EIC Channel Callback object */
volatile static EIC_CALLBACK_OBJ eicCallbackObject[EXTINT_COUNT];


void EIC_Initialize(void)
{
Expand All @@ -79,22 +82,42 @@ void EIC_Initialize(void)
EIC_REGS->EIC_CONFIG[0] = EIC_CONFIG_SENSE0_NONE |
EIC_CONFIG_SENSE1_NONE |
EIC_CONFIG_SENSE2_NONE |
EIC_CONFIG_SENSE3_NONE |
EIC_CONFIG_SENSE3_FALL |
EIC_CONFIG_SENSE4_NONE |
EIC_CONFIG_SENSE5_NONE |
EIC_CONFIG_SENSE6_NONE |
EIC_CONFIG_SENSE7_NONE ;
EIC_CONFIG_SENSE5_RISE |
EIC_CONFIG_SENSE6_RISE |
EIC_CONFIG_SENSE7_RISE ;

/* Interrupt sense type and filter control for EXTINT channels 8 to 15 */
EIC_REGS->EIC_CONFIG[1] = EIC_CONFIG_SENSE0_NONE |
EIC_CONFIG_SENSE1_NONE |
EIC_CONFIG_SENSE2_NONE |
EIC_CONFIG_SENSE2_LOW |
EIC_CONFIG_SENSE3_NONE |
EIC_CONFIG_SENSE4_NONE |
EIC_CONFIG_SENSE5_NONE |
EIC_CONFIG_SENSE6_NONE |
EIC_CONFIG_SENSE7_NONE ;

EIC_CONFIG_SENSE7_RISE ;

/* External Interrupt enable*/
EIC_REGS->EIC_INTENSET = 0x4a8;

/* Callbacks for enabled interrupts */
eicCallbackObject[0].eicPinNo = EIC_PIN_MAX;
eicCallbackObject[1].eicPinNo = EIC_PIN_MAX;
eicCallbackObject[2].eicPinNo = EIC_PIN_MAX;
eicCallbackObject[3].eicPinNo = EIC_PIN_3;
eicCallbackObject[4].eicPinNo = EIC_PIN_MAX;
eicCallbackObject[5].eicPinNo = EIC_PIN_5;
eicCallbackObject[6].eicPinNo = EIC_PIN_6;
eicCallbackObject[7].eicPinNo = EIC_PIN_7;
eicCallbackObject[8].eicPinNo = EIC_PIN_MAX;
eicCallbackObject[9].eicPinNo = EIC_PIN_MAX;
eicCallbackObject[10].eicPinNo = EIC_PIN_10;
eicCallbackObject[11].eicPinNo = EIC_PIN_MAX;
eicCallbackObject[12].eicPinNo = EIC_PIN_MAX;
eicCallbackObject[13].eicPinNo = EIC_PIN_MAX;
eicCallbackObject[14].eicPinNo = EIC_PIN_MAX;
eicCallbackObject[15].eicPinNo = EIC_PIN_MAX;

/* Enable the EIC */
EIC_REGS->EIC_CTRL |= EIC_CTRL_ENABLE_Msk;
Expand All @@ -105,3 +128,53 @@ void EIC_Initialize(void)
}
}

void EIC_InterruptEnable(EIC_PIN pin)
{
EIC_REGS->EIC_INTENSET = (1UL << (uint32_t)pin);
}

void EIC_InterruptDisable(EIC_PIN pin)
{
EIC_REGS->EIC_INTENCLR = (1UL << (uint32_t)pin);
}

void EIC_CallbackRegister(EIC_PIN pin, EIC_CALLBACK callback, uintptr_t context)
{
if (eicCallbackObject[pin].eicPinNo == pin)
{
eicCallbackObject[pin].callback = callback;

eicCallbackObject[pin].context = context;
}
}

void __attribute__((used)) EIC_InterruptHandler(void)
{
uint8_t currentChannel;
uint32_t eicIntFlagStatus;

/* Find any triggered channels, run associated callback handlers */
for (currentChannel = 0; currentChannel < EXTINT_COUNT; currentChannel++)
{
/* Verify if the EXTINT x Interrupt Pin is enabled */
if (((uint8_t)eicCallbackObject[currentChannel].eicPinNo == currentChannel))
{
/* Read the interrupt flag status */
eicIntFlagStatus = EIC_REGS->EIC_INTFLAG & (1UL << currentChannel);

if (eicIntFlagStatus != 0U)
{
/* Find any associated callback entries in the callback table */
if ((eicCallbackObject[currentChannel].callback != NULL))
{
uintptr_t context = eicCallbackObject[currentChannel].context;
eicCallbackObject[currentChannel].callback(context);
}

/* Clear interrupt flag */
EIC_REGS->EIC_INTFLAG = (1UL << currentChannel);
}
}
}
}

36 changes: 36 additions & 0 deletions firmware/src/config/default/peripheral/eic/plib_eic.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,41 @@

typedef enum
{
/* External Interrupt Controller Pin 3 */
EIC_PIN_3 = 3,

/* External Interrupt Controller Pin 5 */
EIC_PIN_5 = 5,

/* External Interrupt Controller Pin 6 */
EIC_PIN_6 = 6,

/* External Interrupt Controller Pin 7 */
EIC_PIN_7 = 7,

/* External Interrupt Controller Pin 10 */
EIC_PIN_10 = 10,

EIC_PIN_MAX = 16

} EIC_PIN;


typedef void (*EIC_CALLBACK) (uintptr_t context);

typedef struct
{
/* External Interrupt Pin Callback Handler */
EIC_CALLBACK callback;

/* External Interrupt Pin Client context */
uintptr_t context;

/* External Interrupt Pin number */
EIC_PIN eicPinNo;

} EIC_CALLBACK_OBJ;


// *****************************************************************************
// *****************************************************************************
Expand All @@ -91,6 +121,12 @@ typedef enum

void EIC_Initialize(void);

void EIC_InterruptEnable(EIC_PIN pin);

void EIC_InterruptDisable(EIC_PIN pin);

void EIC_CallbackRegister(EIC_PIN pin, EIC_CALLBACK callback, uintptr_t context);



#ifdef __cplusplus // Provide C++ Compatibility
Expand Down
2 changes: 2 additions & 0 deletions firmware/src/config/default/peripheral/nvic/plib_nvic.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ void NVIC_Initialize( void )
* from within the "Interrupt Manager" of MHC. */
NVIC_SetPriority(RTC_IRQn, 3);
NVIC_EnableIRQ(RTC_IRQn);
NVIC_SetPriority(EIC_IRQn, 3);
NVIC_EnableIRQ(EIC_IRQn);
NVIC_SetPriority(USB_IRQn, 3);
NVIC_EnableIRQ(USB_IRQn);
NVIC_SetPriority(SERCOM0_IRQn, 3);
Expand Down

0 comments on commit b7fa61f

Please sign in to comment.