From a57242ba2d0e0439afe061c4acd67ff08d2e3c9c Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Tue, 15 Aug 2023 12:17:52 +0800 Subject: [PATCH] ST7789 revised SPI1 and GPIO for DC/CS/RST/BL --- Core/Inc/main.h | 48 +++++++++++++++++------- Core/Src/gpio.c | 18 +++++++-- Core/Src/main.c | 12 +++--- Core/Src/spi.c | 2 +- mlx90640/mlx90640_lcd_display.c | 5 ++- mlx90640/st7789.c | 2 + mlx90640/stm32_hx8347d_lcd.c | 16 ++++---- mlx90640/stm32_hx8347d_lcd.h | 65 +++++++++++++++++++++------------ 8 files changed, 111 insertions(+), 57 deletions(-) diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 02fe403..fe3f0e4 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -89,7 +89,7 @@ void Error_Handler(void); /* USER CODE BEGIN Private defines */ #define VOLTAGE_DETECT_Pin GPIO_PIN_15 #define VOLTAGE_DETECT_GPIO_Port GPIOA - +/* #if 0 //GPIO CONTROL FOR ST7789 #define LCD_RST_Pin GPIO_PIN_3 @@ -101,30 +101,50 @@ void Error_Handler(void); #define LCD_DC_Pin GPIO_PIN_5 #define LCD_DC_GPIO_Port GPIOB #endif - +*/ #define LED_Pin GPIO_PIN_8 #define LED_GPIO_Port GPIOA - /* FOR FLASH CHIP */ #define W25Q_CS_Pin GPIO_PIN_9 #define W25Q_CS_GPIO_Port GPIOA /* FOR LCD ST7789 SPI MOSI CONTROL */ #if defined(USE_IPS_LCD_ST7789) -#define MEMS_SPI_SCK_Pin GPIO_PIN_3 -#define MEMS_SPI_SCK_GPIO_Port GPIOB -#define MEMS_SPI_MOSI_Pin GPIO_PIN_5 -#define MEMS_SPI_MOSI_GPIO_Port GPIOB +/* +#if defined(STM32WL55xx) // FOR NUCLEO WL55JC1/2 + #define MEMS_SPI_SCK_Pin GPIO_PIN_3 + #define MEMS_SPI_SCK_GPIO_Port GPIOB + #define MEMS_SPI_MOSI_Pin GPIO_PIN_5 + #define MEMS_SPI_MOSI_GPIO_Port GPIOB + + #define LCD_RST_Pin GPIO_PIN_4 + #define LCD_RST_GPIO_Port GPIOA + #define LCD_DC_Pin GPIO_PIN_5 + #define LCD_DC_GPIO_Port GPIOA + #define LCD_CS_Pin GPIO_PIN_6 + #define LCD_CS_GPIO_Port GPIOA + #define LCD_BL_Pin GPIO_PIN_7 + #define LCD_BL_GPIO_Port GPIOA +#endif +*/ + +//#if defined(STM32WLE5xx) // for STS_IOT_CORE +#define MEMS_SPI_SCK_Pin GPIO_PIN_5 +#define MEMS_SPI_SCK_GPIO_Port GPIOA +#define MEMS_SPI_MOSI_Pin GPIO_PIN_7 +#define MEMS_SPI_MOSI_GPIO_Port GPIOA #define LCD_RST_Pin GPIO_PIN_4 -#define LCD_RST_GPIO_Port GPIOA -#define LCD_DC_Pin GPIO_PIN_5 -#define LCD_DC_GPIO_Port GPIOA -#define LCD_CS_Pin GPIO_PIN_6 -#define LCD_CS_GPIO_Port GPIOA -#define LCD_BL_Pin GPIO_PIN_7 -#define LCD_BL_GPIO_Port GPIOA +#define LCD_RST_GPIO_Port GPIOB +#define LCD_DC_Pin GPIO_PIN_3 +#define LCD_DC_GPIO_Port GPIOB +#define LCD_CS_Pin GPIO_PIN_8 +#define LCD_CS_GPIO_Port GPIOB +#define LCD_BL_Pin GPIO_PIN_5 +#define LCD_BL_GPIO_Port GPIOB + +//#endif #define KEY1_Pin GPIO_PIN_0 #define KEY1_GPIO_Port GPIOA diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 6f80aaf..004e1b0 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -97,13 +97,25 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(LCD_CS_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pins : PBPin PBPin PBPin */ - GPIO_InitStruct.Pin = LCD_RST_Pin|LCD_BL_Pin|LCD_DC_Pin; + GPIO_InitStruct.Pin = LCD_RST_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + HAL_GPIO_Init(LCD_RST_GPIO_Port, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LCD_BL_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(LCD_BL_GPIO_Port, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LCD_DC_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(LCD_DC_GPIO_Port, &GPIO_InitStruct); + /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); diff --git a/Core/Src/main.c b/Core/Src/main.c index fd210df..5950fe0 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -104,20 +104,20 @@ int main(void) MX_LoRaWAN_Init(); /* USER CODE BEGIN 2 */ //MX_ADC_Init(); - - - MX_GPIO_Init(); MX_I2C_Init(); MX_SPI_Init(); + MX_GPIO_Init(); + MX_DMA_Init(); APP_LOG(TS_OFF, VLEVEL_L, "START LCD init....\r\n"); BSP_LCD_Init(); + BSP_LCD_Clear(LCD_COLOR_BLUE); BSP_LCD_DisplayOn(); - - //APP_LOG(TS_OFF, VLEVEL_L, "BSP LCD TEST....\r\n"); - //BSP_LCD_Test(); + LCD_BL_ON(); + APP_LOG(TS_OFF, VLEVEL_L, "BSP LCD TEST....\r\n"); + BSP_LCD_Test(); // BSP_LCD_DisplayOff(); diff --git a/Core/Src/spi.c b/Core/Src/spi.c index dc90b55..5d1e9b0 100644 --- a/Core/Src/spi.c +++ b/Core/Src/spi.c @@ -187,7 +187,7 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) HAL_DMA_DeInit(spiHandle->hdmatx); #endif /* SPI1 interrupt Deinit */ - //HAL_NVIC_DisableIRQ(SPI1_IRQn); + HAL_NVIC_DisableIRQ(SPI1_IRQn); /* USER CODE BEGIN SPI1_MspDeInit 1 */ /* USER CODE END SPI1_MspDeInit 1 */ diff --git a/mlx90640/mlx90640_lcd_display.c b/mlx90640/mlx90640_lcd_display.c index 5e5a21a..037375d 100644 --- a/mlx90640/mlx90640_lcd_display.c +++ b/mlx90640/mlx90640_lcd_display.c @@ -181,6 +181,7 @@ static void drawMeasurement(void ) { memset(tempBuffer,0,sizeof(tempBuffer)); sprintf(tempBuffer,(char *)"%2d", (uint8_t)max(v_water_cnt, h_water_cnt)); BSP_LCD_DisplayStringAt(ST7789V_LCD_PIXEL_WIDTH-60, 15,(uint8_t *)tempBuffer,LEFT_MODE,LCD_COLOR_YELLOW); + APP_LOG(TS_OFF, VLEVEL_L, "%s\r\n",tempBuffer); } @@ -256,7 +257,7 @@ void blackOutFilter(void) if ((temp1 + (float)(waterTempThreshold/10.0)) < averageTemp ) { zoneMask[y*32+x] ++; - //APP_LOG(TS_OFF, VLEVEL_L, "Detect Zone X=%d Y=%d Count=%d T=%2.2f \r\n", x, y, zoneMask[y*32+x], (int)(temp1+waterTempThreshold/10.0)); + APP_LOG(TS_OFF, VLEVEL_L, "Detect Zone X=%d Y=%d Count=%d T=%2.2f \r\n", x, y, zoneMask[y*32+x], (int)(temp1+waterTempThreshold/10.0)); waterSpillCount ++; } } @@ -299,7 +300,7 @@ void mlx90640_display_process(void) // BSP_LCD_DisplayOff(); } - //APP_LOG(TS_OFF, VLEVEL_L, "Water Spill Detected Level = %d of %d, \r\n", waterSpillCount, 30*20); + APP_LOG(TS_OFF, VLEVEL_L, "Water Spill Detected Level = %d of %d, \r\n", waterSpillCount, 30*20); } void mlx90640_display_init(void){ diff --git a/mlx90640/st7789.c b/mlx90640/st7789.c index a25f281..5795b4c 100644 --- a/mlx90640/st7789.c +++ b/mlx90640/st7789.c @@ -128,6 +128,8 @@ void st7789v_Init(void) LCD_RST_HIGH(); HAL_Delay(100); + LCD_BL_OFF(); + HAL_Delay(100); LCD_BL_ON(); HAL_Delay(100); /* Out of sleep mode, 0 args, no delay */ diff --git a/mlx90640/stm32_hx8347d_lcd.c b/mlx90640/stm32_hx8347d_lcd.c index 9502c3b..166c47c 100644 --- a/mlx90640/stm32_hx8347d_lcd.c +++ b/mlx90640/stm32_hx8347d_lcd.c @@ -77,8 +77,8 @@ EndDependencies */ #define POLY_Y(Z) ((int32_t)((Points + (Z))->Y)) //#define NULL (void *)0 -#define MAX_HEIGHT_FONT 24 -#define MAX_WIDTH_FONT 17 +#define MAX_HEIGHT_FONT 16 +#define MAX_WIDTH_FONT 11 #define OFFSET_BITMAP 54 /** * @} @@ -155,7 +155,6 @@ uint8_t BSP_LCD_Init(void) // lcd_drv = &hx8347d_drv; lcd_drv = &st7789v_drv; - LCD_IO_Init(); /* LCD Init */ lcd_drv->Init(); lcd_drv->SetRotation(0); @@ -1090,10 +1089,11 @@ static void SPIx_MspInit(void) /* Configure SPI MISO and MOSI */ gpioinitstruct.Pin = LCD_SPIx_MOSI_PIN; HAL_GPIO_Init(LCD_SPIx_MISO_MOSI_GPIO_PORT, &gpioinitstruct); - +#if 0 gpioinitstruct.Pin = LCD_SPIx_MISO_PIN; gpioinitstruct.Mode = GPIO_MODE_INPUT; HAL_GPIO_Init(LCD_SPIx_MISO_MOSI_GPIO_PORT, &gpioinitstruct); +#endif /*** Configure the SPI peripheral ***/ /* Enable SPI clock */ @@ -1117,9 +1117,9 @@ static void SPIx_Init(void) - PCLK2 max frequency is 32 MHz */ hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.Direction = SPI_DIRECTION_1LINE; + hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; + hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; //SPI_POLARITY_LOW; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; @@ -1203,7 +1203,7 @@ void LCD_IO_Init(void) /* LCD_CS_GPIO and LCD_DC_GPIO Periph clock enable */ LCD_CS_GPIO_CLK_ENABLE(); LCD_DC_GPIO_CLK_ENABLE(); - + LCD_RST_GPIO_CLK_ENABLE(); /* Configure LCD_CS_PIN pin: LCD CS pin */ gpioinitstruct.Pin = LCD_CS_PIN; gpioinitstruct.Mode = GPIO_MODE_OUTPUT_PP; diff --git a/mlx90640/stm32_hx8347d_lcd.h b/mlx90640/stm32_hx8347d_lcd.h index 4fbfa5c..493d364 100644 --- a/mlx90640/stm32_hx8347d_lcd.h +++ b/mlx90640/stm32_hx8347d_lcd.h @@ -142,14 +142,28 @@ typedef enum #define LCD_SPIx_SCK_GPIO_PORT MEMS_SPI_SCK_GPIO_Port #define LCD_SPIx_SCK_PIN MEMS_SPI_SCK_Pin +#if 0 // for SPI GPIO PB3/PB5 #define LCD_SPIx_SCK_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() #define LCD_SPIx_SCK_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE() +#endif +#define LCD_SPIx_SCK_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define LCD_SPIx_SCK_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() + +#if 0 // for SPI GPIO PB3/PB5 #define LCD_SPIx_MISO_MOSI_GPIO_PORT MEMS_SPI_MOSI_GPIO_Port #define LCD_SPIx_MISO_MOSI_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() #define LCD_SPIx_MISO_MOSI_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE() #define LCD_SPIx_MISO_PIN GPIO_PIN_6 #define LCD_SPIx_MOSI_PIN MEMS_SPI_MOSI_Pin +#endif + +#define LCD_SPIx_MISO_MOSI_GPIO_PORT MEMS_SPI_MOSI_GPIO_Port +#define LCD_SPIx_MISO_MOSI_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define LCD_SPIx_MISO_MOSI_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() +#define LCD_SPIx_MISO_PIN GPIO_PIN_6 +#define LCD_SPIx_MOSI_PIN MEMS_SPI_MOSI_Pin + /* Maximum Timeout values for flags waiting loops. These timeouts are not based on accurate values, they just guarantee that the application will not remain stuck if the SPI communication is corrupted. @@ -157,6 +171,34 @@ typedef enum conditions (interrupts routines ...). */ #define NUCLEO_SPIx_TIMEOUT_MAX 1000 +/** + * @brief LCD Control Interface pins + */ +#define LCD_CS_PIN LCD_CS_Pin +#define LCD_CS_GPIO_PORT LCD_CS_GPIO_Port +#define LCD_CS_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() +#define LCD_CS_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE() + +/** + * @brief LCD Data/Command Interface pins + */ +#define LCD_DC_PIN LCD_DC_Pin +#define LCD_DC_GPIO_PORT LCD_DC_GPIO_Port +#if 0 // for DC GPIO port A +#define LCD_DC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define LCD_DC_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() +#endif + +#define LCD_DC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() +#define LCD_DC_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE() +/** + * @brief LCD Control Interface pins + */ +#define LCD_RST_PIN LCD_RST_Pin +#define LCD_RST_GPIO_PORT LCD_RST_GPIO_Port +#define LCD_RST_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() +#define LCD_RST_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE() + /** * @brief LCD Control Lines management */ @@ -168,29 +210,6 @@ typedef enum #define LCD_DC_HIGH() HAL_GPIO_WritePin(LCD_DC_GPIO_PORT, LCD_DC_PIN, GPIO_PIN_SET) #define LCD_BL_ON() HAL_GPIO_WritePin(LCD_BL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_SET) #define LCD_BL_OFF() HAL_GPIO_WritePin(LCD_BL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_RESET) -/** - * @brief LCD Control Interface pins - */ -#define LCD_CS_PIN LCD_CS_Pin -#define LCD_CS_GPIO_PORT LCD_CS_GPIO_Port -#define LCD_CS_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() -#define LCD_CS_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() - -/** - * @brief LCD Data/Command Interface pins - */ -#define LCD_DC_PIN LCD_DC_Pin -#define LCD_DC_GPIO_PORT LCD_DC_GPIO_Port -#define LCD_DC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() -#define LCD_DC_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() - -/** - * @brief LCD Control Interface pins - */ -#define LCD_RST_PIN LCD_RST_Pin -#define LCD_RST_GPIO_PORT LCD_RST_GPIO_Port -#define LCD_RST_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() -#define LCD_RST_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE()