-
Notifications
You must be signed in to change notification settings - Fork 0
/
External_interrupts.c
110 lines (90 loc) · 3.84 KB
/
External_interrupts.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*******************************************************************************************************
* [FILE NAME] : <External_interrupts.c> *
* [AUTHOR] : <Eslam EL-Naggar> *
* [DATE CREATED]: <Dec 4, 2019> *
* [Description} : <source file for external interrupts Driver> *
******************************************************************************************************/
/*----------------------------------------INCLUDES----------------------------------------------------*/
#include "External_interrupts.h"
/*--------------------------------------DEFINITIONS---------------------------------------------------*/
#define NULL_PTR ((void*)0)
/*------------------------------------GLOBAL VARIABLES------------------------------------------------*/
static volatile void (*g_INT0_callBackPtr)(void) = NULL_PTR;
static volatile void (*g_INT1_callBackPtr)(void) = NULL_PTR;
static volatile void (*g_INT2_callBackPtr)(void) = NULL_PTR;
/*----------------------------------ISR DEFINITIONS---------------------------------------------------*/
ISR(INT0_vect) {
if (g_INT0_callBackPtr != NULL_PTR) {
(*g_INT0_callBackPtr)();
}
}
ISR(INT1_vect) {
if (g_INT1_callBackPtr != NULL_PTR) {
(*g_INT1_callBackPtr)();
}
}
ISR(INT2_vect) {
if (g_INT2_callBackPtr != NULL_PTR) {
(*g_INT2_callBackPtr)();
}
}
/*--------------------------------------FUNCTIONS DEFINITIONS----------------------------------------*/
/*----------------------------------------------------------------------------------------------------
[Function Name]: ExternalInterrupts_init
[Description] : This function is responsible for initialize external interrupts
[Returns] : This function returns void
----------------------------------------------------------------------------------------------------*/
void ExternalInterrupts_init(
E_Interrupts_configType *E_Interrupts_configType_Ptr) {
if (E_Interrupts_configType_Ptr->INT0_configType == OFF_INT0) {
GICR &= ~(1 << INT0);
} else {
DDRD &= ~(1 << PD2);
PORTD |= (1 << PD2);
GICR |= (1 << INT0);
MCUCR = (MCUCR & 0b11111100)
| ((E_Interrupts_configType_Ptr->INT0_configType & 0b00000011)
<< (ISC00));
}
if (E_Interrupts_configType_Ptr->INT1_configType == OFF_INT1) {
GICR &= ~(1 << INT1);
} else {
DDRD &= ~(1 << PD3);
PORTD |= (1 << PD3);
GICR |= (1 << INT1);
MCUCR = (MCUCR & 0b11111100)
| ((E_Interrupts_configType_Ptr->INT1_configType & 0b00000011)
<< (ISC10));
}
if (E_Interrupts_configType_Ptr->INT2_configType == OFF_INT2) {
GICR &= ~(1 << INT2);
} else {
SREG &= ~(1 << 7);
DDRB &= (~(1 << PB2));
PORTB |= (1 << PB2);
GICR |= (1 << INT2);
MCUCSR = (MCUCSR & 0b10111111)
| ((E_Interrupts_configType_Ptr->INT2_configType & 0b00000001)
<< (ISC2));
SREG |= (1 << 7);
}
}
/*----------------------------------------------------------------------------------------------------
[Function Name]: ExternalInterrupts_Deinit
[Description] : This function is responsible for deinitilization of external interrupts
[Returns] : This function returns void
----------------------------------------------------------------------------------------------------*/
void ExternalInterrupts_Deinit() {
GICR &= ~(1 << INT0);
GICR &= ~(1 << INT1);
GICR &= ~(1 << INT2);
}
void ExternalInterrupts_INT0_setCallBack(void (*INT0_setCallBack_Ptr)(void)) {
g_INT0_callBackPtr = INT0_setCallBack_Ptr;
}
void ExternalInterrupts_INT1_setCallBack(void (*INT1_setCallBack_Ptr)(void)) {
g_INT1_callBackPtr = INT1_setCallBack_Ptr;
}
void ExternalInterrupts_INT2_setCallBack(void (*INT2_setCallBack_Ptr)(void)) {
g_INT2_callBackPtr = INT2_setCallBack_Ptr;
}