STM32C8T6-APDS9960手势识别

一:材料准备

spi-oled一个,APDS9960一个,stm32f103c8t6一个

二:引脚说明

STM32C8T6-APDS9960手势识别

VL引脚不接

sda,scl    不做过多解释

INT 识别结束标志位,本文使用PB0,配置如下:

extern int isr_flag ;   //标志位

//外部中断0服务程序
void EXTIX_Init(void)
{
 
 	  EXTI_InitTypeDef EXTI_InitStructure;
 	  NVIC_InitTypeDef NVIC_InitStructure;
	
	
	  EXTI_IO_Init();
	
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	//使能复用功能时钟

	  //GPIOE.2 中断线以及中断初始化配置   下降沿触发
  	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);

  	EXTI_InitStructure.EXTI_Line=EXTI_Line0;	
  	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
  	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  	EXTI_Init(&EXTI_InitStructure);	 	//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			//使能所在的外部中断通道
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	//抢占优先级2, 
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;					//子优先级2
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
  	NVIC_Init(&NVIC_InitStructure);
 
}

void EXTI_IO_Init()
{
  GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTA,PORTE时钟

	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOE0
	
	GPIO_SetBits(GPIOB,GPIO_Pin_0);	
	
}
 
//外部中断0服务程序 
void EXTI0_IRQHandler(void)
{
	delay_ms(10);//消抖
	if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
	{
		isr_flag = 1;
		EXTI_ClearITPendingBit(EXTI_Line0);  //清除LINE2上的中断标志位 
	}
		
}

9960的库从网上找的,

识别结果有两种模式,一种近距离,一种远距离,官方给的库是arduino的,读者可以测试一遍

UP,WODN,RIGHT ,LEFT

NEAR(近距离), FAR(远距离), NONE(没有识别到)

识别距离参考数据手册

废话不多说  直接上图

STM32C8T6-APDS9960手势识别

源码分享:https://pan.baidu.com/s/1_3hlUUGOxKRicIApgxDSfQ

提取码:00yz