external interrupt exti2 can't Callback Topic is solved

Report here problems in any of ChibiOS components. This forum is NOT for support.
denisson
Posts: 14
Joined: Fri May 11, 2018 9:19 am
Location: depok,indonesia
Been thanked: 2 times

external interrupt exti2 can't Callback

Postby denisson » Mon Apr 04, 2022 8:44 am

hello

I have a problem where the external exti2 interrupt is not working. i work on bord stm32f769 i need 4 channel interrupt where i set on GPIOC 2,GPIOC 3,GPIOC 8,GPIOC 11. all interrupts work except GPIOC 2. i need enlightenment


thank you

Code: Select all

/*
    ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

#include "ch.h"
#include "hal.h"
// #include "rt_test_root.h"
// #include "oslib_test_root.h"
// #include "chprintf.h"

int xx=0;



// #define printf(fmt, ...)               
//     chprintf((BaseSequentialStream*)&SD1, fmt, ##__VA_ARGS__)
/*
 * This is a periodic thread that does absolutely nothing except flashing
 * a LED.
 */
static THD_WORKING_AREA(waThread1, 128);
static THD_FUNCTION(Thread1, arg) {

  (void)arg;
  chRegSetThreadName("blinker");
   palSetPadMode(GPIOD,4,PAL_MODE_OUTPUT_PUSHPULL |PAL_STM32_OSPEED_HIGHEST);
    palSetPadMode(GPIOC, 2U, PAL_MODE_INPUT_PULLDOWN);
  while (true) {
    // palToggleLine(PAL_LINE(GPIOD, 4U));
    chThdSleepMilliseconds(500);
    // palClearLine(PAL_LINE(GPIOD, 4U));
    // chThdSleepMilliseconds(500);
  }
}

static void button_cb(void *arg){
    (void)arg;
   
    chSysLockFromISR();
    // xx++;
     palToggleLine(PAL_LINE(GPIOD, 4U));
    chSysUnlockFromISR();
}
/*
 * Application entry point.
 */
int main(void) {

  /*
   * System initializations.
   * - HAL initialization, this also initializes the configured device drivers
   *   and performs the board-specific initializations.
   * - Kernel initialization, the main() function becomes a thread and the
   *   RTOS is active.
   */
  halInit();
  chSysInit();
  palEnablePadEvent(GPIOC, 2U, PAL_EVENT_MODE_RISING_EDGE);
  palSetPadCallback(GPIOC, 2U, button_cb, NULL);
  palEnableLineEvent(PAL_LINE(GPIOC, 3U), PAL_EVENT_MODE_RISING_EDGE);
  palSetLineCallback(PAL_LINE(GPIOC, 3U), button_cb, NULL);
  /*
   * ARD_D13 is programmed as output (board LED).
   */
  // palClearLine(LINE_ARD_D13);
  // palSetLineMode(LINE_ARD_D13, PAL_MODE_OUTPUT_PUSHPULL);

  /*
   * Activates the serial driver 1 using the driver default configuration.
   */
  // sdStart(&SD1, NULL);

  /*
   * Creates the example thread.
   */
  chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);

  /*
   * Normal main() thread activity, in this demo it does nothing except
   * sleeping in a loop and check the button state.
   */
  while (true) {
    // if (palReadLine(LINE_BUTTON_USER)) {
    //   // test_execute((BaseSequentialStream *)&SD1, &rt_test_suite);
    //   // test_execute((BaseSequentialStream *)&SD1, &oslib_test_suite);
    // }
    // printf("data %d\r\n",xx);
    chThdSleepMilliseconds(500);
  }
}

 

User avatar
Giovanni
Site Admin
Posts: 14455
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 1076 times
Been thanked: 922 times
Contact:

Re: external interrupt exti2 can't Callback

Postby Giovanni » Mon Apr 04, 2022 11:16 am

Hi,

I see nothing obviously wrong with GPIOC pin2 EXTI code. Are you sure that pin is available on your board? there could be something keeping it at a fixed state.

Giovanni

denisson
Posts: 14
Joined: Fri May 11, 2018 9:19 am
Location: depok,indonesia
Been thanked: 2 times

Re: external interrupt exti2 can't Callback

Postby denisson » Tue Apr 05, 2022 3:54 am

Hello
thanks for the response.
I've tried using stm32cubeide and exti2 runs normally so I'm sure that my board is working fine

thank you

User avatar
Giovanni
Site Admin
Posts: 14455
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 1076 times
Been thanked: 922 times
Contact:

Re: external interrupt exti2 can't Callback

Postby Giovanni » Tue Apr 05, 2022 6:31 am

Hi,

Which ChibiOS version are you using?

Giovanni

denisson
Posts: 14
Joined: Fri May 11, 2018 9:19 am
Location: depok,indonesia
Been thanked: 2 times

Re: external interrupt exti2 can't Callback

Postby denisson » Tue Apr 05, 2022 7:34 am

I'm using chibios v21.11.1
thank you

User avatar
Giovanni
Site Admin
Posts: 14455
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 1076 times
Been thanked: 922 times
Contact:

Re: external interrupt exti2 can't Callback

Postby Giovanni » Tue Apr 05, 2022 8:24 am

I don't see the problem just looking at code.

Few points (not errors):
- Why are you setting up GPIO lines from within the thread? I think that should be done in the main() before setting up callbacks.
- I noticed you used a "pad" function for PC2 and a "line" function for PC3.

Are you sure that PC2 is physically getting a rising edge? could it be some wiring problem? you could put a scope and verify it.

Giovanni

denisson
Posts: 14
Joined: Fri May 11, 2018 9:19 am
Location: depok,indonesia
Been thanked: 2 times

Re: external interrupt exti2 can't Callback

Postby denisson » Tue Apr 05, 2022 8:57 am

Code: Select all

/*
    ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

#include "ch.h"
#include "hal.h"
// #include "stm32f7xx_hal_gpio.h"
// #include "oslib_test_root.h"
// #include "chprintf.h"

int xx=0;



// #define printf(fmt, ...)               
//     chprintf((BaseSequentialStream*)&SD1, fmt, ##__VA_ARGS__)
/*
 * This is a periodic thread that does absolutely nothing except flashing
 * a LED.
 */
static THD_WORKING_AREA(waThread1, 128);
static THD_FUNCTION(Thread1, arg) {

  (void)arg;
  chRegSetThreadName("blinker");
 
  while (true) {
    // HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_4);
    chThdSleepMilliseconds(500);
    // palClearLine(PAL_LINE(GPIOD, 4U));
    // chThdSleepMilliseconds(500);
  }
}


static void button_cb(void *arg){
    (void)arg;
   
    chSysLockFromISR();
    // xx++;
     palToggleLine(PAL_LINE(GPIOD, 4U));
    chSysUnlockFromISR();
}
/*
 * Application entry point.
 */
int main(void) {

  /*
   * System initializations.
   * - HAL initialization, this also initializes the configured device drivers
   *   and performs the board-specific initializations.
   * - Kernel initialization, the main() function becomes a thread and the
   *   RTOS is active.
   */
  halInit();
  chSysInit();
  palSetPadMode(GPIOD,4,PAL_MODE_OUTPUT_PUSHPULL |PAL_STM32_OSPEED_HIGHEST);
  palSetPadMode(GPIOC, 2U, PAL_MODE_INPUT_PULLDOWN);
  palSetPadMode(GPIOC, 3U, PAL_MODE_INPUT_PULLDOWN);
  palEnableLineEvent(PAL_LINE(GPIOC, 2U), PAL_EVENT_MODE_RISING_EDGE);
  palSetLineCallback(PAL_LINE(GPIOC, 2U), button_cb, NULL);
  palEnableLineEvent(PAL_LINE(GPIOC, 3U), PAL_EVENT_MODE_RISING_EDGE);
  palSetLineCallback(PAL_LINE(GPIOC, 3U), button_cb, NULL);
 
  /*
   * ARD_D13 is programmed as output (board LED).
   */
  // palClearLine(LINE_ARD_D13);
  // palSetLineMode(LINE_ARD_D13, PAL_MODE_OUTPUT_PUSHPULL);

  /*
   * Activates the serial driver 1 using the driver default configuration.
   */
  // sdStart(&SD1, NULL);

  /*
   * Creates the example thread.
   */
  chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);

  /*
   * Normal main() thread activity, in this demo it does nothing except
   * sleeping in a loop and check the button state.
   */
  while (true) {
    // if (palReadLine(LINE_BUTTON_USER)) {
    //   // test_execute((BaseSequentialStream *)&SD1, &rt_test_suite);
    //   // test_execute((BaseSequentialStream *)&SD1, &oslib_test_suite);
    // }
    // printf("data %d\r\n",xx);
    chThdSleepMilliseconds(500);
  }
}

denisson
Posts: 14
Joined: Fri May 11, 2018 9:19 am
Location: depok,indonesia
Been thanked: 2 times

Re: external interrupt exti2 can't Callback

Postby denisson » Tue Apr 05, 2022 9:02 am

I tried to fix my coding. But exti2 still doesn't work. I use the generator function as a trigger. I don't think there is a problem with the cable because I use it interchangeably.


thanks

denisson
Posts: 14
Joined: Fri May 11, 2018 9:19 am
Location: depok,indonesia
Been thanked: 2 times

Re: external interrupt exti2 can't Callback

Postby denisson » Tue Apr 05, 2022 9:14 am

thank you exti2 I'm already working

User avatar
Giovanni
Site Admin
Posts: 14455
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 1076 times
Been thanked: 922 times
Contact:

Re: external interrupt exti2 can't Callback

Postby Giovanni » Tue Apr 05, 2022 9:57 am

denisson wrote:thank you exti2 I'm already working


Sorry, I have not understood this :-)

Giovanni


Return to “Bug Reports”

Who is online

Users browsing this forum: No registered users and 7 guests