📄 tschal.c
字号:
/**
******************************************************************************
* @file TscHal.c
* @author MCD Application Team
* @version V2.0.0
* @date 11-July-2011
* @brief This file contains all the TouchScreen functions whose
* implementation depends on the TSC Controller used in your Design.
* You only need to change these functions implementations
* in order to reuse this code with other TSC Controller
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/* Includes ---------------------------------------------------------------------------*/
#include "TscHal.h"
#include "touchscreen.h"
#ifdef USE_STM3210C_EVAL
#include "stm3210c_eval_ioe.h"
#elif USE_STM32100E_EVAL
#include "stm32100e_eval_ioe.h"
#elif USE_STM322xG_EVAL
#include "stm322xg_eval_ioe.h"
#endif
/** @addtogroup Embedded_GUI_Library
* @{
*/
/** @defgroup TscHal
* @brief TscHal main functions
* @{
*/
/* External variables --------------------------------------------------------*/
extern __IO uint32_t u32_TSXCoordinate;
extern __IO uint32_t u32_TSYCoordinate;
extern uint32_t TSC_Value_X;
extern uint32_t TSC_Value_Y;
extern uint32_t EndAddr;
extern uint32_t CalibrationAddr;
extern __IO uint8_t calibration_done;
extern __IO uint8_t touch_done;
/* Touchscreen Hardware Parameters Structure */
TSC_HW_Parameters_TypeDef pTscHwParam;
/* Private typedef -----------------------------------------------------------*/
/* Private defines -----------------------------------------------------------*/
#define _1_K ((uint8_t)1024)
#ifdef STM32F2XX
#define TOUCH_DELAY 0x10
#else
#define TOUCH_DELAY 0x8
#endif
/* Private macros ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
#ifdef STM32F2XX
/**
* @brief FLASH page&size definition for STM32F2xx devices
*/
const uint32_t FLASH_Sectors[2][12] =
{
{
FLASH_Sector_0,
FLASH_Sector_1,
FLASH_Sector_2,
FLASH_Sector_3,
FLASH_Sector_4,
FLASH_Sector_5,
FLASH_Sector_6,
FLASH_Sector_7,
FLASH_Sector_8,
FLASH_Sector_9,
FLASH_Sector_10,
FLASH_Sector_11,
},
{
16*_1_K,
16*_1_K,
16*_1_K,
16*_1_K,
64*_1_K,
128*_1_K,
128*_1_K,
128*_1_K,
128*_1_K,
128*_1_K,
128*_1_K,
128*_1_K,
}
};
#endif
/* Private function prototypes -----------------------------------------------*/
extern void GL_Delay(uint32_t nTime);
/* static function generate warnings if they are not used */
#if defined(USE_STM3210C_EVAL) || defined(USE_STM32100E_EVAL)
static void TSC_GPIO_Configuration(void);
#endif
/* Private functions ---------------------------------------------------------*/
/**
* @brief Create and initialize a new Touchscreen Hw Parameter structure object
* @param None
* @retval TSC_HW_Parameters_TypeDef*, The created Object pointer
*/
TSC_HW_Parameters_TypeDef* NewTscHwParamObj (void)
{
return &pTscHwParam;
}
/**
* @brief Initializes the GPIOx peripheral according to the specified
* parameters in the GPIO_InitStruct.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that
* contains the configuration information for the specified GPIO
* peripheral.
* @retval None
*/
void GL_GPIO_Init(GPIO_TypeDef * GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
GPIO_InitTypeDef tmp;
tmp.GPIO_Pin = GPIO_InitStruct->GPIO_Pin;
tmp.GPIO_Speed = GPIO_InitStruct->GPIO_Speed;
tmp.GPIO_Mode = GPIO_InitStruct->GPIO_Mode;
#ifdef STM32F2XX
tmp.GPIO_OType = GPIO_InitStruct->GPIO_OType;
tmp.GPIO_PuPd = GPIO_InitStruct->GPIO_PuPd;
#endif
GPIO_Init( (GPIO_TypeDef*)GPIOx, &tmp);
}
/**
* @brief Initializes the SPIx peripheral according to the specified
* parameters in the SPI_InitStruct.
* @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.
* @param SPI_InitStruct: pointer to a SPI_InitTypeDef structure that
* contains the configuration information for the specified
* SPI peripheral.
* @retval None
*/
void GL_SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct)
{
SPI_InitTypeDef tmp;
tmp.SPI_Direction = SPI_InitStruct->SPI_Direction;
tmp.SPI_Mode = SPI_InitStruct->SPI_Mode;
tmp.SPI_DataSize = SPI_InitStruct->SPI_DataSize;
tmp.SPI_CPOL = SPI_InitStruct->SPI_CPOL;
tmp.SPI_CPHA = SPI_InitStruct->SPI_CPHA;
tmp.SPI_NSS = SPI_InitStruct->SPI_NSS;
tmp.SPI_BaudRatePrescaler = SPI_InitStruct->SPI_BaudRatePrescaler;
tmp.SPI_FirstBit = SPI_InitStruct->SPI_FirstBit;
tmp.SPI_CRCPolynomial = SPI_InitStruct->SPI_CRCPolynomial;
SPI_Init(SPIx, &tmp);
}
/**
* @brief Sets the vector table location and Offset.
* @param NVIC_VectTab: specifies if the vector table is in RAM or
* FLASH memory. This parameter can be one of the following values:
* @arg NVIC_VectTab_RAM
* @arg NVIC_VectTab_FLASH
* @param Offset: Vector Table base offset field.
* This value must be a multiple of 0x100.
* @retval None
*/
void GL_NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
{
NVIC_SetVectorTable(NVIC_VectTab, Offset);
}
/**
* @brief Initializes the NVIC peripheral according to the specified
* parameters in the NVIC_InitStruct.
* @param NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure
* that contains the configuration information for the
* specified NVIC peripheral.
* @retval None
*/
void GL_NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
{
NVIC_InitTypeDef tmp;
tmp.NVIC_IRQChannel = NVIC_InitStruct->NVIC_IRQChannel;
tmp.NVIC_IRQChannelPreemptionPriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority;
tmp.NVIC_IRQChannelSubPriority = NVIC_InitStruct->NVIC_IRQChannelSubPriority;
tmp.NVIC_IRQChannelCmd = (FunctionalState)NVIC_InitStruct->NVIC_IRQChannelCmd;
NVIC_Init(&tmp);
}
/**
* @brief Configures the priority grouping: pre-emption priority
* and subpriority.
* @param NVIC_PriorityGroup: specifies the priority grouping bits
* length. This parameter can be one of the following values:
* @arg - NVIC_PriorityGroup_0: 0 bits for pre-emption priority
* 4 bits for subpriority
* @arg - NVIC_PriorityGroup_1: 1 bits for pre-emption priority
* 3 bits for subpriority
* @arg - NVIC_PriorityGroup_2: 2 bits for pre-emption priority
* 2 bits for subpriority
* @arg - NVIC_PriorityGroup_3: 3 bits for pre-emption priority
* 1 bits for subpriority
* @arg - NVIC_PriorityGroup_4: 4 bits for pre-emption priority
* 0 bits for subpriority
* @retval None
*/
void GL_NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup);
}
/**
* @brief Configures the specified System Handlers priority.
* @param SystemHandler: specifies the system handler to be
* enabled or disabled.
* This parameter can be one of the following values:
* @arg - SystemHandler_MemoryManage
* @arg - SystemHandler_BusFault
* @arg - SystemHandler_UsageFault
* @arg - SystemHandler_SVCall
* @arg - SystemHandler_DebugMonitor
* @arg - SystemHandler_PSV
* @arg - SystemHandler_SysTick
* @param SystemHandlerPreemptionPriority: new priority group of the
* specified system handlers.
* @param SystemHandlerSubPriority: new sub priority of the specified
* system handlers.
* @retval None
*/
void GL_NVIC_SystemHandlerPriorityConfig(uint32_t SystemHandler, uint8_t SystemHandlerPreemptionPriority, uint8_t SystemHandlerSubPriority)
{
/* NVIC_SystemHandlerPriorityConfig(SystemHandler, SystemHandlerPreemptionPriority, SystemHandlerSubPriority); */
}
/**
* @brief Initializes the EXTI peripheral according to the specified
* parameters in the EXTI_InitStruct.
* @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure
* that contains the configuration information for the EXTI
* peripheral.
* @retval None
*/
void GL_EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
{
EXTI_InitTypeDef tmp;
tmp.EXTI_Line = EXTI_InitStruct->EXTI_Line;
tmp.EXTI_Mode = EXTI_InitStruct->EXTI_Mode;
tmp.EXTI_Trigger = EXTI_InitStruct->EXTI_Trigger;
tmp.EXTI_LineCmd = (FunctionalState)EXTI_InitStruct->EXTI_LineCmd;
EXTI_Init(&tmp);
}
/**
* @brief Selects the GPIO pin used as EXTI Line.
* @param GPIO_PortSource: selects the GPIO port to be used as source for
* EXTI lines.
* This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).
* @param GPIO_PinSource: specifies the EXTI line to be configured.
* This parameter can be GPIO_PinSourcex where x can be (0..15).
* @retval None
*/
void GL_GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
{
#if defined(STM32F2XX) || defined(STM32L1XX_MD)
SYSCFG_EXTILineConfig(GPIO_PortSource, GPIO_PinSource);
#else
GPIO_EXTILineConfig(GPIO_PortSource, GPIO_PinSource);
#endif
}
/**
* @brief Deinitializes the EXTI peripheral registers to their default
* reset values.
* @param None
* @retval None
*/
void GL_EXTI_DeInit(void)
{
EXTI_DeInit();
}
/**
* @brief Deinitializes the NVIC peripheral registers to their default
* reset values.
* @param None
* @retval None
*/
void GL_NVIC_DeInit(void)
{
/* NVIC_DeInit(); */
}
/**
* @brief This function handles External lines interrupt request for Touchscreen.
* @param None
* @retval None
*/
void GL_EXTI_TSC_IRQHandler( void )
{
#if TOUCH_SCREEN_CAPABILITY
if ( EXTI_GetITStatus(pTscHwParam.TSC_Exti_Line) != RESET )
{
if (IOE_GetGITStatus(pTscHwParam.TSC_DeviceRegister, IOE_TS_IT) & IOE_TS_IT)
{
TSC_Read();
/* Clear the interrupt pending bits */
IOE_ClearGITPending(pTscHwParam.TSC_DeviceRegister, IOE_TS_IT);
}
EXTI_ClearITPendingBit(pTscHwParam.TSC_Exti_Line);
}
#endif
}
#if TOUCH_SCREEN_CAPABILITY
/**
* @brief Configure GPIO
* @param None
* @retval None
*/
static void TSC_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
#ifndef STM32F2XX
/* Enable TSC_I2C_Channel and IOExpander I2C_PORT & AFEN(Alternate Function) clocks */
GL_RCC_APBPeriphClockCmd(pTscHwParam.TSC_I2C_Clk, GL_ENABLE, 1);
GL_RCC_APBPeriphClockCmd(pTscHwParam.TSC_I2C_Scl_Gpio_Clk | pTscHwParam.TSC_I2C_Sda_Gpio_Clk |
pTscHwParam.TSC_IT_Gpio_Clk | RCC_APB2Periph_AFIO, GL_ENABLE, 2);
/* Reset TSC_I2C_Channel IP (affected by other peripherals-E2p,Audio,MEMS on TSC_I2C_Channel?) */
RCC_APB1PeriphResetCmd(pTscHwParam.TSC_I2C_Clk, ENABLE);
/* Release reset signal of TSC_I2C_Channel IP */
RCC_APB1PeriphResetCmd(pTscHwParam.TSC_I2C_Clk, DISABLE);
/* TSC_I2C_Channel SCL and SDA pins configuration */
GPIO_InitStructure.GPIO_Pin = pTscHwParam.TSC_I2C_Scl_Gpio_Pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GL_GPIO_Init(pTscHwParam.TSC_I2C_Sda_Gpio_Port, &GPIO_InitStructure);
/* TSC_I2C_Channel SCL and SDA pins configuration */
GPIO_InitStructure.GPIO_Pin = pTscHwParam.TSC_I2C_Sda_Gpio_Pin;
GPIO_Init(pTscHwParam.TSC_I2C_Sda_Gpio_Port, &GPIO_InitStructure);
/* Set EXTI pin as Input PullUp - IO_Expander_INT */
GPIO_InitStructure.GPIO_Pin = pTscHwParam.TSC_IT_Gpio_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GL_GPIO_Init(pTscHwParam.TSC_IT_Gpio_Port, &GPIO_InitStructure);
#else
/* Enable IOE_I2C and IOE_I2C_GPIO_PORT & Alternate Function clocks */
RCC_APB1PeriphClockCmd(pTscHwParam.TSC_I2C_Clk, ENABLE);
RCC_AHB1PeriphClockCmd(pTscHwParam.TSC_I2C_Scl_Gpio_Clk | pTscHwParam.TSC_I2C_Sda_Gpio_Clk |
pTscHwParam.TSC_IT_Gpio_Clk, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Reset IOE_I2C IP */
RCC_APB1PeriphResetCmd(pTscHwParam.TSC_I2C_Clk, ENABLE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -