最近購入した「WeAct MiniSTM32H750VBT6」ボードと悪戦苦闘してます。
その中でこのサイトhttps://github.com/offpic/GUI-TFT-STM32-NT35510
を見つけ、手持ちの
4inch 800x480 Display MAR4018
と「BlackPill」で試したところ動くではないですか!気をよくしてこちらのボードでもやってみました。

表示に関しては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を
クロックコンフィグレーションは最高速の480MHzに設定。GPIOは

としました。サイトのオリジナルでは中途半端に「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の必要なソースは以下になります。
#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);
}
今回もいろいろ勉強になりました。ご利用は計画的に。
最後まで見ていただきありがとうございました。
