aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/exti.h
blob: c7284541930f1aafca7334c8e548615512384ae4 (plain)
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/* *****************************************************************************
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *  Created: 12/18/09 02:35:33
 *  Copyright (c) 2009 Perry L. Hung. All rights reserved.
 *
 * ****************************************************************************/

/**
 *  @file exti.h
 *
 *  @brief External interrupt control prototypes and defines
 */

#ifndef _EXTI_H_
#define _EXTI_H_

#include <inttypes.h>
/* Notes:
 *
 * To generate the interrupt, the interrupt line should be configured and
 * enabled. This is done by programming the two trigger registers with the
 * desired edge detection and by enabling the interrupt request by writing a
 * '1' to the corresponding bit in the interrupt mask register.  When the
 * selected edge occurs on the external interrupt line, an interrupt request is
 * generated. The pending bit corresponding to the interrupt line is also set.
 * This request is reset by writing a '1' in the pending register.
 *
 * Hardware interrupt selection:
 * To configure the 20 lines as interrupt sources, use the following procedure:
 * 1) Configure AFIO_EXTIICR[y] to select the source input for EXTIx external 
 *    interrupt
 * 2) Configure the mask bits of the 20 interrupt lines (EXTI_IMR)
 * 3) Configure the trigger selection bits of the interrupt lines (EXTI_RTSR and EXTI_FTSR)
 * 4) Configure the enable and mask bits that control the NVIC_IRQ channel mapped to the External
 * Interrupt Controller (EXTI) so that an inerrupt coming from one of the 20 lines
 * can be correctly acknowledged.
 *
 * AFIO clock must be on.
 *
 * RM0008, page 107: "PD0, PD1 cannot be used for external interrupt/event generation
 * on 36, 48, 64-bin packages."
 *
 * ----------------------------------------------------------------------------
 * Pin to EXTI Line Mappings:
 * EXTI0          EXTI1          EXTI2           EXTI3             EXTI4
 * ----------------------------------------------------------------------------
 * D2/PA0         D3/PA1         D1/PA2          D0/A6/PA3         D10/A10/PA4
 * D26/EXT7/PB0   D27/EXT8/PB1   D16/A2/PC2      D17/A3/PC3        D18/A4/PC4
 * D14/A0/PC0     D15/PC1        D25/EXT5/PD2
 *
 * EXTI5          EXTI6          EXTI7           EXTI8             EXTI9
 * ----------------------------------------------------------------------------
 * D13/A13/PA5    D12/A12/PA6    D11/A11/PA7     D6/PA8            D7/PA9
 * D4/PB5         D5/PB6         D9/PB7          D38/PB8           D23/EXT4/PB9
 * D19/A5/PC5     D34/EXTI15/PC6 D35/EXT16/PC7   D36/PC8           D37/EXT18/PC9
 *
 * EXTI10         EXTI11         EXTI12          EXTI13            EXTI14
 * ----------------------------------------------------------------------------
 * D8/PA10        D29/EXT10/PB11 D30/EXTI1/PB12  D31/EXTI12/PB13   D32/EXT13/PB14
 * D28/PB10                                      D20/EXTI1/PC13    D21/EXT2/PC14
 * D25/PC10
 *
 * EXTI15
 * ----------------------------------------------------------------------------
 * D33/EXTI14/PB15
 * D22/EXT3/PC15
 *
 *
 * The 16 EXTI interrupts are mapped to 7 interrupt handlers.
 *
 * EXTI Lines to Interrupt Mapping:
 * EXTI0 -> EXTI0
 * EXTI1 -> EXTI1
 * EXTI2 -> EXTI2
 * EXTI3 -> EXTI3
 * EXTI4 -> EXTI4
 * EXTI[5-9] -> EXT9_5
 * EXTI[10-15] -> EXT15_10
 *
 *
 * */

#define NR_EXTI_CHANNELS         16
#define NR_EXTI_PORTS             4
#define NR_EXTI_MODES             3

#define EXTI_IMR        0x40010400                   // Interrupt mask register
#define EXTI_EMR        (EXTI_IMR + 0x04)            // Event mask register
#define EXTI_RTSR       (EXTI_IMR + 0x08)            // Rising trigger selection register
#define EXTI_FTSR       (EXTI_IMR + 0x0C)            // Falling trigger selection register
#define EXTI_SWIER      (EXTI_IMR + 0x10)            // Software interrupt event register
#define EXTI_PR         (EXTI_IMR + 0x14)            // Pending register

#define AFIO_EVCR       0x40010000
#define AFIO_EXTICR1    (AFIO_EVCR + 0x08)
#define AFIO_EXTICR2    (AFIO_EVCR + 0x0C)
#define AFIO_EXTICR3    (AFIO_EVCR + 0x10)
#define AFIO_EXTICR4    (AFIO_EVCR + 0x14)

#define EXTI_RISING                     0
#define EXTI_FALLING                    1
#define EXTI_RISING_FALLING             2

#define EXTI0  0
#define EXTI1  1
#define EXTI2  2
#define EXTI3  3
#define EXTI4  4
#define EXTI5  5
#define EXTI6  6
#define EXTI7  7
#define EXTI8  8
#define EXTI9  9
#define EXTI10 10
#define EXTI11 11
#define EXTI12 12
#define EXTI13 13
#define EXTI14 14
#define EXTI15 15

#define EXTI_CONFIG_PORTA 0
#define EXTI_CONFIG_PORTB 1
#define EXTI_CONFIG_PORTC 2
#define EXTI_CONFIG_PORTD 3


#ifdef __cplusplus
extern "C"{
#endif

void exti_attach_interrupt(uint8_t, uint8_t, voidFuncPtr, uint8_t);
void exti_detach_interrupt(uint8_t);

#ifdef __cplusplus
} // extern "C"
#endif


#endif