你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-U083RC评测】移植TouchGFX并实现无接触翻页

[复制链接]
lugl 发布时间:2024-4-4 15:48

【硬件】

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

image.png

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

image.png

image.png

image.png

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

image.png

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

image.png

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

image.png

生成MDK工程,并打开它。

10、添加sh1106、PAJ7620的驱动到工程Core的src/inc目录下。细节不详述,大家可以下载我的附件自行查看。

11、打开工程目录下面的touchgfx工程

image.png

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

image.png

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

image.png

回到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,添加头文件的引用。

image.png

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

image.png
收藏 评论3 发布时间:2024-4-4 15:48

举报

3个回答
lugl 回答时间:2024-4-4 15:56:34
附分享:链接:https://pan.baidu.com/s/1v19Ln7r33Olqkuw8i4q5tw?pwd=r8f9 提取码:r8f9
: C! X: {: z; C, X4 [$ m--来自百度网盘超级会员V6的分享
5 X. @1 T( ?- o1 ], x- v5 n8 k
( @( h- J: d! L' l% S# A: h* ~
; i3 m8 ?5 f% f5 g4 l0 U* M6 K) f; J, A5 F
STMWoodData 回答时间:2024-4-4 22:24:22

谢谢分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版