STM32之中断与事件一个使用GPIO作为外部中断的示例

发布者:WiseThinker最新更新时间:2016-05-12 来源: eefocus关键字:STM32  中断与事件  GPIO  外部中断 手机看文章 扫描二维码
随时随地手机看文章

1.GPIO 的正确设置

GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOD clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

/* Configure PD.03, PC.04, as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3); //PD3作为外部中断引脚


其中GPIO_EXITLineConfig函数的声明如下:

/
* @brief Selects the GPIO pin used as EXTI Line.
* @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.
* This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).
* @param GPIO_PinSource: specifies the EXTI line to be configured.
* This parameter can be GPIO_PinSourcex where x can be (0..15).
* @retval None
*/
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)


2.中断初始化

EXTI_InitTypeDef EXTI_InitStructure;

// Configure EXTI Line3 to generate an interrupt on falling edge
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource4);

// Configure EXTI Line4 to generate an interrupt on falling edge
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);


3.在NVIC_Configuration 中Configures the NVIC and Vector Table base address.

/* Configure the Priority Group to 2 bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* enabling interrupt */
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* Enable the EXTI3 Interrupt on PD.3 */
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the EXTI4 Interrupt on PD.4 */
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


4.在stm32f0x_it.c 中写入 中断处理函数
 

/*
* Function Name : EXTI3_IRQHandler
* Description : This function handles External interrupt Line 3 request.
* Input : None
* Output : None
* Return : None
*/
void EXTI3_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line3) != RESET)
    {
        // Led_RW_ON();
        GPIO_SetBits(GPIOC, GPIO_Pin_4| GPIO_Pin_5 );


        /* Clear the EXTI line 9 pending bit */
        EXTI_ClearITPendingBit(EXTI_Line3);
    }
}

/*
* Function Name : EXTI4_IRQHandler
* Description : This function handles External interrupt Line 4 request.
* Input : None
* Output : None
* Return : None
*/
void EXTI4_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line4) != RESET)
    {
        //Led_RW_OFF();
        GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);
        /* Clear the EXTI line 9 pending bit */
        EXTI_ClearITPendingBit(EXTI_Line4);
    }
}


注:本文参考:http://www.61ic.com/Technology/embed/201103/31045.html

 

 

另一个示例:

配置如下:

 

void vcm_airbag_exti_set(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;

	/* Enable key GPIO clock */
  	RCC_AHB1PeriphClockCmd(AIRBAG_GPIO_RCC, ENABLE);

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

	/* Configure  pin(PD_15): airbag gpio */
    GPIO_InitStructure.GPIO_Pin = AIRBAG_GPIO_PIN;
    GPIO_Init(AIRBAG_GPIO_PORT, &GPIO_InitStructure);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 			//´ò¿ªEXTIʱÖÓ
	SYSCFG_EXTILineConfig(AIRBAG_EXTI_PORT, AIRBAG_EXTI_PIN);		//ÉèÖÃPD15ΪEXTI

    /* Configure  EXTI  */
//	EXTI_DeInit();
    EXTI_InitStructure.EXTI_Line = AIRBAG_EXTI_LINE; 	//ÉèÖÃÒý½Å
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	//ÉèÖÃΪÍⲿÖжÏģʽ
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;  // ÉèÖÃÉÏÉýºÍϽµÑض¼¼ì²â
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;				 //ʹÄÜÍⲿÖжÏÐÂ״̬
    EXTI_Init(&EXTI_InitStructure);  						 //¸ù¾ÝEXTI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèEXTI¼Ä´æÆ÷

  
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				   //ʹÄÜÍⲿÖжÏͨµÀ	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;		  //ÏÈÕ¼ÓÅÏȼ¶4λ,¹²16¼¶
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;  //ÏÈÕ¼ÓÅÏȼ¶0λ,´ÓÓÅÏȼ¶4λ
	NVIC_Init(&NVIC_InitStructure);								  //¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷
}


 

 

中断例程:

 

void EXTI15_10_IRQHandler(void)
{
	rt_interrupt_enter();

	/* °²È«ÆøÄÒÓ²Ïß¼ì²â´¦Àí¡¡*/
	vcm_airbag_exti_check();
	/* GPSÌìÏß¿ªÂ·¼ì²â´¦Àí¡¡*/
	gps_exti_check();

	rt_interrupt_leave();
}


 

 

void vcm_airbag_exti_check(void)
{
	//¼ì²éµ±Ç°ÖжϵÄ״̬ÊÇ·ñºÏ·¨
	if(EXTI_GetITStatus(AIRBAG_EXTI_LINE) != RESET)
	{	
		//¶ÁÈ¡¹Ü½ÅµÄ״̬,ÕâÀï·µ»Ø0±íʾ°²È«ÆøÄÒ±¬¿ª
		if(0 ==GPIO_ReadInputDataBit(AIRBAG_GPIO_PORT,AIRBAG_GPIO_PIN))
		{ 
			recv_frame.bus_type = BTYPE_HS_CAN;
			recv_frame.id = 0x545;
			recv_frame.data_buff[0] = 0x00;
			recv_frame.data_buff[1] = 0x01;
			recv_frame.data_buff[2] = 0x00;
			recv_frame.data_buff[3] = 0x00;
			recv_frame.data_buff[4] = 0x00;
			recv_frame.data_buff[5] = 0x00;
			recv_frame.data_buff[6] = 0x00;
			recv_frame.data_buff[7] = 0x00;
			VCM_DEBUG("[vcm] warning: airbag gpio interrupt rising.\r\n");
		}
		else
		{
			recv_frame.bus_type = BTYPE_HS_CAN;
			recv_frame.id = 0x545;
			recv_frame.data_buff[0] = 0x00;
			recv_frame.data_buff[1] = 0x00;
			recv_frame.data_buff[2] = 0x00;
			recv_frame.data_buff[3] = 0x00;
			recv_frame.data_buff[4] = 0x00;
			recv_frame.data_buff[5] = 0x00;
			recv_frame.data_buff[6] = 0x00;
			recv_frame.data_buff[7] = 0x00;
			VCM_DEBUG("[vcm] warning: airbag gpio interrupt falling.\r\n");
		}
		rt_mq_send(&recv_frame_mq,&recv_frame,sizeof(can_bus_frame));
		//ÇåÖжϱê־λ
		EXTI_ClearITPendingBit(AIRBAG_EXTI_LINE);		
	}	
}
 
关键字:STM32  中断与事件  GPIO  外部中断 引用地址:STM32之中断与事件一个使用GPIO作为外部中断的示例

上一篇:ARM中外部中断的配置流程供参考
下一篇:ARM汇编外部中断

推荐阅读最新更新时间:2024-03-16 14:53

STM32 HAL库 USB CDC程序只能接收一次数据
使用STM32Cube生成了USB CDC基础代码,HAL库版本号为1.6.0 SELF_POWERED: ENABLE Physical: interface phy_itface 将初始化好的代码编译下载到设备中可直接接入计算机,并安装stsw-stm32102-VCP软件,配置该软件目录下的stmcdc.inf文件将其中的VID和PID配置为与设备相同的ID号,然后安装32位或者64位dpinst程序即可成功安装驱动。 stm32vcp程序实际上使用了windows的usbser.sys文件,因此使用精简版系统的需要自行安装usbser这个驱动文件。 接下来打开串口助手,打开对应的串口号,发送一组数据。在设备的u
[单片机]
STM32串口介绍
串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段, 其重要性不言而喻。STM32 的串口资源相当丰富的,功能也相当强劲。ALIENTEK 战舰 STM32 开发板所使用的 STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA等。 串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能,GPIO 时钟使能 2) 串口复位 3) GPIO 端口模式设置 4) 串口参数初始化 5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤) 6) 使能串
[单片机]
stm32的互补输出和死区插入
1,简介 死区,简单解释:通常,大功率电机、变频器等,末端都是由大功率管、IGBT等元件组成的H桥或3相桥。每个桥的上半桥和下半桥是是绝对不能同时导通的,但高速的PWM驱动信号在达到功率元件的控制极时,往往会由于各种各样的原因产生延迟的效果,造成某个半桥元件在应该关断时没有关断,造成功率元件烧毁。死区就是在上半桥关断后,延迟一段时间再打开下半桥或在下半桥关断后,延迟一段时间再打开上半桥,从而避免功率元件烧毁。这段延迟时间就是死区。(就是上、下半桥的元件都是关断的)死区时间控制在通常的低端单片机所配备的PWM中是没有的。 PWM的上下桥臂的三极管是不能同时导通的。如果同时导通就会是电源两端短路。所以,两路触发信号要在一段时间内都是使
[单片机]
STM32 PWM输出控制步进电机-3000转每分钟串口显示+电位器调速
用电位器控制步进电机转速,可以控制正反转,在电位器中点停止;越往左翻转越快,越往右正转越快。速度均匀,包含滤波。付完整代码。全部测试正常。 单片机源程序: #include led.h #include delay.h #include key.h #include sys.h #include usart.h #include timer.h #include adc.h int main(void) { u16 adcx; float temp; int a=3999; //int b=0 u16 led0pwmval=200; u8
[单片机]
STM32-中断优先级
中断作为系统资源里面尤为重要的一种系统资源,可以对于硬件的运行发挥着不可或缺的地位。基本每一个硬件都会有相应的中断,只不过是中断类型和中断数量多少的问题。像51单片机的硬件就拥有比较简单中断类型,例如定时器中断、串口接收中断、外部中断等几个简单中断,用起来也是十分简单。 对于STM32来说因为它使用的基于M3和M4的内核,就M3内核而言,支持256个中断其中包含了16个内核中断和240个外部中断,而且具有256级的可编程中断设置。但是STM32并没有将这些中断都添加到自身的硬件资源中而是使用了其中的部分中断,一种拥有84个中断,包括了16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。103系列只有60个可屏蔽中
[单片机]
关于STM32的BOOT0和BOOT1
STM32一共有三种启动模式,在ST官网上下载的RM0008中,可找到启动相关的配置说明: 翻译为中文: STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区 域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执 行程序,见下表: BOOT1=x BOOT
[单片机]
STM32笔记SD卡的读写和FatFS文件系统
因为要用,学习了一下SPI操作SD卡,同时移植了一个免费开源的FAT文件系统:FatFS。感觉挺好,在单片机上实现了读写文件的操作,接下来就可以解释我的G代码咯!   我的SD卡底层操作参考了网上几种常见的代码,但又对其结构做了一定的优化,至少看起来用起来比较方便。既可以作为文件系统的diskio使用,也可以直接使用底层函数,把SD卡作为一块flash读写。   FatFs文件系统体积蛮小,6-7K足矣,对于128Kflash的STM32来说很合适,代价不大。同时可移植性很高,最少只需要4个函数修改既可以实现文件系统的移植。相关文件系统的介绍 请看这里 。   这里给一套比较完整的参考资料,包括fatfs文件系统的原版资料、几个重
[单片机]
<font color='red'>STM32</font>笔记SD卡的读写和FatFS文件系统
STM32 FSMC机制flash拓展
STM32是ST(意法半导体)公司推出的基于ARM内核Cortex-M3的32位微控制器系列。Cortex-M3内核是为低功耗和价格敏感的应用而专门设计的,具有突出的能效比和处理速度。通过采用Thumb-2高密度指令集,Cortex-M3内核降低了系统存储要求,同时快速的中断处理能够满足控制领域的高实时性要求,使基于该内核设计的STM32系列微控制器能够以更优越的性价比,面向更广泛的应用领域。 STM32系列微控制器为用户提供了丰富的选择,可适用于工业控制、智能家电、建筑安防、医疗设备以及消费类电子产品等多方位嵌入式系统设计。STM32系列采用一种新型的存储器扩展技术——FSMC,在外部存储器扩展方面具有独特的优势,可根据系统的
[单片机]
<font color='red'>STM32</font> FSMC机制flash拓展
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved