STM32外部中断+TFTLCD显示

最后都变了- 提交于 2020-02-08 20:23:26

STM32外部中断简介

STM32的中断系统由嵌套中断向量控制器(Nested Vectored Interrupt Controller,NVIC)、外部中断/事件控制器(External Interrupt/Event Controller,EXTI)和各个外设中断控制器部分构成。
我们通过外部中断/事件线路映射。
将IO端口映射到16根外部中断线上,外部中断的GPIO的端口映射可由下图体现。
在这里插入图片描述
每一组相同的编号的GPIO都被映射到同一个外部中断/事件寄存器中。使用时Cortex-M3可以通过外部中断或者内部中断唤醒内核配置外部IO端口、RTC闹钟和USB唤醒事件来唤醒CPU。
在这里插入图片描述
我们在exti.c文件中进行 EXTIX_Init(void)函数编写,以及EXTI0_IRQHandler(void)进行IO口的中断服务程序。在EXTIX_Init(void)函数
中我们需要根据硬件的IO选择相应的中断线以及中断通道。为使用WK_UP、KEY0、KEY1三个按键分别连接到PA0、PE4、PE3三个IO口同时注意到KEY0、
KEY1低电平有效WK_UP按键高电平有效。因此我们在中断中使用中断线0中断线3中断线4(注意此时将WK_UP电阻上拉)
在这里插描述

void EXTIX_Init(void)
{
 
   	EXTI_InitTypeDef EXTI_InitStructure;
 	  NVIC_InitTypeDef NVIC_InitStructure;

    KEY_Init();	 
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	

   //GPIOE.3	    KEY1
  	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
  	EXTI_InitStructure.EXTI_Line=EXTI_Line3;
  	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
  	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  	EXTI_Init(&EXTI_InitStructure);	  	

   //GPIOE.4	  	KEY0
  	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
  	EXTI_InitStructure.EXTI_Line=EXTI_Line4;
  	EXTI_Init(&EXTI_InitStructure);	  	


   //GPIOA.0	   PA0  WK_UP
 	  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); 

  	EXTI_InitStructure.EXTI_Line=EXTI_Line0;
  	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  	EXTI_Init(&EXTI_InitStructure);		

//设置中断EXTIO中断向量控制
  	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;					
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								
  	NVIC_Init(&NVIC_InitStructure); 
//设置中断EXTI3中断向量控制
  	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;			
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;					 
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								
  	NVIC_Init(&NVIC_InitStructure);  	  
//设置中断EXTI4中断向量控制
  	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;		
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;					
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								
  	NVIC_Init(&NVIC_InitStructure);  	 
}

TFTLCD显示

使用的TFTLCD型号为2.4&2.8寸TFT(ILI9341芯片驱动)为实现此功能,计划配置好lcd.c并在主函数中使能,并在中断服务程序调用,可以根据自己的需求使用LCD_ShowString()函数模型控制字体的位置大小(注意fond.h字库函数的使用。

240*320分辨率
16位真彩显示(65536色)
自带电阻触摸屏
自带背光电路

以下是中断服务程序

void EXTI0_IRQHandler(void)
{
	delay_ms(10);
	if(WK_UP==1)	 	
	{				 
		LCD_ShowString(30,40,210,40,24,"");
	}
	EXTI_ClearITPendingBit(EXTI_Line0);//清空中断线上标志位
}   

void EXTI3_IRQHandler(void)
{
	delay_ms(10);
	if(KEY1==0)	 
	{				 
		LCD_ShowString(30,70,200,40,24,"");
	}		 
	EXTI_ClearITPendingBit(EXTI_Line3); //清空中断线上标志位  
}
void EXTI4_IRQHandler(void)
{
	delay_ms(10);
	if(KEY0==0)	 
	{
		LCD_ShowString(30,90,200,40,24,"");
	}		 
	EXTI_ClearITPendingBit(EXTI_Line4); //清空中断线上标志位
}
int main(void)//主函数内容
 {		
  
	delay_init();	    	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
	uart_init(115200);		
	KEY_Init();
    LCD_Init();
	LED_Init();		  			 	
	EXTIX_Init();	 
    LCD_Clear(WHITE);
	POINT_COLOR=RED;     //设置TFTLCD字体以及屏幕底色
	while(1)             //执行死循环进入中断
	{	    
		printf("OK\r\n");	
		delay_ms(1000);	  
	}	 
}

最后的效果

按下KEY0,KEY1,WK_UP各个按键后屏幕上显示不同的内容,可以根据不同需求更改中断服务程序内容。

作者水平有限希望各位读者批评指正。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!