1 | void ConfigReferenceInterrupts( void )
|
2 | {
|
3 | /** Initialisierung */
|
4 | EXTI_InitTypeDef EXTI_Reference_PD6_InitStruct;
|
5 | EXTI_InitTypeDef EXTI_Reference_PD7_InitStruct;
|
6 | EXTI_InitTypeDef EXTI_Reference_PD8_InitStruct;
|
7 | EXTI_InitTypeDef EXTI_Reference_PD9_InitStruct;
|
8 |
|
9 | NVIC_InitTypeDef NVIC_Reference_InitStruct;
|
10 |
|
11 |
|
12 | RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOD, ENABLE);
|
13 |
|
14 | GPIO_Initializer.GPIO_Mode = GPIO_Mode_IN;
|
15 | GPIO_Initializer.GPIO_OType = GPIO_OType_PP; //PP = push-pull mode
|
16 | GPIO_Initializer.GPIO_Pin = REFERENCEPIN_LEFT | REFERENCEPIN_RIGHT | REFERENCEPIN_BOTTOM | REFERENCEPIN_TOP;
|
17 | GPIO_Initializer.GPIO_PuPd = GPIO_PuPd_DOWN;
|
18 | GPIO_Initializer.GPIO_Speed = GPIO_Speed_2MHz;
|
19 |
|
20 | GPIO_Init(REFERENCE_PORT, &GPIO_Initializer);
|
21 |
|
22 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
23 |
|
24 | /** PD6 */
|
25 | SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource6 );
|
26 | EXTI_Reference_PD6_InitStruct.EXTI_Line = EXTI_Line6;
|
27 | EXTI_Reference_PD6_InitStruct.EXTI_LineCmd = ENABLE;
|
28 | EXTI_Reference_PD6_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
|
29 | EXTI_Reference_PD6_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
|
30 | EXTI_Init(&EXTI_Reference_PD6_InitStruct);
|
31 |
|
32 | /** PD7 */
|
33 | SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource7 );
|
34 | EXTI_Reference_PD7_InitStruct.EXTI_Line = EXTI_Line7;
|
35 | EXTI_Reference_PD7_InitStruct.EXTI_LineCmd = ENABLE;
|
36 | EXTI_Reference_PD7_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
|
37 | EXTI_Reference_PD7_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
|
38 | EXTI_Init(&EXTI_Reference_PD7_InitStruct);
|
39 |
|
40 | /** PD8 */
|
41 | SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource8 );
|
42 | EXTI_Reference_PD8_InitStruct.EXTI_Line = EXTI_Line8;
|
43 | EXTI_Reference_PD8_InitStruct.EXTI_LineCmd = ENABLE;
|
44 | EXTI_Reference_PD8_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
|
45 | EXTI_Reference_PD8_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
|
46 | EXTI_Init(&EXTI_Reference_PD8_InitStruct);
|
47 |
|
48 | /** PD9 */
|
49 | SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource9 );
|
50 | EXTI_Reference_PD9_InitStruct.EXTI_Line = EXTI_Line9;
|
51 | EXTI_Reference_PD9_InitStruct.EXTI_LineCmd = ENABLE;
|
52 | EXTI_Reference_PD9_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
|
53 | EXTI_Reference_PD9_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
|
54 | EXTI_Init(&EXTI_Reference_PD9_InitStruct);
|
55 |
|
56 |
|
57 | NVIC_Reference_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
|
58 | NVIC_Reference_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
|
59 | NVIC_Reference_InitStruct.NVIC_IRQChannelSubPriority = 0x01;
|
60 | NVIC_Reference_InitStruct.NVIC_IRQChannelCmd = ENABLE;
|
61 | NVIC_Init( &NVIC_Reference_InitStruct );
|
62 | }
|
63 |
|
64 |
|
65 | /** Die übrigen vier Interrupts sind vollkommen analog zu den dargestellten Interrupts auf PORTD konfiguriert, deshalb habe ich sie hier ausgelassen um den Code übersichtlicher zu halten, auf Wunsch kann diese Funktion aber auch gerne nachgereicht werden */
|
66 |
|
67 |
|
68 | /** Interrupt-Handler */
|
69 | void EXTI9_5_IRQHandler( void )
|
70 | {
|
71 |
|
72 | if (EXTI_GetITStatus(EXTI_Line6) != RESET) //Sekundaer rechts -> PD6
|
73 | {
|
74 | Reference_right_reached = true;
|
75 |
|
76 | EXTI_ClearITPendingBit(EXTI_Line6);
|
77 | NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
|
78 | }
|
79 |
|
80 | if (EXTI_GetITStatus(EXTI_Line7) != RESET) //Sekundaer links -> PD7
|
81 | {
|
82 | Reference_left_reached = true;
|
83 |
|
84 | EXTI_ClearITPendingBit(EXTI_Line7);
|
85 | NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
|
86 | }
|
87 |
|
88 | if (EXTI_GetITStatus(EXTI_Line8) != RESET) //Z Top -> PD8
|
89 | {
|
90 | Reference_top_reached = true;
|
91 |
|
92 | EXTI_ClearITPendingBit(EXTI_Line8);
|
93 | NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
|
94 | }
|
95 |
|
96 | if (EXTI_GetITStatus(EXTI_Line9) != RESET) //Z Bottom -> PD9
|
97 | {
|
98 | Reference_bottom_reached = true;
|
99 |
|
100 | EXTI_ClearITPendingBit(EXTI_Line9);
|
101 | NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
|
102 | }
|
103 |
|
104 | EXTI_ClearITPendingBit(EXTI_Line6);
|
105 | EXTI_ClearITPendingBit(EXTI_Line7);
|
106 | EXTI_ClearITPendingBit(EXTI_Line8);
|
107 | EXTI_ClearITPendingBit(EXTI_Line9);
|
108 | NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
|
109 | }
|
110 |
|
111 |
|
112 | void EXTI15_10_IRQHandler( void )
|
113 | {
|
114 | if (EXTI_GetITStatus(EXTI_Line11) != RESET ) //->Secondary Encoder A // !=RESET
|
115 | {
|
116 | if( GPIO_ReadInputDataBit( SECONDARY_ROTARY_PORT, SECONDARY_ROTARY_B ) == 0x00 )
|
117 | {
|
118 | secondary_counter++;
|
119 | } else {
|
120 | secondary_counter--;
|
121 | }
|
122 |
|
123 | EXTI_ClearITPendingBit(EXTI_Line11);
|
124 | NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
|
125 | }
|
126 |
|
127 | if (EXTI_GetITStatus(EXTI_Line12) != RESET ) //->Secondary Encoder B
|
128 | {
|
129 | if( GPIO_ReadInputDataBit( SECONDARY_ROTARY_PORT, SECONDARY_ROTARY_A ) == 0x00 )
|
130 | {
|
131 | secondary_counter--;
|
132 | } else {
|
133 | secondary_counter++;
|
134 | }
|
135 |
|
136 | EXTI_ClearITPendingBit(EXTI_Line12);
|
137 | NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
|
138 | }
|
139 |
|
140 |
|
141 | if (EXTI_GetITStatus(EXTI_Line13) != RESET ) //->Primary Encoder A
|
142 | {
|
143 | if( GPIO_ReadInputDataBit( PRIMARY_ROTARY_PORT, PRIMARY_ROTARY_B ) == 0x00 )
|
144 | {
|
145 | primary_counter++;
|
146 | } else {
|
147 | primary_counter--;
|
148 | }
|
149 |
|
150 | EXTI_ClearITPendingBit(EXTI_Line13);
|
151 | NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
|
152 | }
|
153 |
|
154 | if (EXTI_GetITStatus(EXTI_Line14) != RESET ) //->Primary Encoder B
|
155 | {
|
156 | if( GPIO_ReadInputDataBit( PRIMARY_ROTARY_PORT, PRIMARY_ROTARY_A ) == 0x00 )
|
157 | {
|
158 | primary_counter--;
|
159 | } else {
|
160 | primary_counter++;
|
161 | }
|
162 |
|
163 | EXTI_ClearITPendingBit(EXTI_Line14);
|
164 | NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
|
165 | }
|
166 |
|
167 | EXTI_ClearITPendingBit(EXTI_Line11);
|
168 | EXTI_ClearITPendingBit(EXTI_Line12);
|
169 | EXTI_ClearITPendingBit(EXTI_Line13);
|
170 | EXTI_ClearITPendingBit(EXTI_Line14);
|
171 | }
|