打印

【转】GD32使用外部中断需要延时才能读到真正的电平

[复制链接]
871|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jerow|  楼主 | 2019-3-30 15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MCU:GD32F103RCT6中断引脚没有外界上拉电阻

使用特权

评论回复
沙发
jerow|  楼主 | 2019-3-30 15:52 | 只看该作者
中断配置如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource9);
   
    EXTI_InitStructure.EXTI_Line=EXTI_Line9;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;   
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

使用特权

评论回复
板凳
jerow|  楼主 | 2019-3-30 15:53 | 只看该作者
中断函数如下:
void EXTI9_5_IRQHandler(void)
{
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
   
   
    if(EXTI_GetITStatus(EXTI_Line9) != RESET)
    {
        debug("%d",GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9));
        debug("%d",GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9));
        debug("%d",GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9));
        if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9) != 0)
        {
            debug("relay power on, device_power_on is 1");
            xTaskNotifyFromISR( xTaskHandleLoadDatatoServerBuf, g_flag_event[RELAY_POWER_ON], eSetBits, &xHigherPriorityTaskWoken );
            g_data_info.power_on = 1;
        }else
        {
            debug("relay power off, device_power_on is 0");
            xTaskNotifyFromISR( xTaskHandleLoadDatatoServerBuf, g_flag_event[RELAY_POWER_OFF], eSetBits, &xHigherPriorityTaskWoken );
            g_data_info.power_on = 0;
        }
        EXTI_ClearITPendingBit(EXTI_Line9);
    }
    portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}

使用特权

评论回复
地板
tomyoct| | 2019-3-31 11:25 | 只看该作者
奇怪,不应该加延时的吧?不然实时性就没有了

使用特权

评论回复
5
lvben5d| | 2019-4-13 09:57 | 只看该作者
本帖最后由 lvben5d 于 2019-4-13 13:47 编辑

你外部电路是否存在 反复抖动从而导致要加几个debug,如果是,可以简单在硬件上加RC,否则检测到有电平跳变就进入中断的你的应用,查看下逻辑处理。我用过旋转编码器加了1个104电容 基本没抖动了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

520

帖子

3

粉丝