From caa7b5c50f24f227344fcabcd7ecfe15d04ff658 Mon Sep 17 00:00:00 2001 From: id101010 Date: Mon, 1 Jun 2015 21:25:49 +0200 Subject: [PATCH] Added IRQ for user button, fixed some touchproblems. --- common/app/screen_main.c | 2 +- common/app/screen_pixytest.c | 4 +- discovery/src/ll_tft.c | 46 ++++++++++---------- discovery/src/ll_touch.c | 81 +++++++++++++++++++++++++++--------- 4 files changed, 87 insertions(+), 46 deletions(-) diff --git a/common/app/screen_main.c b/common/app/screen_main.c index 1ff52d6..6aefa24 100644 --- a/common/app/screen_main.c +++ b/common/app/screen_main.c @@ -77,7 +77,7 @@ static void enter(void* screen) { b_ref_tracking.txtcolor=WHITE; b_ref_tracking.bgcolor=HEX(0xFF2151); b_ref_tracking.font=0; - b_ref_tracking.text="Reference Tracking"; + b_ref_tracking.text="Ref Tracking"; b_ref_tracking.callback=b_ref_tracking_cb; gui_button_add(&b_ref_tracking); diff --git a/common/app/screen_pixytest.c b/common/app/screen_pixytest.c index 05b5402..32fdcf4 100644 --- a/common/app/screen_pixytest.c +++ b/common/app/screen_pixytest.c @@ -264,7 +264,7 @@ static void enter(void* screen) { n_led_powerlimit.max=40; n_led_powerlimit.min =0; n_led_powerlimit.callback=n_led_powerlimit_cb; - gui_numupdown_add(&n_led_powerlimit); + //gui_numupdown_add(&n_led_powerlimit); @@ -283,7 +283,7 @@ static void leave(void* screen) { gui_button_remove(&b_led_red); gui_button_remove(&b_led_green); gui_button_remove(&b_led_blue); - gui_numupdown_remove(&n_led_powerlimit); + //gui_numupdown_remove(&n_led_powerlimit); } diff --git a/discovery/src/ll_tft.c b/discovery/src/ll_tft.c index 912b7dd..37037b2 100644 --- a/discovery/src/ll_tft.c +++ b/discovery/src/ll_tft.c @@ -101,7 +101,7 @@ void ll_tft_draw_char(uint16_t x, uint16_t y, uint16_t color, uint16_t bgcolo #define TFT_SSD1289_REG_46 0x46 // Y-end register // Timeouts -#define TFT_INIT_TIMEOUT 1 // 1ms timeout +#define TFT_INIT_TIMEOUT 10 // 1ms timeout /* * ---------------------- init functions ---------------------------------------------------------- @@ -230,30 +230,30 @@ static bool fsmc_init() RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); // prepare timing struct - FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = TFT_SSD1289_FSMC_AST; - FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 1; - FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = TFT_SSD1289_FSMC_DST; - FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0; - FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 0; - FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0; - FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A; + FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = TFT_SSD1289_FSMC_AST; + FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 1; + FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = TFT_SSD1289_FSMC_DST; + FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0; + FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 0; + FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0; + FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A; // bank-1 / PSRAM-1 - FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; - FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; - FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; - FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; - FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; - FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; - FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; - FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; - FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure; - FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure; + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure; + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure; // config FSMC FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); diff --git a/discovery/src/ll_touch.c b/discovery/src/ll_touch.c index 36d373a..8773e9a 100644 --- a/discovery/src/ll_touch.c +++ b/discovery/src/ll_touch.c @@ -1,4 +1,6 @@ #include"ll_touch.h" +#include"screen.h" +#include"screen_guitest.h" #include #include #include @@ -11,6 +13,7 @@ /* Defines ---------------------------------------------------------- */ #define CLEAR_CS GPIO_ResetBits(GPIOB,GPIO_Pin_9) #define SET_CS GPIO_SetBits(GPIOB,GPIO_Pin_9) +#define PENIRQ !GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1) #define REQ_X_COORD 0x90 // Request x coordinate #define REQ_Y_COORD 0xD0 // Request y coordinate #define REQ_1_DATAB 0x00 // Request one databyte @@ -35,13 +38,13 @@ bool ll_touch_init(); static void init_exti(); static void init_timer(); static uint8_t touch_send(uint8_t dat); -static uint16_t avg_vals(uint16_t samples[], uint16_t len); +static uint16_t avg_vals(volatile uint16_t samples[], uint16_t len); static uint16_t touch_get_y_coord(); static uint16_t touch_get_y_coord(); void touch_test(uint16_t x, uint16_t y); /* Functions --------------------------------------------------------- */ -static uint16_t avg_vals(uint16_t samples[], uint16_t len) +static uint16_t avg_vals(volatile uint16_t samples[], uint16_t len) { uint16_t j = 0; uint32_t tmp = 0; @@ -164,34 +167,64 @@ bool ll_touch_init() static void init_exti() { + + // PENIRQ -> EXTI1 (PC1) + // Blue Button -> EXTI0 (PA0) + /* init structures */ GPIO_InitTypeDef gpio; EXTI_InitTypeDef exti; NVIC_InitTypeDef nvic; - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // enable GPIOA clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // enable SYSCFG clock + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); // enable GPIOC clock + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // enable GPIOA clock - /* Set GPIOA0 as input */ + /* Set GPIOC1 as input */ gpio.GPIO_Mode = GPIO_Mode_IN; gpio.GPIO_OType = GPIO_OType_PP; - gpio.GPIO_Pin = GPIO_Pin_0; + gpio.GPIO_Pin = GPIO_Pin_1; gpio.GPIO_PuPd = GPIO_PuPd_UP; gpio.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_Init(GPIOC, &gpio); + + SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource1); // Bind Exti_line1 to PC1 + + /* Set GPIOA0 as input */ + gpio.GPIO_Mode = GPIO_Mode_IN; + gpio.GPIO_OType = GPIO_OType_OD; + gpio.GPIO_Pin = GPIO_Pin_0; + gpio.GPIO_PuPd = GPIO_PuPd_NOPULL; + gpio.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOA, &gpio); - SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); // Bind Exti_line0 to PA0 + SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); // Bind Exti_line1 to PC1 - /* EXTI on PA0 */ + /* EXTI on PC1 */ EXTI_StructInit(&exti); - exti.EXTI_Line = EXTI_Line0; + exti.EXTI_Line = EXTI_Line1; exti.EXTI_Mode = EXTI_Mode_Interrupt; exti.EXTI_Trigger = EXTI_Trigger_Falling; // Trigger on falling edge (PENIRQ) exti.EXTI_LineCmd = ENABLE; EXTI_Init(&exti); + + /* EXTI on PA0 */ + EXTI_StructInit(&exti); + exti.EXTI_Line = EXTI_Line0; + exti.EXTI_Mode = EXTI_Mode_Interrupt; + exti.EXTI_Trigger = EXTI_Trigger_Falling; // Trigger on calibration (Blue button) + exti.EXTI_LineCmd = ENABLE; + EXTI_Init(&exti); /* Add IRQ vector to NVIC */ - nvic.NVIC_IRQChannel = EXTI0_IRQn; // PD0 -> EXTI_Line0 -> EXTI0_IRQn vector + nvic.NVIC_IRQChannel = EXTI1_IRQn; // PC1 -> EXTI_Line1 -> EXTI1_IRQn vector + nvic.NVIC_IRQChannelPreemptionPriority = 0x00; // Set priority + nvic.NVIC_IRQChannelSubPriority = 0x00; // Set sub priority + nvic.NVIC_IRQChannelCmd = ENABLE; // Enable interrupt + NVIC_Init(&nvic); // Config NVIC + + /* Add IRQ vector to NVIC */ + nvic.NVIC_IRQChannel = EXTI0_IRQn; // PA0 -> EXTI_Line0 -> EXTI0_IRQn vector nvic.NVIC_IRQChannelPreemptionPriority = 0x00; // Set priority nvic.NVIC_IRQChannelSubPriority = 0x00; // Set sub priority nvic.NVIC_IRQChannelCmd = ENABLE; // Enable interrupt @@ -218,33 +251,41 @@ static void init_timer() void EXTI0_IRQHandler() { if (EXTI_GetITStatus(EXTI_Line0) == SET) { // If the right interrupt flag is set - TIM_Cmd(TIM7, ENABLE); // Start the timer + gui_screen_navigate(get_screen_guitest()); EXTI_ClearITPendingBit(EXTI_Line0); // Clear interrupt flag } } +void EXTI1_IRQHandler() +{ + if (EXTI_GetITStatus(EXTI_Line1) == SET) { // If the right interrupt flag is set + TIM_Cmd(TIM7, ENABLE); // Start the timer + EXTI_ClearITPendingBit(EXTI_Line1); // Clear interrupt flag + } +} + void TIM7_IRQHandler() { if(TIM_GetFlagStatus(TIM7, TIM_IT_Update) == SET){ // Make sure the interrupt flag is set TIM_Cmd(TIM7, DISABLE); // Disable the timer during the measuring - if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)){ // Only do this if the PENIRQ line is still low - /* Sample 16 times and submit */ - for(i = 0; i < (NSAMPLE-1); i++){ - /* Apply some calibration to the measured positions */ + if(PENIRQ){ // Only do this if the PENIRQ line is still low + for(i = 0; i < (NSAMPLE-1); i++){ // Sample 16 times and apply some calibration x_samples[i] = (((long)(DWIDTH - 2 * CCENTER) * 2 * (long)((long)touch_get_x_coord() - x1) / dx + 1) >> 1) + CCENTER; y_samples[i] = (((long)(DHEIGHT -2 * CCENTER) * 2 * (long)((long)touch_get_y_coord() - y1) / dy + 1) >> 1) + CCENTER; } - - touch_add_raw_event(avg_vals(x_samples, NSAMPLE), avg_vals(y_samples, NSAMPLE), TOUCH_DOWN); - TIM_Cmd(TIM7, ENABLE); + + touch_add_raw_event(avg_vals(x_samples, NSAMPLE), avg_vals(y_samples, NSAMPLE), TOUCH_DOWN); // Update position + //tft_draw_pixel(avg_vals(x_samples, NSAMPLE), avg_vals(y_samples, NSAMPLE), RED); + TIM_Cmd(TIM7, ENABLE); // Reenable timer } else { - touch_add_raw_event(avg_vals(x_samples, NSAMPLE), avg_vals(y_samples, NSAMPLE), TOUCH_UP); - TIM_Cmd(TIM7, DISABLE); + touch_add_raw_event(avg_vals(x_samples, NSAMPLE), avg_vals(y_samples, NSAMPLE), TOUCH_UP); // Update position one last time + //tft_draw_pixel(avg_vals(x_samples, NSAMPLE), avg_vals(y_samples, NSAMPLE), RED); + TIM_Cmd(TIM7, DISABLE); // Disable timer } - TIM_ClearFlag(TIM7, TIM_IT_Update); + TIM_ClearFlag(TIM7, TIM_IT_Update); // Clear timer interrupt flag } }