From 455a20ba5d99d78423ecf2b80f2f174d2b96c0e6 Mon Sep 17 00:00:00 2001 From: lucordes Date: Fri, 20 Jun 2025 16:57:49 +0200 Subject: [PATCH] add some stuff --- Core/Src/ili9341.h | 8 +- Core/Src/ili9341_touch.h | 6 +- Core/Src/main.c | 401 ++++++++++++++++++++------------------- 3 files changed, 211 insertions(+), 204 deletions(-) diff --git a/Core/Src/ili9341.h b/Core/Src/ili9341.h index b096983..ecf8bf0 100644 --- a/Core/Src/ili9341.h +++ b/Core/Src/ili9341.h @@ -18,11 +18,11 @@ #define ILI9341_SPI_PORT hspi1 extern SPI_HandleTypeDef ILI9341_SPI_PORT; -#define ILI9341_RES_Pin GPIO_PIN_7 -#define ILI9341_RES_GPIO_Port GPIOC -#define ILI9341_CS_Pin GPIO_PIN_5 +#define ILI9341_RES_Pin GPIO_PIN_3 +#define ILI9341_RES_GPIO_Port GPIOA +#define ILI9341_CS_Pin GPIO_PIN_4 #define ILI9341_CS_GPIO_Port GPIOA -#define ILI9341_DC_Pin GPIO_PIN_9 +#define ILI9341_DC_Pin GPIO_PIN_2 #define ILI9341_DC_GPIO_Port GPIOA // default orientation /* diff --git a/Core/Src/ili9341_touch.h b/Core/Src/ili9341_touch.h index 01f6b12..309da59 100644 --- a/Core/Src/ili9341_touch.h +++ b/Core/Src/ili9341_touch.h @@ -11,10 +11,10 @@ #define ILI9341_TOUCH_SPI_PORT hspi2 extern SPI_HandleTypeDef ILI9341_TOUCH_SPI_PORT; -#define ILI9341_TOUCH_IRQ_Pin GPIO_PIN_4 // Arduino D5 +#define ILI9341_TOUCH_IRQ_Pin GPIO_PIN_5 // Arduino D5 #define ILI9341_TOUCH_IRQ_GPIO_Port GPIOB -#define ILI9341_TOUCH_CS_Pin GPIO_PIN_10 // Arduino D2 -#define ILI9341_TOUCH_CS_GPIO_Port GPIOA +#define ILI9341_TOUCH_CS_Pin GPIO_PIN_6 // Arduino D2 +#define ILI9341_TOUCH_CS_GPIO_Port GPIOB // change depending on screen orientation #define ILI9341_TOUCH_SCALE_X 240 diff --git a/Core/Src/main.c b/Core/Src/main.c index 6d57e4f..3730588 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -47,15 +47,23 @@ SPI_HandleTypeDef hspi2; /* Definitions for defaultTask */ osThreadId_t defaultTaskHandle; -const osThreadAttr_t defaultTask_attributes = { .name = "defaultTask", - .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityNormal, }; +const osThreadAttr_t defaultTask_attributes = { + .name = "defaultTask", + .stack_size = 128 * 4, + .priority = (osPriority_t) osPriorityNormal, +}; /* Definitions for draw */ osThreadId_t drawHandle; -const osThreadAttr_t draw_attributes = { .name = "draw", .stack_size = 128 * 4, - .priority = (osPriority_t) osPriorityLow, }; +const osThreadAttr_t draw_attributes = { + .name = "draw", + .stack_size = 128 * 4, + .priority = (osPriority_t) osPriorityLow, +}; /* Definitions for presses */ osMessageQueueId_t pressesHandle; -const osMessageQueueAttr_t presses_attributes = { .name = "presses" }; +const osMessageQueueAttr_t presses_attributes = { + .name = "presses" +}; /* USER CODE BEGIN PV */ /* USER CODE END PV */ @@ -261,19 +269,6 @@ void GameRender() { for (int x = 0; x < snake.gamesizewidth; x++) { for (int y = 0; y <= snake.gamesizeheight; y++) { - // Creating snake's head with 'O' - // [0,0] - // (gamewidth-1)/gamewidth*320 - // (gameheight-0)/gameheigth*240 - - //[1,1] - //(gamewidth-2)/gamewidht*320 - //(gameheight-1)/gameheight*240 - - //[x,y] - //(gamewidth-x-1)/gamewidth*320 - //(gameheight-y)/gameheight*240 - if (x == snake.x && y == snake.y) ILI9341_FillRectangle((x * ILI9341_WIDTH) / ILI9341_WIDTH, (y * ILI9341_WIDTH) / ILI9341_WIDTH, @@ -299,11 +294,10 @@ void GameRender() { ILI9341_WIDTH / snake.gamesizewidth, ILI9341_HEIGHT / snake.gamesizeheight, ILI9341_GREEN); - //prTail = true; + } } - //if (!prTail) - //cout << " "; + } } @@ -314,224 +308,232 @@ void GameRender() { /* USER CODE END 0 */ /** - * @brief The application entry point. - * @retval int - */ -int main(void) { + * @brief The application entry point. + * @retval int + */ +int main(void) +{ - /* USER CODE BEGIN 1 */ + /* USER CODE BEGIN 1 */ - /* USER CODE END 1 */ + /* USER CODE END 1 */ - /* MCU Configuration--------------------------------------------------------*/ + /* MCU Configuration--------------------------------------------------------*/ - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); - /* USER CODE BEGIN Init */ + /* USER CODE BEGIN Init */ - /* USER CODE END Init */ + /* USER CODE END Init */ - /* Configure the system clock */ - SystemClock_Config(); + /* Configure the system clock */ + SystemClock_Config(); - /* USER CODE BEGIN SysInit */ + /* USER CODE BEGIN SysInit */ - /* USER CODE END SysInit */ + /* USER CODE END SysInit */ - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_SPI1_Init(); - MX_SPI2_Init(); - /* USER CODE BEGIN 2 */ + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_SPI1_Init(); + MX_SPI2_Init(); + /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ + /* USER CODE END 2 */ - /* Init scheduler */ - osKernelInitialize(); + /* Init scheduler */ + osKernelInitialize(); - /* USER CODE BEGIN RTOS_MUTEX */ + /* USER CODE BEGIN RTOS_MUTEX */ /* add mutexes, ... */ - /* USER CODE END RTOS_MUTEX */ + /* USER CODE END RTOS_MUTEX */ - /* USER CODE BEGIN RTOS_SEMAPHORES */ + /* USER CODE BEGIN RTOS_SEMAPHORES */ /* add semaphores, ... */ - /* USER CODE END RTOS_SEMAPHORES */ + /* USER CODE END RTOS_SEMAPHORES */ - /* USER CODE BEGIN RTOS_TIMERS */ + /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ - /* USER CODE END RTOS_TIMERS */ + /* USER CODE END RTOS_TIMERS */ - /* Create the queue(s) */ - /* creation of presses */ - pressesHandle = osMessageQueueNew(16, sizeof(char), &presses_attributes); + /* Create the queue(s) */ + /* creation of presses */ + pressesHandle = osMessageQueueNew (16, sizeof(char), &presses_attributes); - /* USER CODE BEGIN RTOS_QUEUES */ + /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ - /* USER CODE END RTOS_QUEUES */ + /* USER CODE END RTOS_QUEUES */ - /* Create the thread(s) */ - /* creation of defaultTask */ - defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, - &defaultTask_attributes); + /* Create the thread(s) */ + /* creation of defaultTask */ + defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); - /* creation of draw */ - drawHandle = osThreadNew(startdraw, NULL, &draw_attributes); + /* creation of draw */ + drawHandle = osThreadNew(startdraw, NULL, &draw_attributes); - /* USER CODE BEGIN RTOS_THREADS */ + /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ - /* USER CODE END RTOS_THREADS */ + /* USER CODE END RTOS_THREADS */ - /* USER CODE BEGIN RTOS_EVENTS */ + /* USER CODE BEGIN RTOS_EVENTS */ /* add events, ... */ - /* USER CODE END RTOS_EVENTS */ + /* USER CODE END RTOS_EVENTS */ - /* Start scheduler */ - osKernelStart(); + /* Start scheduler */ + osKernelStart(); - /* We should never get here as control is now taken by the scheduler */ + /* We should never get here as control is now taken by the scheduler */ - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ uint16_t a, b; ILI9341_TouchGetCoordinates(&a, &b); GameInit(); while (1) { - /* USER CODE END WHILE */ + /* USER CODE END WHILE */ - /* USER CODE BEGIN 3 */ + /* USER CODE BEGIN 3 */ } - /* USER CODE END 3 */ + /* USER CODE END 3 */ } /** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) { - RCC_OscInitTypeDef RCC_OscInitStruct = { 0 }; - RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 }; + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - /** Configure the main internal regulator output voltage - */ - __HAL_RCC_PWR_CLK_ENABLE(); - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); - /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - Error_Handler(); - } + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + 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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { - Error_Handler(); - } + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) + { + Error_Handler(); + } } /** - * @brief SPI1 Initialization Function - * @param None - * @retval None - */ -static void MX_SPI1_Init(void) { + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI1_Init(void) +{ - /* USER CODE BEGIN SPI1_Init 0 */ + /* USER CODE BEGIN SPI1_Init 0 */ - /* USER CODE END SPI1_Init 0 */ + /* USER CODE END SPI1_Init 0 */ - /* USER CODE BEGIN SPI1_Init 1 */ + /* USER CODE BEGIN SPI1_Init 1 */ - /* USER CODE END SPI1_Init 1 */ - /* SPI1 parameter configuration*/ - hspi1.Instance = SPI1; - hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_8BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLE; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi1.Init.CRCPolynomial = 10; - if (HAL_SPI_Init(&hspi1) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN SPI1_Init 2 */ + /* USER CODE END SPI1_Init 1 */ + /* SPI1 parameter configuration*/ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ - /* USER CODE END SPI1_Init 2 */ + /* USER CODE END SPI1_Init 2 */ } /** - * @brief SPI2 Initialization Function - * @param None - * @retval None - */ -static void MX_SPI2_Init(void) { + * @brief SPI2 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI2_Init(void) +{ - /* USER CODE BEGIN SPI2_Init 0 */ + /* USER CODE BEGIN SPI2_Init 0 */ - /* USER CODE END SPI2_Init 0 */ + /* USER CODE END SPI2_Init 0 */ - /* USER CODE BEGIN SPI2_Init 1 */ + /* USER CODE BEGIN SPI2_Init 1 */ - /* USER CODE END SPI2_Init 1 */ - /* SPI2 parameter configuration*/ - hspi2.Instance = SPI2; - hspi2.Init.Mode = SPI_MODE_MASTER; - hspi2.Init.Direction = SPI_DIRECTION_2LINES; - hspi2.Init.DataSize = SPI_DATASIZE_8BIT; - hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi2.Init.NSS = SPI_NSS_SOFT; - hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; - hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi2.Init.TIMode = SPI_TIMODE_DISABLE; - hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi2.Init.CRCPolynomial = 10; - if (HAL_SPI_Init(&hspi2) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN SPI2_Init 2 */ + /* USER CODE END SPI2_Init 1 */ + /* SPI2 parameter configuration*/ + hspi2.Instance = SPI2; + hspi2.Init.Mode = SPI_MODE_MASTER; + hspi2.Init.Direction = SPI_DIRECTION_2LINES; + hspi2.Init.DataSize = SPI_DATASIZE_8BIT; + hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi2.Init.NSS = SPI_NSS_SOFT; + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; + hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi2.Init.TIMode = SPI_TIMODE_DISABLE; + hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi2.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI2_Init 2 */ - /* USER CODE END SPI2_Init 2 */ + /* USER CODE END SPI2_Init 2 */ } /** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ -static void MX_GPIO_Init(void) { - /* USER CODE BEGIN MX_GPIO_Init_1 */ + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + /* USER CODE BEGIN MX_GPIO_Init_1 */ - /* USER CODE END MX_GPIO_Init_1 */ + /* USER CODE END MX_GPIO_Init_1 */ - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); - /* USER CODE BEGIN MX_GPIO_Init_2 */ + /* USER CODE BEGIN MX_GPIO_Init_2 */ - /* USER CODE END MX_GPIO_Init_2 */ + /* USER CODE END MX_GPIO_Init_2 */ } /* USER CODE BEGIN 4 */ @@ -545,13 +547,14 @@ static void MX_GPIO_Init(void) { * @retval None */ /* USER CODE END Header_StartDefaultTask */ -void StartDefaultTask(void *argument) { - /* USER CODE BEGIN 5 */ +void StartDefaultTask(void *argument) +{ + /* USER CODE BEGIN 5 */ /* Infinite loop */ for (;;) { osDelay(1); } - /* USER CODE END 5 */ + /* USER CODE END 5 */ } /* USER CODE BEGIN Header_startdraw */ @@ -561,48 +564,52 @@ void StartDefaultTask(void *argument) { * @retval None */ /* USER CODE END Header_startdraw */ -void startdraw(void *argument) { - /* USER CODE BEGIN startdraw */ +void startdraw(void *argument) +{ + /* USER CODE BEGIN startdraw */ /* Infinite loop */ for (;;) { osDelay(100); UpdateGame(); GameRender(); } - /* USER CODE END startdraw */ + /* USER CODE END startdraw */ } /** - * @brief Period elapsed callback in non blocking mode - * @note This function is called when TIM2 interrupt took place, inside - * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment - * a global variable "uwTick" used as application time base. - * @param htim : TIM handle - * @retval None - */ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { - /* USER CODE BEGIN Callback 0 */ + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM2 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim : TIM handle + * @retval None + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* USER CODE BEGIN Callback 0 */ - /* USER CODE END Callback 0 */ - if (htim->Instance == TIM2) { - HAL_IncTick(); - } - /* USER CODE BEGIN Callback 1 */ + /* USER CODE END Callback 0 */ + if (htim->Instance == TIM2) + { + HAL_IncTick(); + } + /* USER CODE BEGIN Callback 1 */ - /* USER CODE END Callback 1 */ + /* USER CODE END Callback 1 */ } /** - * @brief This function is executed in case of error occurrence. - * @retval None - */ -void Error_Handler(void) { - /* USER CODE BEGIN Error_Handler_Debug */ + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } - /* USER CODE END Error_Handler_Debug */ + /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT