硬汉嵌入式论坛

 找回密码
 立即注册
查看: 753|回复: 7
收起左侧

[GPIO] 外部中断触发,进入中断后,数据自加会出错?

[复制链接]

9

主题

20

回帖

47

积分

新手上路

积分
47
发表于 2022-7-21 12:43:46 | 显示全部楼层 |阅读模式


进入中断后,自加,竟然会出错??
static volatile uint32_t pos_flow = 1;
static volatile uint32_t neg_flow = 1;

/**
* @brief  This function handles External lines interrupt request.
*/
void EXTI4_15_IRQHandler(void) {
//    gpio_exti_callback();
//    static volatile uint32_t pos_flow = 1;
//    static volatile uint32_t neg_flow = 1;

    static uint32_t k = 0x22;
    static uint8_t new = 0, last = 0;
    uint8_t flag = 0;

//    DISABLE_INT();

    /* C线 */
    if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_4) != RESET) {
        hall_info.storage[hall_info.count++] |= EXTI_A;
        //        hall_info.reg |= EXTI_A;

        new = EXTI_A;
        flag = 1;
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);
    }
    /* B线 */
    if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_5) != RESET) {
        hall_info.storage[hall_info.count++] |= EXTI_B;
        //        hall_info.reg |= EXTI_B;

        new = EXTI_B;
        flag = 1;
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5);
    }
    /* A线 */
    if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_6) != RESET) {
        hall_info.storage[hall_info.count++] |= EXTI_C;
        //        hall_info.reg |= EXTI_C;

        new = EXTI_C;
        flag = 1;
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_6);
    }

    if (flag) {
        if (last == 0) {
            last = new;
        } else {
            switch (new) {
            case EXTI_C:/* C */
                /* 正转 */
                if (last == EXTI_A) {
                    pos_flow++;
                }
                /* 反转 */
                if (last == EXTI_B) {
                    neg_flow++;
                }
                break;
            case EXTI_B:/* B */
                /* 正转 */
                if (last == EXTI_C) {
                    pos_flow++;
                }
                /* 反转 */
                if (last == EXTI_A) {
                    neg_flow++;
                }
                break;
            case EXTI_A:/* A */
                /* 正转 */
                if (last == EXTI_B) {
                    pos_flow++;
                }
                /* 反转 */
                if (last == EXTI_C) {
                    neg_flow++;
                }
                break;
            default:
                /* 错误 */
                hall_info.error += 1; /* 读取后才可以修改 */
                break;
            }
            last = new;
        }

//        hall_info.neg_flow = neg_flow;
//        hall_info.pos_flow = pos_flow;

//        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

        printf("neg_flow:%u\r\n", neg_flow);
        printf("pos_flow:%u\r\n", pos_flow);

        printf("k:%u\r\n", k++);
    }

//    ENABLE_INT();
}





回复

使用道具 举报

9

主题

20

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2022-7-21 12:44:07 | 显示全部楼层
图片.png
回复

使用道具 举报

9

主题

20

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2022-7-21 12:44:52 | 显示全部楼层
编译器用的GCC
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2022-7-22 01:44:36 | 显示全部楼层
看程序没发现什么问题,不过程序输出确实诡异,另外串口打印可以注释掉,直接调试状态全速运行看计算是否正常。
回复

使用道具 举报

2

主题

62

回帖

68

积分

初级会员

积分
68
发表于 2022-7-22 07:58:46 | 显示全部楼层
怀疑两个地方,在中断中不使用printf函数,另外一个栈溢出数据被覆盖   
回复

使用道具 举报

9

主题

20

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2022-7-22 11:17:55 | 显示全部楼层
eric2013 发表于 2022-7-22 01:44
看程序没发现什么问题,不过程序输出确实诡异,另外串口打印可以注释掉,直接调试状态全速运行看计算是否正 ...

全速运行,也还是,突然就出错,这就很纳闷
回复

使用道具 举报

9

主题

20

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2022-7-22 11:20:30 | 显示全部楼层
图片.png 图片.png
回复

使用道具 举报

9

主题

20

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2022-7-22 11:21:28 | 显示全部楼层
heluo1985 发表于 2022-7-22 07:58
怀疑两个地方,在中断中不使用printf函数,另外一个栈溢出数据被覆盖

不使用printf 也是一样, 计数,计着计着就突然变大,这就很离谱
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 23:45 , Processed in 0.186089 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表