AnsweredAssumed Answered

Simple GPIO interrupt is not working

Question asked by wurst.hans.003 on Nov 2, 2012

Hello,

 

I use this example code below to get an ISR from GPIO PA0. My hardware is the STM32L152 at board STM32L152D-EVAL.

(http://www.st.com/internet/evalboard/product/251703.jsp)

 

So I have only one task and before I run in infinity loop, I initialise the push_button (BUTTON_KEY = pin PA0) with interrupt mode exti0.


Without pushing the button, I always run in the ISR again and again. Only if I push the button than does not enter the ISR more than one time.

Can anybody hint me what is my mistake please?

 

001.int main(void)
002. 
003.{
005.    /* Ensure that all 4 interrupt priority bits are used as the pre-emption
006. 
007.     priority. */
008. 
009.    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
010. 
011.  
012. 
013.    /* Enable the SYSCFG module clock */
014. 
015.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
016. 
017.  
018. 
019.    /* Create the led flash task, as described at the top of this file. */
020. 
021.    xTaskCreate(hwCntrlTask, (signed char *) "hw_cntrl", mainHW_CNTRL_TASK_STACK_SIZE,
022. 
023.            NULL, mainHW_CNTRL_PRIORITY | portPRIVILEGE_BIT, &handleHwCntrlTask);
024. 
025.  
026. 
027.    /* Start the scheduler. */
028. 
029.    vTaskStartScheduler();
030. 
031.    for (;;);
032. 
033.    return 0;
034. 
035.}
036. 
037.  
038. 
039.  
040. 
041.  
042. 
043.  
044. 
045.  
046. 
047.  
048. 
049.typedef enum
050. 
051.{
052. 
053.  BUTTON_MODE_GPIO = 0,
054. 
055.  BUTTON_MODE_EXTI = 1
056. 
057.} ButtonMode_TypeDef;
058. 
059.  
060. 
061.typedef enum
062. 
063.{
064. 
065.  BUTTON_KEY = 0,
066. 
067.  BUTTON_RIGHT = 1,
068. 
069.  BUTTON_LEFT = 2,
070. 
071.  BUTTON_UP = 3,
072. 
073.  BUTTON_DOWN = 4,
074. 
075.  BUTTON_SEL = 5
076. 
077.} Button_TypeDef;
078. 
079.  
080. 
081.#define BUTTONn                          6
082. 
083./* On STM32L152-EVAL board, the KEY button is connected to PA.00 and it can
084. 
085.   be use as Wakeup pin button. */
086. 
087.  
088. 
089./**
090. 
091.* @brief Key push-button
092. 
093.*/
094. 
095.#define KEY_BUTTON_PIN                   GPIO_Pin_0
096. 
097.#define KEY_BUTTON_GPIO_PORT             GPIOA
098. 
099.#define KEY_BUTTON_GPIO_CLK              RCC_AHBPeriph_GPIOA
100. 
101.#define KEY_BUTTON_EXTI_LINE             EXTI_Line0
102. 
103.#define KEY_BUTTON_EXTI_PORT_SOURCE      EXTI_PortSourceGPIOA
104. 
105.#define KEY_BUTTON_EXTI_PIN_SOURCE       EXTI_PinSource0
106. 
107.#define KEY_BUTTON_EXTI_IRQn             EXTI0_IRQn
108. 
109.  
110. 
111./**
112. 
113.* @brief Joystick Right push-button
114. 
115.*/
116. 
117.#define RIGHT_BUTTON_PIN                 GPIO_Pin_11
118. 
119.#define RIGHT_BUTTON_GPIO_PORT           GPIOE
120. 
121.#define RIGHT_BUTTON_GPIO_CLK            RCC_AHBPeriph_GPIOE
122. 
123.#define RIGHT_BUTTON_EXTI_LINE           EXTI_Line11
124. 
125.#define RIGHT_BUTTON_EXTI_PORT_SOURCE    EXTI_PortSourceGPIOE
126. 
127.#define RIGHT_BUTTON_EXTI_PIN_SOURCE     EXTI_PinSource11
128. 
129.#define RIGHT_BUTTON_EXTI_IRQn           EXTI15_10_IRQn
130. 
131.  
132. 
133./**
134. 
135.* @brief Joystick Left push-button
136. 
137.*/
138. 
139.#define LEFT_BUTTON_PIN                  GPIO_Pin_12
140. 
141.#define LEFT_BUTTON_GPIO_PORT            GPIOE
142. 
143.#define LEFT_BUTTON_GPIO_CLK             RCC_AHBPeriph_GPIOE
144. 
145.#define LEFT_BUTTON_EXTI_LINE            EXTI_Line12
146. 
147.#define LEFT_BUTTON_EXTI_PORT_SOURCE     EXTI_PortSourceGPIOE
148. 
149.#define LEFT_BUTTON_EXTI_PIN_SOURCE      EXTI_PinSource12
150. 
151.#define LEFT_BUTTON_EXTI_IRQn            EXTI15_10_IRQn
152. 
153.  
154. 
155./**
156. 
157.* @brief Joystick Up push-button
158. 
159.*/
160. 
161.#define UP_BUTTON_PIN                    GPIO_Pin_9
162. 
163.#define UP_BUTTON_GPIO_PORT              GPIOE
164. 
165.#define UP_BUTTON_GPIO_CLK               RCC_AHBPeriph_GPIOE
166. 
167.#define UP_BUTTON_EXTI_LINE              EXTI_Line9
168. 
169.#define UP_BUTTON_EXTI_PORT_SOURCE       EXTI_PortSourceGPIOE
170. 
171.#define UP_BUTTON_EXTI_PIN_SOURCE        EXTI_PinSource9
172. 
173.#define UP_BUTTON_EXTI_IRQn              EXTI9_5_IRQn
174. 
175.  
176. 
177./**
178. 
179.* @brief Joystick Down push-button
180. 
181.*/
182. 
183.#define DOWN_BUTTON_PIN                  GPIO_Pin_10
184. 
185.#define DOWN_BUTTON_GPIO_PORT            GPIOE
186. 
187.#define DOWN_BUTTON_GPIO_CLK             RCC_AHBPeriph_GPIOE
188. 
189.#define DOWN_BUTTON_EXTI_LINE            EXTI_Line10
190. 
191.#define DOWN_BUTTON_EXTI_PORT_SOURCE     EXTI_PortSourceGPIOE
192. 
193.#define DOWN_BUTTON_EXTI_PIN_SOURCE      EXTI_PinSource10
194. 
195.#define DOWN_BUTTON_EXTI_IRQn            EXTI15_10_IRQn
196. 
197.  
198. 
199./**
200. 
201.* @brief Joystick Sel push-button
202. 
203.*/
204. 
205.#define SEL_BUTTON_PIN                   GPIO_Pin_8
206. 
207.#define SEL_BUTTON_GPIO_PORT             GPIOE
208. 
209.#define SEL_BUTTON_GPIO_CLK              RCC_AHBPeriph_GPIOE
210. 
211.#define SEL_BUTTON_EXTI_LINE             EXTI_Line8
212. 
213.#define SEL_BUTTON_EXTI_PORT_SOURCE      EXTI_PortSourceGPIOE
214. 
215.#define SEL_BUTTON_EXTI_PIN_SOURCE       EXTI_PinSource8
216. 
217.#define SEL_BUTTON_EXTI_IRQn             EXTI9_5_IRQn
218. 
219.  
220. 
221.  
222. 
223.const uint32_t BUTTON_CLK[BUTTONn] = {KEY_BUTTON_GPIO_CLK, RIGHT_BUTTON_GPIO_CLK,
224. 
225.                                      LEFT_BUTTON_GPIO_CLK, UP_BUTTON_GPIO_CLK,
226. 
227.                                      DOWN_BUTTON_GPIO_CLK, SEL_BUTTON_GPIO_CLK};
228. 
229.  
230. 
231.const uint16_t BUTTON_PIN[BUTTONn] = {KEY_BUTTON_PIN, RIGHT_BUTTON_PIN,
232. 
233.                                      LEFT_BUTTON_PIN, UP_BUTTON_PIN,
234. 
235.                                      DOWN_BUTTON_PIN, SEL_BUTTON_PIN};
236. 
237.  
238. 
239.GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {KEY_BUTTON_GPIO_PORT, RIGHT_BUTTON_GPIO_PORT,
240. 
241.                                      LEFT_BUTTON_GPIO_PORT, UP_BUTTON_GPIO_PORT,
242. 
243.                                      DOWN_BUTTON_GPIO_PORT, SEL_BUTTON_GPIO_PORT};
244. 
245.  
246. 
247.const uint16_t BUTTON_PORT_SOURCE[BUTTONn] = {KEY_BUTTON_EXTI_PORT_SOURCE,
248. 
249.                                              RIGHT_BUTTON_EXTI_PORT_SOURCE,
250. 
251.                                              LEFT_BUTTON_EXTI_PORT_SOURCE,
252. 
253.                                              UP_BUTTON_EXTI_PORT_SOURCE,
254. 
255.                                              DOWN_BUTTON_EXTI_PORT_SOURCE,
256. 
257.                                              SEL_BUTTON_EXTI_PORT_SOURCE};
258. 
259.  
260. 
261.const uint16_t BUTTON_PIN_SOURCE[BUTTONn] = {KEY_BUTTON_EXTI_PIN_SOURCE,
262. 
263.                                             RIGHT_BUTTON_EXTI_PIN_SOURCE,
264. 
265.                                             LEFT_BUTTON_EXTI_PIN_SOURCE,
266. 
267.                                             UP_BUTTON_EXTI_PIN_SOURCE,
268. 
269.                                             DOWN_BUTTON_EXTI_PIN_SOURCE,
270. 
271.                                             SEL_BUTTON_EXTI_PIN_SOURCE};
272. 
273.  
274. 
275.const uint16_t BUTTON_EXTI_LINE[BUTTONn] = {KEY_BUTTON_EXTI_LINE,
276. 
277.                                            RIGHT_BUTTON_EXTI_LINE,
278. 
279.                                            LEFT_BUTTON_EXTI_LINE,
280. 
281.                                            UP_BUTTON_EXTI_LINE,
282. 
283.                                            DOWN_BUTTON_EXTI_LINE,
284. 
285.                                            SEL_BUTTON_EXTI_LINE};
286. 
287.  
288. 
289.const uint16_t BUTTON_IRQn[BUTTONn] = {KEY_BUTTON_EXTI_IRQn, RIGHT_BUTTON_EXTI_IRQn,
290. 
291.                                       LEFT_BUTTON_EXTI_IRQn, UP_BUTTON_EXTI_IRQn,
292. 
293.                                       DOWN_BUTTON_EXTI_IRQn, SEL_BUTTON_EXTI_IRQn};
294. 
295.  
296. 
297.  
298. 
299.  
300. 
301./**
302. 
303.  * @brief  Configures Button GPIO and EXTI Line.
304. 
305.  * @param  Button: Specifies the Button to be configured.
306. 
307.  *   This parameter can be one of following parameters:
308. 
309.  *     @arg BUTTON_KEY: Key Push Button
310. 
311.  *     @arg BUTTON_RIGHT: Joystick Right Push Button
312. 
313.  *     @arg BUTTON_LEFT: Joystick Left Push Button
314. 
315.  *     @arg BUTTON_UP: Joystick Up Push Button
316. 
317.  *     @arg BUTTON_DOWN: Joystick Down Push Button
318. 
319.  *     @arg BUTTON_SEL: Joystick Sel Push Button
320. 
321.  * @param  Button_Mode: Specifies Button mode.
322. 
323.  *   This parameter can be one of following parameters:
324. 
325.  *     @arg BUTTON_MODE_GPIO: Button will be used as simple IO
326. 
327.  *     @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line with interrupt
328. 
329.  *                     generation capability
330. 
331.  * @retval None
332. 
333.  */
334. 
335.void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode)
336. 
337.{
338. 
339.  GPIO_InitTypeDef GPIO_InitStructure;
340. 
341.  EXTI_InitTypeDef EXTI_InitStructure;
342. 
343.  NVIC_InitTypeDef NVIC_InitStructure;
344. 
345.  
346. 
347.  /* There is no Wakeup and Tamper buttons on STM32L152-EVAL. */
348. 
349.  
350. 
351.  /* Enable the BUTTON Clock */
352. 
353.  RCC_AHBPeriphClockCmd(BUTTON_CLK[Button], ENABLE);
354. 
355.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
356. 
357.  
358. 
359.  /* Configure Button pin as input */
360. 
361.  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
362. 
363.  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
364. 
365.  GPIO_InitStructure.GPIO_Pin = BUTTON_PIN[Button];
366. 
367.  GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStructure);
368. 
369.  
370. 
371.  if (Button_Mode == BUTTON_MODE_EXTI)
372. 
373.  {
374. 
375.    /* Connect Button EXTI Line to Button GPIO Pin */
376. 
377.    SYSCFG_EXTILineConfig(BUTTON_PORT_SOURCE[Button], BUTTON_PIN_SOURCE[Button]);
378. 
379.    /* Configure Button EXTI line */
380. 
381.    EXTI_InitStructure.EXTI_Line = BUTTON_EXTI_LINE[Button];
382. 
383.    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
384. 
385.  
386. 
387.    if(Button != BUTTON_KEY)
388. 
389.    {
390. 
391.      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
392. 
393.    }
394. 
395.    else
396. 
397.    {
398. 
399.      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
400. 
401.    }
402. 
403.    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
404. 
405.    EXTI_Init(&EXTI_InitStructure);
406. 
407.  
408. 
409.    /* Enable and set Button EXTI Interrupt to the lowest priority */
410. 
411.    NVIC_InitStructure.NVIC_IRQChannel = BUTTON_IRQn[Button];
412. 
413.    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
414. 
415.    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
416. 
417.    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
418. 
419.  
420. 
421.    NVIC_Init(&NVIC_InitStructure);
422. 
423.  }
424. 
425.}
426. 
427.  
428. 
429.//! My task:
430. 
431.void hwCntrlTask(void *pvParameters)
432. 
433.{
434. 
435.STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_EXTI);
436. 
437.    while(1)
438. 
439.    {
440. 
441.        vTaskDelay( 100 / portTICK_RATE_MS);   //! block for 100 ms
442. 
443.     }
444. 
445.}
446. 
447.  
448. 
449.void EXTI0_IRQHandler(void)
450. 
451.{
452. 
453.    //Check if EXTI_Line0 is asserted
454. 
455.    if(EXTI_GetITStatus(EXTI_Line0) != RESET)
456. 
457.    {
458. 
459.    }
460. 
461.    //we need to clear line pending bit manually
462. 
463.    EXTI_ClearITPendingBit(EXTI_Line0);
464. 
465.}

 

 

 

Outcomes