中断,是指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序中断。当处理机接受中断时,只需暂停一个或几个周期而不执行处理程序的中断,称为简单中断,中断又可分为屏蔽中断和非屏蔽中断两类。
对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,对于其它产品,则有19个能产生事件/中断请求的边沿检测器。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。
根据硬件原理图特实物,Tout0 ~ Tout4对应的GPIO口为PA4 ~ PA7。采用外部中断方式实现触摸按键检测。其中中断线分别为:
PA4 – EXIT4,PA4是使用外部中断线4;
PA5 ~ PA7 – EXTI5 ~ 9,PA5 ~ PA7是使用外部中断线5~9;具体介绍可查看STM32中文参考手册。
TTP224是一款使用电容式感应原理设计的触摸IC,其稳定的感应方式可以应用到各种不同电 子类产品,面板介质可以是完全绝源的材料,专为取代传统的机械结构开关或普通按键而设计.提供4个触摸输入端口及4个直接输出端口。
根据STM32中文参考手册外部中断章节介绍,边沿检测可选择上升沿、下降沿、双边沿(上升沿和下降沿)
按键检测这里采用双边沿触发,即可完成按键按下与松开的状态检测
外部中断使能:
摸按键模式配置代码
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin|OLED_SCK_Pin
|OLED_MOSI_Pin, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
/*Configure GPIO pins : PAPin PAPin PAPin PAPin */
GPIO_InitStruct.Pin = TO0_Pin|TO1_Pin|TO2_Pin|TO3_Pin;//触摸按键引脚
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;//双边沿触发
GPIO_InitStruct.Pull = GPIO_PULLDOWN;//上拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);//初始化
/*Configure GPIO pins : PBPin PBPin PBPin PBPin
PBPin */
GPIO_InitStruct.Pin = OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin|OLED_SCK_Pin
|OLED_MOSI_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = BEEP_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(BEEP_GPIO_Port, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);//外部中断4
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);//外部中断5~9
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
外部中断4中断服务函数示例代码,外部中断5~9服务函数代码与此相同。
void EXTI4_IRQHandler(void)
{
/* USER CODE BEGIN EXTI4_IRQn 0 */
Delay_Ms(10);//消抖
if(HAL_GPIO_ReadPin(TO0_GPIO_Port,TO0_Pin))//判断按键1是否按下
{
ttp224_stat|=1<<0;
}
else//判断按键是否松开
{
ttp224_stat&=~(1<<0);
}
/* USER CODE END EXTI4_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
/* USER CODE BEGIN EXTI4_IRQn 1 */
/* USER CODE END EXTI4_IRQn 1 */
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
MX_ADC1_Init();
/* USER CODE BEGIN 2 */
OLED_Init();
OLED_Displey_Imag(48,0,32,32,(u8 *)android);
Delay_Ms(1000);
OLED_Clear();
OLED_Display_folnt(32,0,16,0);
OLED_Display_folnt(32+16,0,16,1);
OLED_Display_folnt(32+16*2,0,16,2);
OLED_Display_folnt(32+16*3,0,16,3);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)//轮询
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
switch(ttp224_stat)
{
case 0:
OLED_Display_str(0,2,8,16," ");
break;
case 1:
OLED_Display_str(0,2,8,16," KEY1 ON ");
break;
case 2:
OLED_Display_str(0,2,8,16," KEY2 ON ");
break;
case 3:
OLED_Display_str(0,2,8,16," KEY1 2 ON ");
break;
case 4:
OLED_Display_str(0,2,8,16," KEY3 ON ");
break;
case 5:
OLED_Display_str(0,2,8,16," KEY1 3 ON ");
break;
case 6:
OLED_Display_str(0,2,8,16," KEY2 3 ON ");
break;
case 7:
OLED_Display_str(0,2,8,16," KEY1 2 3 ON ");
break;
case 8:
OLED_Display_str(0,2,8,16," KEY4 ON ");
break;
case 9:
OLED_Display_str(0,2,8,16," KEY1 4 ON ");
break;
case 10:
OLED_Display_str(0,2,8,16," KEY2 4 ON ");
break;
case 11:
OLED_Display_str(0,2,8,16," KEY1 2 4 ON ");
break;
case 12:
OLED_Display_str(0,2,8,16," KEY3 4 ON ");
break;
case 13:
OLED_Display_str(0,2,8,16," KEY1 3 4 ON ");
break;
case 14:
OLED_Display_str(0,2,8,16," KEY2 3 4 ON ");
break;
case 15:
OLED_Display_str(0,2,8,16," KEY1 2 3 4 ON");
break;
}
}
/* USER CODE END 3 */
}
示例效果:
参考例程:https://download.csdn.net/download/weixin_44453694/19362281