usbd_dcd_if.c
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : usbd_cdc_if.c
* @version : v1.0_Cube
* @brief : Usb device for Virtual Com Port.
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
* SLA0044, the "License"; You may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* www.st.com/SLA0044
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "usbd_cdc_if.h"
/* USER CODE BEGIN INCLUDE */
/* USER CODE END INCLUDE */
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
/* USER CODE END PV */
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
* @brief Usb device library.
* @{
*/
/** @addtogroup USBD_CDC_IF
* @{
*/
/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
* @brief Private types.
* @{
*/
/* USER CODE BEGIN PRIVATE_TYPES */
/* USER CODE END PRIVATE_TYPES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
* @brief Private defines.
* @{
*/
/* USER CODE BEGIN PRIVATE_DEFINES */
/* Define size for the receive and transmit buffer over CDC */
/* It's up to user to redefine and/or remove those define */
#define APP_RX_DATA_SIZE 2048
#define APP_TX_DATA_SIZE 2048
/* USER CODE END PRIVATE_DEFINES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
* @brief Private macros.
* @{
*/
/* USER CODE BEGIN PRIVATE_MACRO */
/* USER CODE END PRIVATE_MACRO */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
* @brief Private variables.
* @{
*/
/* Create buffer for reception and transmission */
/* It's up to user to redefine and/or remove those define */
/** Received data over USB are stored in this buffer */
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
/** Data to send over USB CDC are stored in this buffer */
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
/* USER CODE BEGIN PRIVATE_VARIABLES */
uint32_t USB_Txbuf=0;
uint32_t USB_Rxbuf=0;
/* USER CODE END PRIVATE_VARIABLES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
* @brief Public variables.
* @{
*/
extern USBD_HandleTypeDef hUsbDeviceFS;
/* USER CODE BEGIN EXPORTED_VARIABLES */
/* USER CODE END EXPORTED_VARIABLES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
* @brief Private functions declaration.
* @{
*/
static int8_t CDC_Init_FS(void);
static int8_t CDC_DeInit_FS(void);
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);
/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
/**
* @}
*/
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
CDC_Init_FS,
CDC_DeInit_FS,
CDC_Control_FS,
CDC_Receive_FS
};
/* Private functions ---------------------------------------------------------*/
/**
* @brief Initializes the CDC media low layer over the FS USB IP
* @retval USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_Init_FS(void)
{
/* USER CODE BEGIN 3 */
/* Set Application Buffers */
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
return (USBD_OK);
/* USER CODE END 3 */
}
/**
* @brief DeInitializes the CDC media low layer
* @retval USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_DeInit_FS(void)
{
/* USER CODE BEGIN 4 */
return (USBD_OK);
/* USER CODE END 4 */
}
/**
* @brief Manage the CDC class requests
* @param cmd: Command code
* @param pbuf: Buffer containing command data (request parameters)
* @param length: Number of data to be sent (in bytes)
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
/* USER CODE BEGIN 5 */
switch(cmd)
{
case CDC_SEND_ENCAPSULATED_COMMAND:
break;
case CDC_GET_ENCAPSULATED_RESPONSE:
break;
case CDC_SET_COMM_FEATURE:
break;
case CDC_GET_COMM_FEATURE:
break;
case CDC_CLEAR_COMM_FEATURE:
break;
/*******************************************************************************/
/* Line Coding Structure */
/*-----------------------------------------------------------------------------*/
/* Offset | Field | Size | Value | Description */
/* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/
/* 4 | bCharFormat | 1 | Number | Stop bits */
/* 0 - 1 Stop bit */
/* 1 - 1.5 Stop bits */
/* 2 - 2 Stop bits */
/* 5 | bParityType | 1 | Number | Parity */
/* 0 - None */
/* 1 - Odd */
/* 2 - Even */
/* 3 - Mark */
/* 4 - Space */
/* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */
/*******************************************************************************/
case CDC_SET_LINE_CODING:
break;
case CDC_GET_LINE_CODING:
break;
case CDC_SET_CONTROL_LINE_STATE:
break;
case CDC_SEND_BREAK:
break;
default:
break;
}
return (USBD_OK);
/* USER CODE END 5 */
}
/**
* @brief Data received over USB OUT endpoint are sent over CDC interface
* through this function.
*
* @note
* This function will block any OUT packet reception on USB endpoint
* untill exiting this function. If you exit this function before transfer
* is complete on CDC interface (ie. using DMA controller) it will result
* in receiving more data while previous ones are still not sent.
*
* @param Buf: Buffer of data to be received
* @param Len: Number of data received (in bytes)
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
//USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
//USBD_CDC_ReceivePacket(&hUsbDeviceFS);
if(USB_Rxbuf+*Len<=APP_TX_DATA_SIZE)
{
memcpy((uint8_t*)(UserTxBufferFS+USB_Rxbuf),Buf,*Len);
USB_Rxbuf+=*Len;
}
else
{
memcpy((uint8_t*)(UserTxBufferFS),Buf,*Len);
USB_Rxbuf+=*Len;
USB_Txbuf=0;
}
return (USBD_OK);
/* USER CODE END 6 */
}
/**
* @brief CDC_Transmit_FS
* Data to send over USB IN endpoint are sent over CDC interface
* through this function.
* @note
*
*
* @param Buf: Buffer of data to be sent
* @param Len: Number of data to be sent (in bytes)
* @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
*/
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
uint8_t result = USBD_OK;
/* USER CODE BEGIN 7 */
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
if (hcdc->TxState != 0){
return USBD_BUSY;
}
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
/* USER CODE END 7 */
return result;
}
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
/**
* 函数功能: USB虚拟串口回显测试
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
void USB_CDC_TX_RX(void)
{
uint32_t buff_size;
if(USB_Txbuf!=USB_Rxbuf)
{
if(USB_Txbuf>USB_Rxbuf)
{
buff_size=USB_Rxbuf;
}
else
{
buff_size=USB_Rxbuf-USB_Txbuf;
}
while(CDC_Transmit_FS((uint8_t *)(UserTxBufferFS+USB_Txbuf),buff_size)==USBD_OK);
USB_Rxbuf+=buff_size;
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
}
}
usbd_conf.c
void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle)
{
if(pcdHandle->Instance==USB_OTG_FS)
{
/* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 *//* USER CODE END USB_OTG_FS_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USB_OTG_FS_CLK_DISABLE();
/**USB_OTG_FS GPIO Configuration
PA11 ------> USB_OTG_FS_DM
PA12 ------> USB_OTG_FS_DP
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);/* Peripheral interrupt Deinit*/
HAL_NVIC_DisableIRQ(OTG_FS_IRQn);/* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */
/* USER CODE END USB_OTG_FS_MspDeInit 1 */
}
}
usb_device.c
void MX_USB_DEVICE_Init(void)
{
/* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */
/* USER CODE END USB_DEVICE_Init_PreTreatment */
/* Init Device Library, add supported class and start the library. */
USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);
USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);
USBD_Start(&hUsbDeviceFS);
/* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */
/* USER CODE END USB_DEVICE_Init_PostTreatment */
}
boot main.c
#include "bsp.h" /* 底层硬件驱动 */
/* 定义例程名和例程发布日期 */
#define EXAMPLE_NAME "V7-LCD的汉字显示和2D图形显示(小字库)"
#define EXAMPLE_DATE "2020-08-09"
#define DEMO_VER "1.0"
static void PrintfLogo(void);
static void JumpToApp(void);
/* 设置未初始化变量 */
#if defined (__ICCARM__) /* IAR */
#pragma location = ".NoInit"
uint32_t g_JumpInit;
#elif defined(__CC_ARM) /* MDK AC5 */
uint32_t g_JumpInit __attribute__((at(0x20000000), zero_init));
#elif (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) /* MDK AC6 */
uint32_t g_JumpInit __attribute__( ( section( ".bss.NoInit")));
#elif defined(__GNUC__) /* GCC */
__attribute__((section( ".NoInit"))) uint32_t g_JumpInit;
#endif
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参: 无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{
uint8_t ucKeyCode;
FONT_T tFont12; /* 定义一个字体结构体变量,用于设置字体参数 */
FONT_T tFont16; /* 定义一个字体结构体变量,用于设置字体参数 */
uint8_t buf[100], count = 0;
//变量操作//
if (g_JumpInit == 0xAA553344) /* 软件复位后再进入APP,提供一个干净的CPU环境给APP */
{
JumpToApp(); /* 去执行APP程序 */
}
else if (g_JumpInit == 0x5AA51234)
{
/* 用户可以自己加处理,比如APP请求升级固件, 直接进入固件升级状态 */
}
else
{
/* 用户可以自己加处理 */
}
//
/* 设置字体参数 */
{
tFont12.FontCode = FC_ST_12; /* 字体代码 12点阵 */
tFont12.FrontColor = CL_WHITE; /* 字体颜色 */
tFont12.BackColor = CL_BLUE; /* 文字背景颜色 */
tFont12.Space = 0; /* 文字间距,单位 = 像素 */
}
/* 设置字体参数 */
{
tFont16.FontCode = FC_ST_16; /* 字体代码 16点阵 */
tFont16.FrontColor = CL_WHITE; /* 字体颜色 */
tFont16.BackColor = CL_BLUE; /* 文字背景颜色 */
tFont16.Space = 0; /* 文字间距,单位 = 像素 */
}
bsp_Init(); /* 硬件初始化 */
PrintfLogo(); /* 打印例程名称和版本等信息 */
/* 延迟200ms再点亮背光,避免瞬间高亮 */
bsp_DelayMS(200);
/* 清屏 */
LCD_ClrScr(CL_BLUE);
/* 显示汉字 */
LCD_DispStr(5, 3, "故人西辞黄鹤楼,烟花三月下扬州。", &tFont12);
LCD_DispStr(5, 18, "孤帆远影碧空尽,唯见长江天际流。", &tFont12);
LCD_DispStr(5, 38, "故人西辞黄鹤楼,烟花三月下扬州。", &tFont16);
LCD_DispStr(5, 58, "孤帆远影碧空尽,唯见长江天际流。", &tFont16);
/* 绘制2D图形 */
LCD_DrawLine(5, 120, 100, 220, CL_RED);
LCD_DrawRect(120, 120, 100, 100, CL_RED);
LCD_DrawCircle(280, 170, 50, CL_RED);
LCD_Fill_Rect (340, 120, 100, 100, CL_BUTTON_GREY);
/* 界面整体显示完毕后,再打开背光,设置为缺省亮度 */
bsp_DelayMS(100);
LCD_SetBackLight(BRIGHT_DEFAULT);
bsp_StartAutoTimer(0, 200); /* 启动1个200ms的自动重装的定时器,软件定时器0 */
while (1)
{
/* 判断软件定时器0是否超时 */
if(bsp_CheckTimer(0))
{
/* 每隔200ms 进来一次 */
bsp_LedToggle(4);
sprintf((char *)buf, "count = %03d", count++);
LCD_DispStr(5, 90, (char *)buf, &tFont16);
}
ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
if (ucKeyCode != KEY_NONE)
{
/* 有键按下 */
switch (ucKeyCode)
{
case KEY_DOWN_K1: /* K1按键按下 */
g_JumpInit = 0xAA553344;
NVIC_SystemReset(); /* 复位CPU */
break;
default:
break;
}
}
}
}
/*
*********************************************************************************************************
* 函 数 名: JumpToApp
* 功能说明: 跳转到APP
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void JumpToApp(void)
{
#if 1
void (*SysMemBootJump)(void); /* 声明一个函数指针 */
__IO uint32_t BootAddr = 0x08100000; /* STM32H7的系统BootLoader地址 */
g_JumpInit = 0xAA553344;
/* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));
/* 设置主堆栈指针 */
__set_MSP(*(uint32_t *)BootAddr);
/* 跳转到系统BootLoader */
SysMemBootJump();
/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
while (1)
{
}
#else
uint32_t i=0;
void (*SysMemBootJump)(void); /* 声明一个函数指针 */
__IO uint32_t BootAddr = 0x08100000; /* STM32H7的系统BootLoader地址 */
/* 关闭全局中断 */
DISABLE_INT();
/* 关闭滴答定时器,复位到默认值 */
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/* 设置所有时钟到默认状态,使用HSI时钟 */
HAL_RCC_DeInit();
/* 关闭所有中断,清除所有中断挂起标志 */
for (i = 0; i < 8; i++)
{
NVIC->ICER[i]=0xFFFFFFFF;
NVIC->ICPR[i]=0xFFFFFFFF;
}
/* 使能全局中断 */
ENABLE_INT();
/* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));
/* 设置主堆栈指针 */
__set_MSP(*(uint32_t *)BootAddr);
/* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
__set_CONTROL(0);
/* 跳转到系统BootLoader */
SysMemBootJump();
/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
while (1)
{
}
#endif
}
app main.c
#include "bsp.h" /* 底层硬件驱动 */
/* 定义例程名和例程发布日期 */
#define EXAMPLE_NAME "V7-LCD的电阻触摸和电容触摸(电阻触摸支持2点和4点校准)"
#define EXAMPLE_DATE "2020-08-09"
#define DEMO_VER "1.0"
static void PrintfHelp(void);
static void PrintfLogo(void);
static void DispFirstPage(void);
/* 设置未初始化变量 */
#if defined (__ICCARM__) /* IAR */
#pragma location = ".NoInit"
uint32_t g_JumpInit;
#elif defined(__CC_ARM) /* MDK AC5 */
uint32_t g_JumpInit __attribute__((at(0x20000000), zero_init));
#elif (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) /* MDK AC6 */
uint32_t g_JumpInit __attribute__( ( section( ".bss.NoInit")));
#elif defined(__GNUC__) /* GCC */
__attribute__((section( ".NoInit"))) uint32_t g_JumpInit;
#endif
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参: 无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{
uint16_t ucBright; /* 背光亮度(0-255) */
uint8_t ucKeyCode; /* 按键代码 */
uint8_t fRefresh; /* 刷屏请求标志,1表示需要刷新 */
FONT_T tFont; /* 定义一个字体结构体变量,用于设置字体参数 */
char buf[64];
uint16_t usAdcX, usAdcY;
int16_t tpX, tpY;
uint8_t ucTouch; /* 触摸事件 */
/* 设置字体参数 */
{
tFont.FontCode = FC_ST_16; /* 字体代码 16点阵 */
tFont.FrontColor = CL_WHITE; /* 字体颜色 */
tFont.BackColor = CL_BLUE; /* 文字背景颜色 */
tFont.Space = 0; /* 文字间距,单位 = 像素 */
}
bsp_Init(); /* 硬件初始化 */
PrintfLogo(); /* 打印例程名称和版本等信息 */
PrintfHelp(); /* 打印操作提示 */
/* 延迟200ms再点亮背光,避免瞬间高亮 */
bsp_DelayMS(200);
DispFirstPage(); /* 显示第1页 */
/* 界面整体显示完毕后,再打开背光,设置为缺省亮度 */
bsp_DelayMS(100);
ucBright = BRIGHT_DEFAULT;
LCD_SetBackLight(ucBright);
bsp_StartAutoTimer(0, 200); /* 启动1个200ms的自动重装的定时器,软件定时器0 */
/* 进入主程序循环体 */
fRefresh = 1;
while (1)
{
bsp_Idle();
/* 判断软件定时器0是否超时 */
if(bsp_CheckTimer(0))
{
/* 每隔200ms 进来一次 */
bsp_LedToggle(2);
}
if (fRefresh)
{
fRefresh = 0;
/* 实时刷新触摸ADC采样值和转换后的坐标 */
{
/* 读取并显示当前X轴和Y轴的ADC采样值 */
usAdcX = TOUCH_ReadAdcX();
usAdcY = TOUCH_ReadAdcY();
sprintf(buf, "触摸ADC值 X = %4d, Y = %4d ", usAdcX, usAdcY);
LCD_DispStr(5, 40, buf, &tFont);
/* 读取并显示当前触摸坐标 */
tpX = TOUCH_GetX();
tpY = TOUCH_GetY();
sprintf(buf, "触摸坐标 X = %4d, Y = %4d ", tpX, tpY);
LCD_DispStr(5, 60, buf, &tFont);
/* 在触笔所在位置显示一个小圈 */
if ((tpX > 0) && (tpY > 0))
{
LCD_DrawCircle(tpX, tpY, 2, CL_YELLOW);
}
}
/* 在屏幕边沿绘制2个矩形框(用于检测面板边缘像素是否正常) */
LCD_DrawRect(0, 0, LCD_GetHeight(), LCD_GetWidth(), CL_WHITE);
LCD_DrawRect(2, 2, LCD_GetHeight() - 4, LCD_GetWidth() - 4, CL_YELLOW);
/* 显示背光值 */
sprintf(buf, "当前背光亮度: %3d", ucBright);
LCD_DispStr(5, 80, buf, &tFont);
}
ucTouch = TOUCH_GetKey(&tpX, &tpY); /* 读取触摸事件 */
if (ucTouch != TOUCH_NONE)
{
switch (ucTouch)
{
case TOUCH_DOWN: /* 触笔按下事件 */
/* 在触笔所在位置显示一个小圈 */
if ((tpX > 0) && (tpY > 0))
{
LCD_DrawCircle(tpX, tpY, 3, CL_RED);
}
break;
case TOUCH_MOVE: /* 触笔移动事件 */
/* 实时刷新触摸ADC采样值和转换后的坐标 */
{
/* 读取并显示当前X轴和Y轴的ADC采样值 */
usAdcX = TOUCH_ReadAdcX();
usAdcY = TOUCH_ReadAdcY();
sprintf(buf, "触摸ADC值 X = %4d, Y = %4d ", usAdcX, usAdcY);
LCD_DispStr(5, 40, buf, &tFont);
/* 读取并显示当前触摸坐标 */
//tpX = TOUCH_GetX();
//tpY = TOUCH_GetY();
sprintf(buf, "触摸坐标 X = %4d, Y = %4d ", tpX, tpY);
LCD_DispStr(5, 60, buf, &tFont);
/* 在触笔所在位置显示一个小圈 */
if ((tpX > 0) && (tpY > 0))
{
LCD_DrawCircle(tpX, tpY, 2, CL_YELLOW);
}
}
break;
case TOUCH_RELEASE: /* 触笔释放事件 */
/* 在触笔所在位置显示一个小圈 */
if ((tpX > 0) && (tpY > 0))
{
LCD_DrawCircle(tpX, tpY, 4, CL_WHITE);
}
break;
}
}
ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
if (ucKeyCode != KEY_NONE)
{
/* 有键按下 */
switch (ucKeyCode)
{
case KEY_DOWN_K2: /* K1按键按下 */
g_JumpInit = 0x11112222;
NVIC_SystemReset(); /* 复位CPU */
break;
case JOY_DOWN_L: /* 摇杆LEFT键按下, 2点触摸校准 */
TOUCH_Calibration(2);
DispFirstPage();
fRefresh = 1; /* 请求刷新LCD */
break;
case JOY_DOWN_OK: /* 摇杆OK键,清屏 */
DispFirstPage();
fRefresh = 1; /* 请求刷新LCD */
break;
case JOY_DOWN_U: /* 摇杆UP键按下 */
ucBright += BRIGHT_STEP;
if (ucBright > BRIGHT_MAX)
{
ucBright = BRIGHT_MAX;
}
LCD_SetBackLight(ucBright);
fRefresh = 1; /* 请求刷新LCD */
break;
case JOY_DOWN_D: /* 摇杆DOWN键按下 */
if (ucBright < BRIGHT_STEP)
{
ucBright = 0;
}
else
{
ucBright -= BRIGHT_STEP;
}
LCD_SetBackLight(ucBright);
fRefresh = 1; /* 请求刷新LCD */
break;
default:
break;
}
}
}
}
/*
*********************************************************************************************************
* 函 数 名: DispFirstPage
* 功能说明: 显示操作提示
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void DispFirstPage(void)
{
FONT_T tFont; /* 定义一个字体结构体变量,用于设置字体参数 */
uint16_t y; /* Y坐标 */
uint16_t usLineCap; /* 行高 */
char buf[50];
LCD_ClrScr(CL_BLUE); /* 清屏,背景蓝色 */
/* 设置字体属性 */
tFont.FontCode = FC_ST_16; /* 字体选择宋体16点阵,高16x宽15) */
tFont.FrontColor = CL_WHITE; /* 字体颜色设置为白色 */
tFont.BackColor = CL_MASK; /* 文字背景颜色,透明 */
tFont.Space = 0; /* 字符水平间距, 单位 = 像素 */
y = 4;
usLineCap = 18; /* 行间距 */
LCD_DispStr(5, y, "安富莱STM32-V7开发板 www.armfly.com", &tFont);
y += usLineCap;
LCD_DispStr(5, y, "电阻屏和电容屏实验,电容屏无需校准,电阻需要校准", &tFont);
y += 5 * usLineCap;
LCD_DispStr(30, y, "操作提示:", &tFont);
y += usLineCap;
LCD_DispStr(50, y, "摇杆上键 = 增加背光亮度", &tFont);
y += usLineCap;
LCD_DispStr(50, y, "摇杆下键 = 降低背光亮度", &tFont);
y += usLineCap;
LCD_DispStr(50, y, "摇杆左键 = 电阻屏触摸校准", &tFont);
y += usLineCap;
LCD_DispStr(50, y, "摇杆OK键 = 清屏", &tFont);
y += 2 * usLineCap;
/* 显示TFT控制器型号和屏幕分辨率 */
//LCD_GetChipDescribe(buf); /* 读取TFT驱动芯片型号 */
if (g_TouchType == CT_GT811)
{
strcpy(buf, "STM32H743 + GT811");
}
else if (g_TouchType == CT_GT911)
{
strcpy(buf, "STM32H743 + GT911");
}
else if (g_TouchType == CT_FT5X06)
{
strcpy(buf, "STM32H743 + FT5X06");
}
else if (g_TouchType == CT_STMPE811)
{
strcpy(buf, "STM32H743 + STMPE811");
}
else
{
strcpy(buf, "STM32H743 + NoTouch");
}
sprintf(&buf[strlen(buf)], " %d x %d", LCD_GetWidth(), LCD_GetHeight());
LCD_DispStr(5, y, (char *)buf, &tFont);
}
/*
*********************************************************************************************************
* 函 数 名: PrintfHelp
* 功能说明: 打印操作提示
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void PrintfHelp(void)
{
printf("操作提示:\r\n");
printf("1. 摇杆上键,增加LCD背景光亮度\r\n");
printf("2. 摇杆下键,降低LCD背景光亮度\r\n");
printf("3. 摇杆左键,电阻触摸屏校准\r\n");
printf("4. 摇杆OK键,清屏\r\n");
}