From 10a012c39002e024ac00c931a6c608dce638f688 Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Mon, 7 Aug 2023 16:59:50 +0800 Subject: [PATCH] updated display, work fine display and get temperature values, display with 2/3 of height --- Core/Src/dma.c | 6 ++- Core/Src/main.c | 17 +++++--- Core/Src/spi.c | 22 ++++++----- Core/Src/stm32wlxx_it.c | 18 ++++++++- mlx90640/mlx90640_lcd_display.c | 18 +++++---- mlx90640/st7789.c | 38 +++++++++--------- mlx90640/stm32_hx8347d_lcd.c | 70 ++++++++++++++++++++++----------- 7 files changed, 123 insertions(+), 66 deletions(-) diff --git a/Core/Src/dma.c b/Core/Src/dma.c index ec6a6d8..4bb49f3 100644 --- a/Core/Src/dma.c +++ b/Core/Src/dma.c @@ -44,7 +44,11 @@ void MX_DMA_Init(void) __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ -#if 1 + + /* DMA1_Channel1_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); +#if 0 /* DMA1_Channel2_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); diff --git a/Core/Src/main.c b/Core/Src/main.c index d29658c..4538e45 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -131,36 +131,43 @@ int main(void) MX_LoRaWAN_Init(); /* USER CODE BEGIN 2 */ //MX_ADC_Init(); - MX_SPI_Init(); MX_GPIO_Init(); + MX_DMA_Init(); + MX_SPI_Init(); + MX_I2C_Init(); - //MX_DMA_Init(); + APP_LOG(TS_OFF, VLEVEL_L, "START LCD init....\r\n"); BSP_LCD_Init(); - + BSP_LCD_DisplayOn(); + //HAL_Delay(2000); + //BSP_LCD_DisplayOff(); BSP_LCD_Test(); MLX90640_I2CInit(); mlx90640_display_init(); + +#if 0 APP_LOG(TS_OFF, VLEVEL_L, "DISPLAY ON....\r\n"); BSP_LCD_DisplayOn(); BSP_LCD_Clear(LCD_COLOR_YELLOW); APP_LOG(TS_OFF, VLEVEL_L, "WIDTH = %d, HEIGHT =%d \r\n", BSP_LCD_GetXSize(), BSP_LCD_GetYSize()); BSP_LCD_DisplayStringAt(45,45,"SmarToilets",LEFT_MODE,LCD_COLOR_BLUE); - BSP_LCD_SetRotation(1); + APP_LOG(TS_OFF, VLEVEL_L, "WIDTH = %d, HEIGHT =%d \r\n", BSP_LCD_GetXSize(), BSP_LCD_GetYSize()); BSP_LCD_DisplayStringAt(45,45,"SmarToilets",LEFT_MODE,LCD_COLOR_RED); APP_LOG(TS_OFF, VLEVEL_L, "DISPLAY LOGO....\r\n"); BSP_LCD_DisplayStringAt(45,45,"SmarToilets",LEFT_MODE,LCD_COLOR_BLUE); - +#endif while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ + //BSP_LCD_DisplayOff(); mlx90640_display_process(); } //HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); diff --git a/Core/Src/spi.c b/Core/Src/spi.c index 3b594b2..58872af 100644 --- a/Core/Src/spi.c +++ b/Core/Src/spi.c @@ -33,7 +33,10 @@ void MX_SPI_Init(void) { /* USER CODE BEGIN SPI1_Init 0 */ + __HAL_RCC_SPI1_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); /* USER CODE END SPI1_Init 0 */ /* USER CODE BEGIN SPI1_Init 1 */ @@ -41,14 +44,14 @@ void MX_SPI_Init(void) /* USER CODE END SPI1_Init 1 */ hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_1LINE; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; //SPI_BAUDRATEPRESCALER_64; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + //hspi1.Init.TIMode = SPI_TIMODE_DISABLE; //hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; //hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; @@ -102,7 +105,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(MEMS_SPI_SCK_GPIO_Port, &GPIO_InitStruct); -#if 1 +#if 0 /* SPI1 DMA Init */ /* SPI1_RX Init */ hdma_spi1_rx.Instance = DMA1_Channel2; @@ -125,27 +128,28 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) } __HAL_LINKDMA(spiHandle,hdmarx,hdma_spi1_rx); - +#endif +#if 1 /* SPI1_TX Init */ - hdma_spi1_tx.Instance = DMA1_Channel3; + hdma_spi1_tx.Instance = DMA1_Channel1; hdma_spi1_tx.Init.Request = DMA_REQUEST_SPI1_TX; hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE; - hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; + hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_spi1_tx.Init.Mode = DMA_NORMAL; hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW; if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK) { Error_Handler(); } - +#if 0 if (HAL_DMA_ConfigChannelAttributes(&hdma_spi1_tx, DMA_CHANNEL_NPRIV) != HAL_OK) { Error_Handler(); } - +#endif __HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx); /* SPI1 interrupt Init */ diff --git a/Core/Src/stm32wlxx_it.c b/Core/Src/stm32wlxx_it.c index aa09bd2..fcded07 100644 --- a/Core/Src/stm32wlxx_it.c +++ b/Core/Src/stm32wlxx_it.c @@ -244,6 +244,20 @@ void EXTI1_IRQHandler(void) /* USER CODE END EXTI1_IRQn 1 */ } +/** + * @brief This function handles DMA1 Channel 1 Interrupt. + */ +void DMA1_Channel1_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */ + + /* USER CODE END DMA1_Channel1_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_spi1_tx); + /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */ + + /* USER CODE END DMA1_Channel1_IRQn 1 */ +} +#if 0 /** * @brief This function handles DMA1 Channel 2 Interrupt. */ @@ -266,12 +280,12 @@ void DMA1_Channel3_IRQHandler(void) /* USER CODE BEGIN DMA1_Channel3_IRQn 0 */ /* USER CODE END DMA1_Channel3_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_spi1_tx); + //HAL_DMA_IRQHandler(&hdma_spi1_tx); /* USER CODE BEGIN DMA1_Channel3_IRQn 1 */ /* USER CODE END DMA1_Channel3_IRQn 1 */ } - +#endif /** * @brief This function handles DMA1 Channel 5 Interrupt. */ diff --git a/mlx90640/mlx90640_lcd_display.c b/mlx90640/mlx90640_lcd_display.c index d032148..dec4f2d 100644 --- a/mlx90640/mlx90640_lcd_display.c +++ b/mlx90640/mlx90640_lcd_display.c @@ -114,15 +114,15 @@ static void drawLegend(void) { for (ii = minTemp; ii < maxTemp; ii += inc) { BSP_LCD_DrawVLine(8+ + j++, 292, 20, TempToColor(ii)); } - + BSP_LCD_SetFont(&Font16); memset(tempBuffer,0,sizeof(tempBuffer)); sprintf(tempBuffer,(char *)"%2.1f",minTemp); - BSP_LCD_DisplayStringAt(8,290,(uint8_t *)tempBuffer,LEFT_MODE,LCD_COLOR_BLUE); + BSP_LCD_DisplayStringAt(8,230,(uint8_t *)tempBuffer,LEFT_MODE,LCD_COLOR_BLUE); memset(tempBuffer,0,sizeof(tempBuffer)); sprintf(tempBuffer,(char *)"%2.1f",maxTemp); - BSP_LCD_DisplayStringAt(190,290,(uint8_t *)tempBuffer,LEFT_MODE,LCD_COLOR_RED); + BSP_LCD_DisplayStringAt(190,230,(uint8_t *)tempBuffer,LEFT_MODE,LCD_COLOR_RED); } @@ -134,17 +134,17 @@ static void drawMeasurement(void ) { // Measure and print center temperature centerTemp = (tempValues[383 - 16] + tempValues[383 - 15] + tempValues[384 + 15] + tempValues[384 + 16]) / 4; - - BSP_LCD_SetFont(&Font16); + + BSP_LCD_SetFont(&Font16); memset(tempBuffer,0,sizeof(tempBuffer)); sprintf(tempBuffer,(char *)"%2.2f ",centerTemp); - BSP_LCD_DisplayStringAt(88,220,(uint8_t *)tempBuffer,LEFT_MODE,LCD_COLOR_RED); + BSP_LCD_DisplayStringAt(88,230,(uint8_t *)tempBuffer,LEFT_MODE,LCD_COLOR_RED); } static void drawPicture(void) { for (y=0; y<24; y++) { for (x=0; x<32; x++) { - BSP_LCD_FillRect(8 + x*7, 8 + y*7, 7, 7, TempToColor(tempValues[(31-x) + (y*32)])); + BSP_LCD_FillRect(x*10, y*10, 9, 10, TempToColor(tempValues[(x) + (y*32)])); } } } @@ -169,6 +169,7 @@ static void readTempValues(void) { MLX90640_CalculateTo(mlx90640Frame, &mlx90640, EMMISIVITY, tr, tempValues); } +#if 0 APP_LOG(TS_OFF,VLEVEL_L, "\r\n\n\n"); for (uint8_t y=0; y < 24; y++) { for (uint8_t x=0; x<32; x++) { @@ -176,10 +177,11 @@ static void readTempValues(void) { } APP_LOG(TS_OFF,VLEVEL_L, "\r\n"); } +#endif } void mlx90640_display_process(void){ - APP_LOG(TS_OFF, VLEVEL_L, "Read value.\r\n"); + //APP_LOG(TS_OFF, VLEVEL_L, "Read value.\r\n"); readTempValues(); setTempScale(); drawPicture(); diff --git a/mlx90640/st7789.c b/mlx90640/st7789.c index 4cd14eb..16ee242 100644 --- a/mlx90640/st7789.c +++ b/mlx90640/st7789.c @@ -66,8 +66,8 @@ LCD_DrvTypeDef st7789v_drv = //static uint8_t Is_st7789v_Initialized = 0; static uint16_t ArrayRGB[280] = {0}; -uint16_t st7789v_width = 240; -uint16_t st7789v_height = 280; +uint16_t st7789v_width = ST7789V_LCD_PIXEL_WIDTH; +uint16_t st7789v_height = ST7789V_LCD_PIXEL_HEIGHT; uint8_t st7789v_rotation = 0; /** * @} @@ -122,20 +122,19 @@ void st7789v_Init(void) /* Initialize st7789v low level bus layer -----------------------------------*/ LCD_IO_Init(); - //LCD_CS_HIGH(); - - LCD_RST_LOW(); - HAL_Delay(10); + //LCD_CS_LOW(); //CHIP SELECT + LCD_RST_LOW(); // CHIP RESET + HAL_Delay(100); LCD_RST_HIGH(); - HAL_Delay(10); + HAL_Delay(100); LCD_BL_ON(); HAL_Delay(100); /* Out of sleep mode, 0 args, no delay */ - st7789v_WriteRegCmd(0x11); - HAL_Delay(120); + st7789v_WriteRegCmd(0x11); + HAL_Delay(120); + st7789v_WriteRegCmd(0x36); - st7789v_WriteRegCmd(0x36); if (st7789v_rotation ==0) st7789v_WriteRegCmd(0x00); else if (st7789v_rotation ==1) st7789v_WriteRegCmd(0xC0); if (st7789v_rotation ==2) st7789v_WriteRegCmd(0x70); @@ -192,7 +191,8 @@ void st7789v_Init(void) st7789v_WriteReg(0xE1, 0x0E); st7789v_WriteReg(0xE1, 0x09); st7789v_WriteReg(0xE1, 0x09); - st7789v_WriteReg(0xE1, 0x05); + st7789v_WriteReg(0xE1, 0x15); + st7789v_WriteReg(0xE1, 0x31); st7789v_WriteReg(0xE1, 0x33); st7789v_WriteReg(0xE1, 0x48); st7789v_WriteReg(0xE1, 0x17); @@ -254,9 +254,9 @@ void st7789v_SetCursor(uint16_t Xpos, uint16_t Ypos) data = (Xpos) & 0xFF; LCD_IO_WriteMultipleData(&data, 1); LCD_IO_WriteReg(0x2B);/* Row address set: RASET */ - data = (Ypos) >> 8; + data = (Ypos+20) >> 8; LCD_IO_WriteMultipleData(&data, 1); - data = (Ypos) & 0xFF; + data = (Ypos+20) & 0xFF; LCD_IO_WriteMultipleData(&data, 1); LCD_IO_WriteReg(0x2C);/* Memory write: RAMWR */ } @@ -271,10 +271,10 @@ void st7789v_SetCursor(uint16_t Xpos, uint16_t Ypos) void st7789v_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode) { uint8_t data = 0; -// if((Xpos > ST7789V_LCD_PIXEL_WIDTH) || (Ypos > ST7789V_LCD_PIXEL_HEIGHT)) -// { -// return; -// } + if((Xpos > ST7789V_LCD_PIXEL_WIDTH) || (Ypos > ST7789V_LCD_PIXEL_HEIGHT)) + { + return; + } /* Set Cursor */ st7789v_SetCursor(Xpos, Ypos); @@ -484,7 +484,7 @@ void st7789_SetRotation(uint8_t rotation) case 0: /* Memory access control: MY = 0, MX = 0, MV = 0, ML = 0 */ /* */ -#if 0 +#if 1 st7789v_WriteReg(0X36, 0x08); st7789v_WriteReg(0x2A, 0x00); st7789v_WriteReg(0x2A, 0x00); @@ -500,7 +500,7 @@ void st7789_SetRotation(uint8_t rotation) break; case 1: /* Memory access control: MY = 0, MX = 1, MV = 1, ML = 0 */ -#if 0 +#if 1 st7789v_WriteReg(0X36, 0x68); st7789v_WriteReg(0x2A, 0x00); st7789v_WriteReg(0x2A, 0x00); diff --git a/mlx90640/stm32_hx8347d_lcd.c b/mlx90640/stm32_hx8347d_lcd.c index 664607b..50547e8 100644 --- a/mlx90640/stm32_hx8347d_lcd.c +++ b/mlx90640/stm32_hx8347d_lcd.c @@ -146,25 +146,43 @@ uint8_t BSP_LCD_Init(void) uint8_t ret = LCD_ERROR; /* Default value for draw propriety */ +#if 1 DrawProp.BackColor = 0xFFFF; DrawProp.pFont = &Font16; DrawProp.TextColor = 0x0000; - +#endif // lcd_drv = &hx8347d_drv; lcd_drv = &st7789v_drv; - LCD_IO_Init(); + //LCD_IO_Init(); /* LCD Init */ lcd_drv->Init(); - - BSP_LCD_SetRotation(0); - LCD_BL_ON(); + lcd_drv->SetRotation(1); +#if 0 /* Clear the LCD screen */ BSP_LCD_Clear(LCD_COLOR_WHITE); - + HAL_Delay(1000); + LCD_BL_OFF(); /* Initialize the font */ BSP_LCD_SetFont(&LCD_DEFAULT_FONT); - + + BSP_LCD_SetRotation(1); + LCD_BL_ON(); + BSP_LCD_Clear(LCD_COLOR_BLUE); + HAL_Delay(1000); + LCD_BL_OFF(); + + BSP_LCD_SetRotation(2); + LCD_BL_ON(); + BSP_LCD_Clear(LCD_COLOR_GREEN); + HAL_Delay(1000); + LCD_BL_OFF(); + +/* Clear the LCD screen */ +BSP_LCD_Clear(LCD_COLOR_WHITE); + + +#endif ret = LCD_OK; return ret; @@ -692,7 +710,7 @@ void BSP_LCD_FillRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Hei lcd_drv->FillRect(Xpos, Ypos, Width, Height, RGBCode); } - SetDisplayWindow(0, 0, BSP_LCD_GetYSize(), BSP_LCD_GetXSize()); + SetDisplayWindow(0, 0, BSP_LCD_GetXSize(), BSP_LCD_GetYSize()); } /** @@ -1187,15 +1205,20 @@ void LCD_IO_Init(void) /* Configure LCD_CS_PIN pin: LCD CS pin */ gpioinitstruct.Pin = LCD_CS_PIN; gpioinitstruct.Mode = GPIO_MODE_OUTPUT_PP; - gpioinitstruct.Speed = GPIO_SPEED_FREQ_HIGH; + gpioinitstruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(LCD_CS_GPIO_Port, &gpioinitstruct); /* Configure LCD_DC_PIN pin: LCD Card DC pin */ gpioinitstruct.Pin = LCD_DC_PIN; HAL_GPIO_Init(LCD_DC_GPIO_PORT, &gpioinitstruct); + gpioinitstruct.Pin = LCD_RST_PIN; + HAL_GPIO_Init(LCD_RST_GPIO_PORT, &gpioinitstruct); + /* LCD chip select high */ LCD_CS_HIGH(); + LCD_DC_HIGH(); + LCD_RST_HIGH(); /* LCD SPI Config */ //SPIx_Init(); @@ -1212,13 +1235,16 @@ void LCD_IO_WriteReg(uint8_t LCDReg) LCD_CS_LOW(); /* Set LCD data/command line DC to Low */ - //LCD_DC_LOW(); + LCD_DC_LOW(); /* Send Command */ SPIx_Write(LCDReg); HAL_Delay(1); + + LCD_DC_HIGH(); /* Deselect : Chip Select high */ LCD_CS_HIGH(); + } /** @@ -1312,37 +1338,37 @@ void LCD_Delay(uint32_t Delay) void BSP_LCD_Test(void) { BSP_LCD_Clear(LCD_COLOR_WHITE); - HAL_Delay(1000); + HAL_Delay(500); APP_LOG(TS_OFF,VLEVEL_L,"\r\n Clear with red...........\r\n"); BSP_LCD_Clear(LCD_COLOR_RED); - HAL_Delay(1000); + HAL_Delay(500); BSP_LCD_Clear(LCD_COLOR_RED); APP_LOG(TS_OFF,VLEVEL_L,"\r\n Clear with blue...........\r\n"); BSP_LCD_Clear(LCD_COLOR_BLUE); - HAL_Delay(1000); + HAL_Delay(500); APP_LOG(TS_OFF,VLEVEL_L,"\r\n Clear with YELLOW...........\r\n"); BSP_LCD_Clear(LCD_COLOR_YELLOW); - HAL_Delay(1000); + HAL_Delay(500); APP_LOG(TS_OFF,VLEVEL_L,"\r\n Clear with GREEN...........\r\n"); BSP_LCD_Clear(LCD_COLOR_GREEN); - HAL_Delay(1000); + HAL_Delay(500); APP_LOG(TS_OFF,VLEVEL_L,"\r\n Clear with WHITE...........\r\n"); BSP_LCD_Clear(LCD_COLOR_WHITE); - HAL_Delay(1000); + HAL_Delay(500); BSP_LCD_FillRect(0,0,ST7789V_LCD_PIXEL_WIDTH,ST7789V_LCD_PIXEL_HEIGHT,LCD_COLOR_WHITE); - HAL_Delay(1000); + HAL_Delay(500); BSP_LCD_FillRect(0,0,ST7789V_LCD_PIXEL_WIDTH,ST7789V_LCD_PIXEL_HEIGHT,LCD_COLOR_RED); - HAL_Delay(1000); + HAL_Delay(500); BSP_LCD_FillRect(0,0,ST7789V_LCD_PIXEL_WIDTH,ST7789V_LCD_PIXEL_HEIGHT,LCD_COLOR_BROWN); - HAL_Delay(1000); + HAL_Delay(500); BSP_LCD_FillRect(0,0,ST7789V_LCD_PIXEL_WIDTH,ST7789V_LCD_PIXEL_HEIGHT,LCD_COLOR_LIGHTGREEN); - HAL_Delay(1000); + HAL_Delay(500); BSP_LCD_FillRect(0,0,ST7789V_LCD_PIXEL_WIDTH,ST7789V_LCD_PIXEL_HEIGHT,LCD_COLOR_LGRAYBLUE); - HAL_Delay(1000); + HAL_Delay(500); BSP_LCD_FillRect(0,0,ST7789V_LCD_PIXEL_WIDTH,ST7789V_LCD_PIXEL_HEIGHT,LCD_COLOR_BLUE); #if 0 @@ -1398,7 +1424,7 @@ void BSP_LCD_Test(void) BSP_LCD_Clear(LCD_COLOR_BLACK); //BSP_LCD_DrawBitmap(0, 0, (char *)gImage_1); - HAL_Delay(3000); + HAL_Delay(500); /*