【硬件】
1、NUCLE-U083RC开发板
2、sh1106OLED显示屏
3、PJA7620U2手势专感器。
【实现功能】
1、实现touchGFX显示
2、驱动PJA7620U2手势专感器
3、在第一屏上手势向左,翻到第二屏,在第二屏上手势向右,翻到第一屏。
【实现步骤】
1、使用stm32CubeMAX,新建一个基于stm32U083的工程。
2、启用配置rcc的外部时钟,配置系统时钟为48M。
3、开启CRC功能。
4、打开i2c,选择IO为PB8、PB9,速度为400K,传输为7bit

5、配置spi2,选择IO、参数、DMA如下图所示:



6、配置RST-->PB11,DC-->PB1,CS-->PB2,

7、打开TIM7,配置如下,使能他的中断,为touchGFX提供心跳包。

8、打开并配置x-coube-touchgfx如下图所示

生成MDK工程,并打开它。
10、添加sh1106、PAJ7620的驱动到工程Core的src/inc目录下。细节不详述,大家可以下载我的附件自行查看。
11、打开工程目录下面的touchgfx工程

12、创建两个屏,如果下图:

同时给两个屏蔽分别添换转函数:

回到MDK工程,在screen1.hpp与screen2.hpp创建 virtual void handleTickEvent();函数,并在.cpp中实现转换屏幕的功能:
void Screen1View::handleTickEvent()
{
if(Gesture_Data == PAJ_LEFT)
{
application().gotoscreenScreenSlideTransitionWest();
Gesture_Data = 0;
}
}
【添回touchgfx与ssd1306的接口】
1、打开TouchGFXHAL.cpp,添加头文件的引用。

2、添回刷屏功能函数:
void TouchGFXHAL::flushFrameBuffer(const touchgfx::Rect& rect)
{
// Calling parent implementation of flushFrameBuffer(const touchgfx::Rect& rect).
//
// To overwrite the generated implementation, omit call to parent function
// and implemented needed functionality here.
// Please note, HAL::flushFrameBuffer(const touchgfx::Rect& rect) must
// be called to notify the touchgfx framework that flush has been performed.
// To calculate he start adress of rect,
// use advanceFrameBufferToRect(uint8_t* fbPtr, const touchgfx::Rect& rect)
// defined in TouchGFXGeneratedHAL.cpp
TouchGFXGeneratedHAL::flushFrameBuffer(rect);
const unsigned char* bitmap = (const unsigned char*) getClientFrameBuffer();
SSD1306_Fill(0x00);
SSD1306_DrawBitmap(0, 0, bitmap, 128, 64, 0x01);
SSD1306_UpdateScreen();
}
3、添加可以给C调用的刷新接口:
extern "C"
void touchgfxSignalVSync(void)
{
/* VSync has occurred, increment TouchGFX engine vsync counter */
touchgfx::HAL::getInstance()->vSync();
/* VSync has occurred, signal TouchGFX engine */
touchgfx::OSWrappers::signalVSync();
}
4、在man.c中添回Tim7的回调函数:
/* USER CODE BEGIN 4 */
extern void touchgfxSignalVSync(void);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM7)
{
touchgfxSignalVSync();
}
}
/* USER CODE END 4 */
5、在main.c中添加oled、PAJ7620的实始化,并在while中调用获取手势的函数。同时创建一个全局函数,把手势转换传递给屏的函数中。
MX_TouchGFX_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim7);
SSD1306_Init();
HAL_UART_Transmit(&huart2,"hello world\n",sizeof("hello world\n"),100);
uint16_t ID = PAJ7620U2_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
Gesture_Data = PAJ7620U2_Gesture_ReadData();
// если движение было то
if( Gesture_Data != PAJ_NONE )
{
switch (Gesture_Data)
{
case PAJ_UP:
HAL_UART_Transmit(&huart2,"Up -> Data\n",sizeof("Up -> Data\n"),100);
break;
case PAJ_DOWN:
HAL_UART_Transmit(&huart2,"Down -> Data\n",sizeof("Down -> Data\n"),100);
break; // вниз
case PAJ_LEFT:
HAL_UART_Transmit(&huart2,"Left -> Data\n",sizeof("Left -> Data\n"),100);
break; // влево
case PAJ_RIGHT:
HAL_UART_Transmit(&huart2,"Right -> Data\n",sizeof("Right -> Data\n"),100);
break; // вправо
case PAJ_FORWARD:
HAL_UART_Transmit(&huart2,"Forward -> Data\n",sizeof("Forward -> Data\n"),100);
break; // вперед
case PAJ_BACKWARD:
HAL_UART_Transmit(&huart2,"Backward -> Data\n",sizeof("Backward -> Data\n"),100);
break; // назад
case PAJ_CLOCKWISE:
HAL_UART_Transmit(&huart2,"Clockwise -> Data\n",sizeof("Clockwise -> Data\n"),100);
break; // по часовой стрелке
case PAJ_ANTI_CLOCKWISE:
HAL_UART_Transmit(&huart2,"AntiClockwise -> Data\n",sizeof("AntiClockwise -> Data\n"),100);
break; // против часовой стрелки
case PAJ_WAVE:
HAL_UART_Transmit(&huart2,"Wave -> Data\n",sizeof("Wave -> Data\n"),100);
break; // волна
default: break;
}
}
//Gesture_Data = 0;
// запрашиваем размер и освященность обьекта перед датчиком
OBJ_BRIGHTNESS = PAJ7620U2_PS_ReadObjBrightness(); // Object Brightness (Max. 255)
OBJ_SIZE = PAJ7620U2_PS_ReadObjSize(); // Object Size (Max. 900)
HAL_Delay(50);
/* USER CODE END WHILE */
MX_TouchGFX_Process();
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
下载到开发板,就可以成功的实现了手势传感器来无接触的转换屏幕了。详细见视频讲解。
【stm32U083无接触翻页(1)】 https://www.bilibili.com/video/BV1rr421477R/?share_source=copy_web&vd_source=46ffd4c7b1be3ec2b63adcc32d97b26b
--来自百度网盘超级会员V6的分享
! e: j. F6 h. K, C
【stm32U083无接触翻页(1)】 https://www.bilibili.com/video/BV1rr421477R/?share_source=copy_web&vd_source=46ffd4c7b1be3ec2b63adcc32d97b26b
谢谢分享