1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

72歳の... STM32H750で16bitパラレルTFTディスプレイ、タッチ機能もグッド。少しだけ不満点が。

1
Posted at

 最近購入した「WeAct MiniSTM32H750VBT6」ボードと悪戦苦闘してます。

その中でこのサイトhttps://github.com/offpic/GUI-TFT-STM32-NT35510
を見つけ、手持ちの

4inch 800x480 Display MAR4018

と「BlackPill」で試したところ動くではないですか!気をよくしてこちらのボードでもやってみました。
H7_nt35510.jpg

表示に関してはESP32、RaspberryPicoなどで出来てました。今回初めてタッチ機能もサクサク使え大収穫でした。
 環境・構成等は

1.Windows11 25H2
2.STM32CubeIDE 2.2.1
3.STM32CubeMX 6.17.0
4.STM32CubeProgrammer 2.22.0
5.ST-Link V2(アマゾンで購入の廉価品)
6.WeAct MiniSTM32H750VBT6(アリエクで購入)
7.4inch 800x480 Display MAR4018(NT35510, XPT2046)

 評判通りSTM32CubeIDEがVer2になって使いづらくなってました。

最初に、STM32CubeMXでプロジェクトを作り、
STM32CubeIDEのワークスペース内に作成しておいたフォルダーに保存させる、
その時にSTM32CubeIDEを起動させる

という手順で、何とか出来ました。
STM32CubeMXで、RCCを

RCC.jpg

クロックコンフィグレーションは最高速の480MHzに設定。GPIOは

GPIO1.jpg
としました。サイトのオリジナルでは中途半端に「USBデバイスとして認識される」ので、以下のように変更しました。

T_CS   PC1
T_MISO PC2_C

ビルドエラーを解消するため、

1.GUI.h に void LCD_Rect_Round(uint16_t x, uint16_t y, uint16_t length, uint16_t width, uint16_t r, uint8_t size, uint32_t color24);//追加
2.nt35510.h に void WriteData(uint16_t data);// 追加

Flashメモリが128kBしかなく、binファイルを作ってくれません。なので、フォントも使用するものだけにしたうえ、main.cの画像を表示する部分はコメントアウトしました。

//TFT_Draw_Bitmap(40, 40, 259, 140, ST);    //ST MICRO
//TFT_Draw_Bitmap(330, 35, 150, 150, QR);   //QR CODE
//TFT_Draw_Bitmap(540, 280, 170, 198, ON);  //not build
etc.

これで、binファイルのサイズが68KBとなりました。長くなりますが、main.cの必要なソースは以下になります。

main.c
#include "main.h"

/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>
#include "GUI.h"
#include "nt35510.h"
#include "image.h"
#include "touch.h"

#include "028_Open_Sans_Bold.h"
#include "036_Open_Sans_Bold.h"
#include "048_Open_Sans_Bold.h"
#include "072_Open_Sans_Bold.h"

#define _Open_Sans_Bold_28      &Open_Sans_Bold_28
#define _Open_Sans_Bold_36      &Open_Sans_Bold_36
#define _Open_Sans_Bold_48      &Open_Sans_Bold_48
#define _Open_Sans_Bold_72      &Open_Sans_Bold_72

u16 ColorTab[5] = { RED, GREEN, BLUE, YELLOW, BRED };
u16 ColornTab[8] = { RED, MAGENTA, GREEN, DARKBLUE, BLUE, BLACK, LIGHTGREEN };

#define RED2RED 0
#define GREEN2GREEN 1
#define BLUE2BLUE 2
#define BLUE2RED 3
#define GREEN2RED 4
#define RED2GREEN 5

char buf[20];

uint8_t one = 1, two = 1, three = 1, four = 1;
/* USER CODE END Includes */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MPU_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */

int main(void)
{
  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();
  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  
  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
	LCD_Init();
	LCD_Clear(WHITE);

	TP_Adjust();
	LCD_Font(40, 240, "Status", _Open_Sans_Bold_48, 1, GRAY); //blue
	LCD_Font(220, 240, "READY", _Open_Sans_Bold_48, 1, GREEN); //blue

	sprintf(buf, "START");
	LCD_ShowString(200, 16, 16, (uint8_t *)buf, 1);

	//TFT_Draw_Bitmap(40, 40, 259, 140, ST);    //ST MICRO
	//TFT_Draw_Bitmap(330, 35, 150, 150, QR);   //QR CODE
	DrawFilledCircle(430, 240, 30, GREEN);

	LCD_Font(40, 300, "Current temperatur", _Open_Sans_Bold_36, 1, BLACK);//blue
	LCD_Rect_Round_Fill(40, 330, 310, 30, 15, AHMED);
	LCD_Rect_Round(40, 330, 430, 30, 15, 1, AHMED);

	LCD_Font(40, 400, "Water level", _Open_Sans_Bold_36, 1, BLACK);	//blue
	LCD_Rect_Round_Fill(40, 420, 310, 30, 15, AHMED);
	LCD_Rect_Round(40, 420, 430, 30, 15, 1, AHMED);

	LCD_Rect_Round_Fill(590, 240, 80, 30, 15, GRAY);  //small slide 50  270

	DrawFilledCircle(607, 255, 12, WHITE);  //small slide  82  300

	DrawFilledCircle(653, 255, 12, WHITE);  //small slide   175  300

	LCD_Font(495, 260, "Light", _Open_Sans_Bold_28, 1, BLACK);  //on
	LCD_Font(680, 260, "Strong", _Open_Sans_Bold_28, 1, BLACK);  //off

	//TFT_Draw_Bitmap(540, 280, 170, 198, ON); //not build
	ringMeter2(30, 0, 1020, 530, 20, 100, BLUE2BLUE);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	LCD_Rect_Fill(1, 1, 150, 20, WHITE);
	sprintf(buf, "x=%3d y=%3d", 0, 0);
	LCD_ShowString(1, 1, 16, (uint8_t *)buf, 1);
	while (1) {

		tp_dev.scan(0);
		if (tp_dev.sta & TP_PRES_DOWN)
		{
			LCD_Rect_Fill(1, 1, 150, 20, WHITE);
			sprintf(buf, "x=%3d y=%3d", tp_dev.x, tp_dev.y);
			LCD_ShowString(1, 1, 16, (uint8_t *)buf, 1);

			if (tp_dev.x >= 44 && tp_dev.x <= 453 && tp_dev.y >= 332
					&& tp_dev.y <= 366) //slide white big
							{
				LCD_Rect_Round_Fill(40, 330, 430, 30, 15, WHITE);
				if (tp_dev.x > 430)
					tp_dev.x = 430;
				LCD_Rect_Round_Fill(40, 330, tp_dev.x, 30, 15, AHMED);
				LCD_Rect_Round(40, 330, 430, 30, 15, 1, AHMED);
			}

			if (tp_dev.x >= 44 && tp_dev.x <= 455 && tp_dev.y >= 422
					&& tp_dev.y <= 450) //slide white big
							{
				LCD_Rect_Round_Fill(40, 420, 430, 30, 15, WHITE);
				if (tp_dev.x > 430)
					tp_dev.x = 430;
				LCD_Rect_Round_Fill(40, 420, tp_dev.x, 30, 15, AHMED);
				LCD_Rect_Round(40, 420, 430, 30, 15, 1, AHMED);
			}

			if (tp_dev.x >= 600 && tp_dev.x <= 660 && tp_dev.y >= 243
					&& tp_dev.y <= 275) //slide white big
							{
				if (one == 1) {
					one = 0;
					LCD_Rect_Round_Fill(590, 240, 80, 30, 15, BLUE); //small slide 50  270
					DrawFilledCircle(607, 255, 12, WHITE); //small slide  82  300
					HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
					HAL_Delay(500);
				} else {
					one = 1;
					LCD_Rect_Round_Fill(590, 240, 80, 30, 15, GRAY); //small slide 50  270
					DrawFilledCircle(653, 255, 12, WHITE); //small slide   175  300
					HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
					HAL_Delay(500);
				}

			}

			if (tp_dev.x >= 570 && tp_dev.x <= 680 && tp_dev.y >= 330
					&& tp_dev.y <= 450) //light
							{
				if (two == 1) {
					two = 0;
					//TFT_Draw_Bitmap(540, 280, 170, 198, ON);
					HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
					HAL_Delay(500);
				} else {
					two = 1;
					//TFT_Draw_Bitmap(540, 280, 170, 198, OFF);
					HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
					HAL_Delay(500);
				}
			}

			if (tp_dev.x >= 530 && tp_dev.x <= 590 && tp_dev.y >= 135
					&& tp_dev.y <= 200) //slide white big
							{
				LCD_Rect_Fill(500, 1, 300, 230, WHITE);
				ringMeter2(30, 0, 1020, 530, 20, 100, BLUE2BLUE);
				DrawFilledCircle(585, 195, 19, BLUE);
				LCD_Font(585, 125, "11", _Open_Sans_Bold_72, 1, RED); //off
			}

			if (tp_dev.x >= 525 && tp_dev.x <= 575 && tp_dev.y >= 42
					&& tp_dev.y <= 140) //slide white big
							{
				LCD_Rect_Fill(500, 1, 300, 230, WHITE);
				ringMeter2(150, 0, 1020, 530, 20, 100, BLUE2BLUE);
				DrawFilledCircle(545, 154, 19, BLUE);
				LCD_Font(585, 125, "33", _Open_Sans_Bold_72, 1, RED);
			}

			if (tp_dev.x >= 555 && tp_dev.x <= 630 && tp_dev.y >= 11
					&& tp_dev.y <= 62) //slide white big
							{
				LCD_Rect_Fill(500, 1, 300, 230, WHITE);
				ringMeter2(300, 0, 1020, 530, 20, 100, BLUE2BLUE);
				DrawFilledCircle(560, 64, 19, BLUE);
				LCD_Font(585, 125, "44", _Open_Sans_Bold_72, 1, RED);
			}

			if (tp_dev.x >= 625 && tp_dev.x <= 690 && tp_dev.y >= 11
					&& tp_dev.y <= 47) //slide white big
							{
				LCD_Rect_Fill(500, 1, 300, 230, WHITE);
				ringMeter2(450, 0, 1020, 530, 20, 100, BLUE2BLUE);
				DrawFilledCircle(622, 31, 19, BLUE);
				LCD_Font(585, 125, "66", _Open_Sans_Bold_72, 1, RED);
			}

			if (tp_dev.x >= 670 && tp_dev.x <= 730 && tp_dev.y >= 40
					&& tp_dev.y <= 117) //slide white big
							{
				LCD_Rect_Fill(500, 1, 300, 230, WHITE);
				ringMeter2(800, 0, 1020, 530, 20, 100, BLUE2BLUE);
				DrawFilledCircle(714, 115, 19, BLUE);
				LCD_Font(585, 125, "88", _Open_Sans_Bold_72, 1, RED);
			}

			if (tp_dev.x >= 670 && tp_dev.x <= 730 && tp_dev.y >= 120
					&& tp_dev.y <= 200) //slide white big
							{
				LCD_Rect_Fill(500, 1, 300, 230, WHITE);
				ringMeter2(900, 0, 1020, 530, 20, 100, BLUE2BLUE);
				DrawFilledCircle(700, 171, 19, BLUE);
				LCD_Font(585, 125, "99", _Open_Sans_Bold_72, 1, RED);
			}

		}

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	}
  /* USER CODE END 3 */
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Supply configuration update enable
  */
  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);

  /** Configure the main internal regulator output voltage
  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 5;
  RCC_OscInitStruct.PLL.PLLN = 192;
  RCC_OscInitStruct.PLL.PLLP = 2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  RCC_OscInitStruct.PLL.PLLFRACN = 0;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  /* USER CODE BEGIN MX_GPIO_Init_1 */

  /* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(T_CS_GPIO_Port, T_CS_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
                          |REST_Pin|CS_Pin|RS_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
                          |WR_Pin|RD_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, T_MOSI_Pin|T_CLK_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : LED_Pin */
  GPIO_InitStruct.Pin = LED_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : T_CS_Pin T_MOSI_Pin T_CLK_Pin */
  GPIO_InitStruct.Pin = T_CS_Pin|T_MOSI_Pin|T_CLK_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : T_MISO_Pin */
  GPIO_InitStruct.Pin = T_MISO_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(T_MISO_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : PA0 PA1 PA2 PA3
                           PA4 PA5 PA6 PA7
                           REST_Pin CS_Pin RS_Pin */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
                          |REST_Pin|CS_Pin|RS_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PB0 PB1 PB2 PB3
                           PB4 PB5 PB6 PB7
                           WR_Pin RD_Pin */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
                          |WR_Pin|RD_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pin : T_IRQ_Pin */
  GPIO_InitStruct.Pin = T_IRQ_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(T_IRQ_GPIO_Port, &GPIO_InitStruct);

  /*AnalogSwitch Config */
  HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PA0, SYSCFG_SWITCH_PA0_CLOSE);

  /*AnalogSwitch Config */
  HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PA1, SYSCFG_SWITCH_PA1_CLOSE);
}

/* MPU Configuration */
void MPU_Config(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct = {0};

  /* Disables the MPU */
  HAL_MPU_Disable();

  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x0;
  MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  MPU_InitStruct.SubRegionDisable = 0x87;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Enables the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

 今回もいろいろ勉強になりました。ご利用は計画的に。
 最後まで見ていただきありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?