• stm32学习笔记:GPIO外部中断的使用


    源起:项目中需要使用统一的时间触发信号使得采样时间同步,因此需要某一个管脚来进行触发。

    硬件情况:采用PA11管脚

    需要明确的是,PxN管脚共用外部中断线EXTIN和外部中断向量EXTIN_IRQn和中断服务程序入口EXTIN_IRQHandler,但是需要注意的是[9...5]共用EXTI9_5_IRQn和EXTI9_5_IRQHandler、[15...10]共用EXTI15_10_IRQn和EXTI15_10_IRQHandler

    基本过程:

    1、设置时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
    

     注意需要打开AFIO时钟

    2、配置GPIO

    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    

    采用模拟输入方式

    3、将GPIO管脚与外部中断线连接

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);
    

      相当重要

    4、配置EXTI

    EXTI_InitStructure.EXTI_Line = EXTI_Line11;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    包括触发方式等等

    6、配置NVIC

    	NVIC_InitTypeDef NVIC_InitStructure;	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //PPP外部中断线
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    

    7、写中断服务程序

    void EXTI15_10_IRQHandler(void)
    {
    	if (EXTI_GetITStatus(EXTI_Line11) != RESET)
    	{
    		EXTI_ClearITPendingBit(EXTI_Line11); //清除标志
    		...
    	}
    }
    

      

    另外,简单的滤波方法可以在主逻辑中实现

  • 相关阅读:
    windows 乱码之 gbk 与 cp936
    jdcli 在命令行反编译jar包
    建议博客园向独立博客提供发布到首页的服务
    IsByRef在什么情况下为true?
    Hibernate里自定义UserType时取不到值的问题
    解决安装Visual Studio 2010 SP1时被NDP40KB2468871.exe补丁卡死以及mscorsvw.exe进程CPU占用率高的问题
    FROM WAS7/JDK5 TO WAS6/JDK4
    C++山寨C#中的DataTable
    程序员的自我修养读书笔记
    Web开发之路
  • 原文地址:https://www.cnblogs.com/zjgtan/p/2923482.html
Copyright © 2020-2023  润新知