1. 程式人生 > >STM32C8T6-APDS9960手勢識別

STM32C8T6-APDS9960手勢識別

一:材料準備

spi-oled一個,APDS9960一個,stm32f103c8t6一個

二:引腳說明

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(沒有識別到)

識別距離參考資料手冊

廢話不多說  直接上圖

提取碼:00yz