From 02db101669a40d340386080c2bb4c1953c3dbe76 Mon Sep 17 00:00:00 2001 From: Flenk008 Date: Fri, 3 Mar 2023 23:51:17 +0100 Subject: New Folder for stm32 gamelogic --- GameLogic/stm32/stm32 design | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 GameLogic/stm32/stm32 design diff --git a/GameLogic/stm32/stm32 design b/GameLogic/stm32/stm32 design new file mode 100644 index 0000000..6b46af3 --- /dev/null +++ b/GameLogic/stm32/stm32 design @@ -0,0 +1,4 @@ +Pin layout stm32: + + +Pin layour FPGA: -- cgit v1.2.3 From 4cb4bfed34bb0e593f1508f4a44838cd0915a506 Mon Sep 17 00:00:00 2001 From: Flenk008 Date: Fri, 3 Mar 2023 23:56:10 +0100 Subject: Player movement x/y with collision map Player can move in x and y direction via 4 buttons Furthermore there is a tilemap included for collisions for coresponding map design --- GameLogic/stm32/main.c | 488 +++++++++++++++++++++++++++++++++++ GameLogic/stm32/main.h | 69 +++++ GameLogic/stm32/stm32f0xx_hal_conf.h | 322 +++++++++++++++++++++++ GameLogic/stm32/stm32f0xx_hal_msp.c | 190 ++++++++++++++ GameLogic/stm32/stm32f0xx_it.c | 145 +++++++++++ GameLogic/stm32/stm32f0xx_it.h | 62 +++++ GameLogic/stm32/syscalls.c | 176 +++++++++++++ GameLogic/stm32/sysmem.c | 79 ++++++ GameLogic/stm32/system_stm32f0xx.c | 247 ++++++++++++++++++ 9 files changed, 1778 insertions(+) create mode 100644 GameLogic/stm32/main.c create mode 100644 GameLogic/stm32/main.h create mode 100644 GameLogic/stm32/stm32f0xx_hal_conf.h create mode 100644 GameLogic/stm32/stm32f0xx_hal_msp.c create mode 100644 GameLogic/stm32/stm32f0xx_it.c create mode 100644 GameLogic/stm32/stm32f0xx_it.h create mode 100644 GameLogic/stm32/syscalls.c create mode 100644 GameLogic/stm32/sysmem.c create mode 100644 GameLogic/stm32/system_stm32f0xx.c diff --git a/GameLogic/stm32/main.c b/GameLogic/stm32/main.c new file mode 100644 index 0000000..97180ff --- /dev/null +++ b/GameLogic/stm32/main.c @@ -0,0 +1,488 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +SPI_HandleTypeDef hspi1; + +TIM_HandleTypeDef htim3; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_SPI1_Init(void); +static void MX_TIM3_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_SPI1_Init(); + MX_TIM3_Init(); + /* USER CODE BEGIN 2 */ + // correct byte for led control + uint16_t pos_x = 310; //0b0000 0001 0011 0110 + uint16_t pos_y = 210; + + uint8_t left = 0; + uint8_t right = 0; + uint8_t up = 0; + uint8_t down = 0; + + uint8_t tileMap[30][40] = + { + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 } + + + + }; + + int pos_x_max = 410; + int pos_y_max = 310; + int pos_x_min = 210; + int pos_y_min = 110; + uint8_t pos_x_bit[2]; + uint8_t pos_y_bit[2]; + uint8_t data_send[3]; + uint8_t led1Uit = 0b00100001 ; + uint8_t led2Uit = 0x9D ; + int tileX; + int tileY; + // int to pointer + // uint8_t * ledTest1 = &led1Aan; +// uint8_t * ledTest2 = &led2Aan; + uint8_t * ledTest3 = &led1Uit; + uint8_t * ledTest4 = &led2Uit; + + + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + // pos_x_bit[0] = 0b00000001; + // pos_x_bit[1] = 0b00110110; + + pos_x_bit[1] = pos_x & 0xff; + pos_x_bit[0] = (pos_x >> 8); + + pos_y_bit[1] = pos_y & 0xff; + pos_y_bit[0] = (pos_y >> 8); + + tileX = pos_x / 20; + + + tileY = pos_y / 16; + + + + if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == 1) + { + left++; + + } + else + { + left = 0; + } + if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == 1) + { + right++; + } + else + { + right = 0; + } + if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6) == 1) + { + up++; + } + else + { + up = 0; + } + if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == 1) + { + down++; + } + else + { + down = 0; + } + + // if(pos_x % 8 == 0 && pos_y % 8 == 0 && tileMap[tileY][tileX] == 1) + // { + + // } + // else + // { + if(left > 10) + { + if(tileMap[tileY][tileX] == 1) + { + left = 0; + } + else + { + pos_x--; + } + left = 0; + } + if(right > 10) + { + if(tileMap[tileY][tileX+1] == 1) + { + right = 0; + } + else + { + pos_x++; + } + + + right = 0; + } + + if(up > 10) + { + if(tileMap[tileY+1][tileX] == 1) + { + up = 0; + } + else + { + pos_y++; + } + up = 0; + + + + } + if(down > 10) + { + if( tileMap[tileY][tileX] == 1) + { + down = 0; + } + else + { + pos_y--; + } + + down = 0; + } + // } + + + + + data_send[0] = 0b00000000; + data_send[1] = pos_y_bit[0] ; + data_send[2] = pos_y_bit[1]; + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); + HAL_SPI_Transmit(&hspi1, data_send, 3, HAL_MAX_DELAY); //2*8 bit + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); + data_send[0] = 0b01000000; + data_send[1] = pos_x_bit[0] ; + data_send[2] = pos_x_bit[1]; + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); + HAL_SPI_Transmit(&hspi1, data_send, 3, HAL_MAX_DELAY); //2*8 bit + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); + + + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 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}; + + /** 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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + + 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) +{ + + /* USER CODE BEGIN SPI1_Init 0 */ + + /* USER CODE END SPI1_Init 0 */ + + /* 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_1LINE; + 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_16; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + +} + +/** + * @brief TIM3 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM3_Init(void) +{ + + /* USER CODE BEGIN TIM3_Init 0 */ + + /* USER CODE END TIM3_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM3_Init 1 */ + + /* USER CODE END TIM3_Init 1 */ + htim3.Instance = TIM3; + htim3.Init.Prescaler = 7999; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 65535; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM3_Init 2 */ + + /* USER CODE END TIM3_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); + + /*Configure GPIO pin : PA9 */ + GPIO_InitStruct.Pin = GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pins : PB4 PB5 PB6 PB8 */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @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 */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/GameLogic/stm32/main.h b/GameLogic/stm32/main.h new file mode 100644 index 0000000..4495405 --- /dev/null +++ b/GameLogic/stm32/main.h @@ -0,0 +1,69 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f0xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/GameLogic/stm32/stm32f0xx_hal_conf.h b/GameLogic/stm32/stm32f0xx_hal_conf.h new file mode 100644 index 0000000..02785c6 --- /dev/null +++ b/GameLogic/stm32/stm32f0xx_hal_conf.h @@ -0,0 +1,322 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f0xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F0xx_HAL_CONF_H +#define __STM32F0xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED + /*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_CAN_MODULE_ENABLED */ +/*#define HAL_CEC_MODULE_ENABLED */ +/*#define HAL_COMP_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_TSC_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_LCD_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +/*#define HAL_UART_MODULE_ENABLED */ +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +/** + * @brief In the following line adjust the External High Speed oscillator (HSE) Startup + * Timeout value + */ +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup + * Timeout value + */ +#if !defined (HSI_STARTUP_TIMEOUT) + #define HSI_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for HSI start up */ +#endif /* HSI_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator for ADC (HSI14) value. + */ +#if !defined (HSI14_VALUE) +#define HSI14_VALUE ((uint32_t)14000000) /*!< Value of the Internal High Speed oscillator for ADC in Hz. + The real value may vary depending on the variations + in voltage and temperature. */ +#endif /* HSI14_VALUE */ + +/** + * @brief Internal High Speed oscillator for USB (HSI48) value. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal High Speed oscillator for USB in Hz. + The real value may vary depending on the variations + in voltage and temperature. */ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)40000) +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSI) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +/** + * @brief Time out for LSE start up value in ms. + */ +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)3) /*!< tick interrupt priority (lowest by default) */ + /* Warning: Must be set to higher priority for HAL_Delay() */ + /* and HAL_GetTick() usage under interrupt context */ +#define USE_RTOS 0 +#define PREFETCH_ENABLE 1 +#define INSTRUCTION_CACHE_ENABLE 0 +#define DATA_CACHE_ENABLE 0 +#define USE_SPI_CRC 0U + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U /* COMP register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_TSC_REGISTER_CALLBACKS 0U /* TSC register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f0xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f0xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f0xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f0xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f0xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f0xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f0xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f0xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32f0xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f0xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f0xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f0xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f0xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f0xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f0xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f0xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f0xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f0xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f0xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f0xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32f0xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f0xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f0xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_TSC_MODULE_ENABLED + #include "stm32f0xx_hal_tsc.h" +#endif /* HAL_TSC_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f0xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f0xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f0xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F0xx_HAL_CONF_H */ + diff --git a/GameLogic/stm32/stm32f0xx_hal_msp.c b/GameLogic/stm32/stm32f0xx_hal_msp.c new file mode 100644 index 0000000..93bc303 --- /dev/null +++ b/GameLogic/stm32/stm32f0xx_hal_msp.c @@ -0,0 +1,190 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f0xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF0_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } + +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_7); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } + +} + +/** +* @brief TIM_Base MSP Initialization +* This function configures the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspInit 0 */ + + /* USER CODE END TIM3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + /* USER CODE BEGIN TIM3_MspInit 1 */ + + /* USER CODE END TIM3_MspInit 1 */ + } + +} + +/** +* @brief TIM_Base MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspDeInit 0 */ + + /* USER CODE END TIM3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM3_CLK_DISABLE(); + /* USER CODE BEGIN TIM3_MspDeInit 1 */ + + /* USER CODE END TIM3_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/GameLogic/stm32/stm32f0xx_it.c b/GameLogic/stm32/stm32f0xx_it.c new file mode 100644 index 0000000..ced8734 --- /dev/null +++ b/GameLogic/stm32/stm32f0xx_it.c @@ -0,0 +1,145 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f0xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32f0xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M0 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) + { + } + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVC_IRQn 0 */ + + /* USER CODE END SVC_IRQn 0 */ + /* USER CODE BEGIN SVC_IRQn 1 */ + + /* USER CODE END SVC_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32F0xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32f0xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/GameLogic/stm32/stm32f0xx_it.h b/GameLogic/stm32/stm32f0xx_it.h new file mode 100644 index 0000000..a3fa1b9 --- /dev/null +++ b/GameLogic/stm32/stm32f0xx_it.h @@ -0,0 +1,62 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f0xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F0xx_IT_H +#define __STM32F0xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void SVC_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F0xx_IT_H */ diff --git a/GameLogic/stm32/syscalls.c b/GameLogic/stm32/syscalls.c new file mode 100644 index 0000000..f4278b7 --- /dev/null +++ b/GameLogic/stm32/syscalls.c @@ -0,0 +1,176 @@ +/** + ****************************************************************************** + * @file syscalls.c + * @author Auto-generated by STM32CubeIDE + * @brief STM32CubeIDE Minimal System calls file + * + * For more information about which c-functions + * need which of these lowlevel functions + * please consult the Newlib libc-manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2020-2022 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Variables */ +extern int __io_putchar(int ch) __attribute__((weak)); +extern int __io_getchar(void) __attribute__((weak)); + + +char *__env[1] = { 0 }; +char **environ = __env; + + +/* Functions */ +void initialise_monitor_handles() +{ +} + +int _getpid(void) +{ + return 1; +} + +int _kill(int pid, int sig) +{ + (void)pid; + (void)sig; + errno = EINVAL; + return -1; +} + +void _exit (int status) +{ + _kill(status, -1); + while (1) {} /* Make sure we hang here */ +} + +__attribute__((weak)) int _read(int file, char *ptr, int len) +{ + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + *ptr++ = __io_getchar(); + } + + return len; +} + +__attribute__((weak)) int _write(int file, char *ptr, int len) +{ + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + __io_putchar(*ptr++); + } + return len; +} + +int _close(int file) +{ + (void)file; + return -1; +} + + +int _fstat(int file, struct stat *st) +{ + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int _isatty(int file) +{ + (void)file; + return 1; +} + +int _lseek(int file, int ptr, int dir) +{ + (void)file; + (void)ptr; + (void)dir; + return 0; +} + +int _open(char *path, int flags, ...) +{ + (void)path; + (void)flags; + /* Pretend like we always fail */ + return -1; +} + +int _wait(int *status) +{ + (void)status; + errno = ECHILD; + return -1; +} + +int _unlink(char *name) +{ + (void)name; + errno = ENOENT; + return -1; +} + +int _times(struct tms *buf) +{ + (void)buf; + return -1; +} + +int _stat(char *file, struct stat *st) +{ + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int _link(char *old, char *new) +{ + (void)old; + (void)new; + errno = EMLINK; + return -1; +} + +int _fork(void) +{ + errno = EAGAIN; + return -1; +} + +int _execve(char *name, char **argv, char **env) +{ + (void)name; + (void)argv; + (void)env; + errno = ENOMEM; + return -1; +} diff --git a/GameLogic/stm32/sysmem.c b/GameLogic/stm32/sysmem.c new file mode 100644 index 0000000..54081ac --- /dev/null +++ b/GameLogic/stm32/sysmem.c @@ -0,0 +1,79 @@ +/** + ****************************************************************************** + * @file sysmem.c + * @author Generated by STM32CubeIDE + * @brief STM32CubeIDE System Memory calls file + * + * For more information about which C functions + * need which of these lowlevel functions + * please consult the newlib libc manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2022 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include + +/** + * Pointer to the current high watermark of the heap usage + */ +static uint8_t *__sbrk_heap_end = NULL; + +/** + * @brief _sbrk() allocates memory to the newlib heap and is used by malloc + * and others from the C library + * + * @verbatim + * ############################################################################ + * # .data # .bss # newlib heap # MSP stack # + * # # # # Reserved by _Min_Stack_Size # + * ############################################################################ + * ^-- RAM start ^-- _end _estack, RAM end --^ + * @endverbatim + * + * This implementation starts allocating at the '_end' linker symbol + * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack + * The implementation considers '_estack' linker symbol to be RAM end + * NOTE: If the MSP stack, at any point during execution, grows larger than the + * reserved size, please increase the '_Min_Stack_Size'. + * + * @param incr Memory size + * @return Pointer to allocated memory + */ +void *_sbrk(ptrdiff_t incr) +{ + extern uint8_t _end; /* Symbol defined in the linker script */ + extern uint8_t _estack; /* Symbol defined in the linker script */ + extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ + const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; + const uint8_t *max_heap = (uint8_t *)stack_limit; + uint8_t *prev_heap_end; + + /* Initialize heap end at first call */ + if (NULL == __sbrk_heap_end) + { + __sbrk_heap_end = &_end; + } + + /* Protect heap from growing into the reserved MSP stack */ + if (__sbrk_heap_end + incr > max_heap) + { + errno = ENOMEM; + return (void *)-1; + } + + prev_heap_end = __sbrk_heap_end; + __sbrk_heap_end += incr; + + return (void *)prev_heap_end; +} diff --git a/GameLogic/stm32/system_stm32f0xx.c b/GameLogic/stm32/system_stm32f0xx.c new file mode 100644 index 0000000..1b0fbe5 --- /dev/null +++ b/GameLogic/stm32/system_stm32f0xx.c @@ -0,0 +1,247 @@ +/** + ****************************************************************************** + * @file system_stm32f0xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M0 Device Peripheral Access Layer System Source File. + * + * 1. This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f0xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f0xx_system + * @{ + */ + +/** @addtogroup STM32F0xx_System_Private_Includes + * @{ + */ + +#include "stm32f0xx.h" + +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_Defines + * @{ + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000) /*!< Default value of the External oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)8000000) /*!< Default value of the Internal oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSI_VALUE */ + +#if !defined (HSI48_VALUE) +#define HSI48_VALUE ((uint32_t)48000000) /*!< Default value of the HSI48 Internal oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSI48_VALUE */ +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +uint32_t SystemCoreClock = 8000000; + +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* NOTE :SystemInit(): This function is called at startup just after reset and + before branch to main program. This call is made inside + the "startup_stm32f0xx.s" file. + User can setups the default system clock (System clock source, PLL Multiplier + and Divider factors, AHB/APBx prescalers and Flash settings). + */ +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f0xx_hal_conf.h file (default value + * 8 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f0xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate (void) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0, predivfactor = 0; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + case RCC_CFGR_SWS_HSE: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + case RCC_CFGR_SWS_PLL: /* PLL used as system clock */ + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmull = RCC->CFGR & RCC_CFGR_PLLMUL; + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + pllmull = ( pllmull >> 18) + 2; + predivfactor = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1; + + if (pllsource == RCC_CFGR_PLLSRC_HSE_PREDIV) + { + /* HSE used as PLL clock source : SystemCoreClock = HSE/PREDIV * PLLMUL */ + SystemCoreClock = (HSE_VALUE/predivfactor) * pllmull; + } +#if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F091xC) || defined(STM32F098xx) + else if (pllsource == RCC_CFGR_PLLSRC_HSI48_PREDIV) + { + /* HSI48 used as PLL clock source : SystemCoreClock = HSI48/PREDIV * PLLMUL */ + SystemCoreClock = (HSI48_VALUE/predivfactor) * pllmull; + } +#endif /* STM32F042x6 || STM32F048xx || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx */ + else + { +#if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F070x6) \ + || defined(STM32F078xx) || defined(STM32F071xB) || defined(STM32F072xB) \ + || defined(STM32F070xB) || defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC) + /* HSI used as PLL clock source : SystemCoreClock = HSI/PREDIV * PLLMUL */ + SystemCoreClock = (HSI_VALUE/predivfactor) * pllmull; +#else + /* HSI used as PLL clock source : SystemCoreClock = HSI/2 * PLLMUL */ + SystemCoreClock = (HSI_VALUE >> 1) * pllmull; +#endif /* STM32F042x6 || STM32F048xx || STM32F070x6 || + STM32F071xB || STM32F072xB || STM32F078xx || STM32F070xB || + STM32F091xC || STM32F098xx || STM32F030xC */ + } + break; + default: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK clock frequency ----------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + -- cgit v1.2.3 From b4beb0e9ec4539dc99e42014dc5df0fb69c9e24c Mon Sep 17 00:00:00 2001 From: Flenk008 Date: Sat, 4 Mar 2023 00:02:38 +0100 Subject: changed to .md and added pin layout --- GameLogic/stm32/stm32 design | 4 ---- GameLogic/stm32/stm32Design.md | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) delete mode 100644 GameLogic/stm32/stm32 design create mode 100644 GameLogic/stm32/stm32Design.md diff --git a/GameLogic/stm32/stm32 design b/GameLogic/stm32/stm32 design deleted file mode 100644 index 6b46af3..0000000 --- a/GameLogic/stm32/stm32 design +++ /dev/null @@ -1,4 +0,0 @@ -Pin layout stm32: - - -Pin layour FPGA: diff --git a/GameLogic/stm32/stm32Design.md b/GameLogic/stm32/stm32Design.md new file mode 100644 index 0000000..e3adba0 --- /dev/null +++ b/GameLogic/stm32/stm32Design.md @@ -0,0 +1,16 @@ +Pin layout stm32: + +PA5 / D13: SPI clock +PA7 / D11: SPI data MOSI +PA9 / D8: SPI cs + +PB4 / D5: button 1 +PB5 / D4: button 2 +PB6 / D10: button 3 +PB8 / D15: button 4 + + +Pin layour FPGA: +JB 7: SPI clock +JB 8: SPI data +JB 9: SPI cs -- cgit v1.2.3 From cb0e65ce9e75fdfbd2150219421b278e6b190adc Mon Sep 17 00:00:00 2001 From: Flenk008 Date: Sat, 4 Mar 2023 00:02:56 +0100 Subject: Update stm32Design.md --- GameLogic/stm32/stm32Design.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/GameLogic/stm32/stm32Design.md b/GameLogic/stm32/stm32Design.md index e3adba0..2fc0cec 100644 --- a/GameLogic/stm32/stm32Design.md +++ b/GameLogic/stm32/stm32Design.md @@ -1,16 +1,16 @@ Pin layout stm32: -PA5 / D13: SPI clock -PA7 / D11: SPI data MOSI -PA9 / D8: SPI cs +PA5 / D13: SPI clock. +PA7 / D11: SPI data MOSI. +PA9 / D8: SPI cs. -PB4 / D5: button 1 -PB5 / D4: button 2 -PB6 / D10: button 3 -PB8 / D15: button 4 +PB4 / D5: button 1. +PB5 / D4: button 2. +PB6 / D10: button 3. +PB8 / D15: button 4. Pin layour FPGA: -JB 7: SPI clock -JB 8: SPI data -JB 9: SPI cs +JB 7: SPI clock. +JB 8: SPI data. +JB 9: SPI cs. -- cgit v1.2.3 From 5dd15ae43082f1898e63c97d7691cf4721d86a07 Mon Sep 17 00:00:00 2001 From: Flenk008 Date: Sat, 4 Mar 2023 00:06:22 +0100 Subject: Changed to tables --- GameLogic/stm32/stm32Design.md | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/GameLogic/stm32/stm32Design.md b/GameLogic/stm32/stm32Design.md index 2fc0cec..19f0aa3 100644 --- a/GameLogic/stm32/stm32Design.md +++ b/GameLogic/stm32/stm32Design.md @@ -1,16 +1,17 @@ -Pin layout stm32: +Pin layout -PA5 / D13: SPI clock. -PA7 / D11: SPI data MOSI. -PA9 / D8: SPI cs. +| pin STM | function | +|---------|----------| +| PA5 / D13 | SPI clock | +| PA7 / D11 | SPI MOSI | +| PA9 / D8 | SPI cs | +| PB4 / D5 | button 1 | +| PB5 / D4 | button 2 | +| PB6 / D10 | button 3 | +| PB8 / D15 | button 4 | -PB4 / D5: button 1. -PB5 / D4: button 2. -PB6 / D10: button 3. -PB8 / D15: button 4. - - -Pin layour FPGA: -JB 7: SPI clock. -JB 8: SPI data. -JB 9: SPI cs. +| pin FPGA | function | +|---------|----------| +| JB 7 | SPI clock | +| JB 8 | SPI data | +| JB 9 | SPI cs | -- cgit v1.2.3 From b82afe9a241fc61c9b4cd64676c3ed804e240ae1 Mon Sep 17 00:00:00 2001 From: Flenk008 Date: Sat, 4 Mar 2023 00:14:50 +0100 Subject: Cleaned main.c --- GameLogic/stm32/main.c | 234 ++++++++++++++++++++++--------------------------- 1 file changed, 103 insertions(+), 131 deletions(-) diff --git a/GameLogic/stm32/main.c b/GameLogic/stm32/main.c index 97180ff..edabde5 100644 --- a/GameLogic/stm32/main.c +++ b/GameLogic/stm32/main.c @@ -138,22 +138,14 @@ int main(void) }; - int pos_x_max = 410; - int pos_y_max = 310; - int pos_x_min = 210; - int pos_y_min = 110; uint8_t pos_x_bit[2]; uint8_t pos_y_bit[2]; uint8_t data_send[3]; - uint8_t led1Uit = 0b00100001 ; - uint8_t led2Uit = 0x9D ; + int tileX; int tileY; - // int to pointer - // uint8_t * ledTest1 = &led1Aan; -// uint8_t * ledTest2 = &led2Aan; - uint8_t * ledTest3 = &led1Uit; - uint8_t * ledTest4 = &led2Uit; + + @@ -163,134 +155,114 @@ int main(void) /* USER CODE BEGIN WHILE */ while (1) { - // pos_x_bit[0] = 0b00000001; - // pos_x_bit[1] = 0b00110110; - - pos_x_bit[1] = pos_x & 0xff; - pos_x_bit[0] = (pos_x >> 8); - pos_y_bit[1] = pos_y & 0xff; - pos_y_bit[0] = (pos_y >> 8); + //shift int into 2 8bit u_int + pos_x_bit[1] = pos_x & 0xff; + pos_x_bit[0] = (pos_x >> 8); - tileX = pos_x / 20; + pos_y_bit[1] = pos_y & 0xff; + pos_y_bit[0] = (pos_y >> 8); + // simplify coor for tilemap + tileX = pos_x / 20; + tileY = pos_y / 16; - tileY = pos_y / 16; - - - if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == 1) - { + //read buttons 4 times + if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == 1) + { left++; - - } - else - { - left = 0; - } - if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == 1) - { - right++; - } - else - { - right = 0; - } - if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6) == 1) - { - up++; - } - else - { - up = 0; - } - if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == 1) - { - down++; - } - else - { - down = 0; - } - - // if(pos_x % 8 == 0 && pos_y % 8 == 0 && tileMap[tileY][tileX] == 1) - // { - - // } - // else - // { - if(left > 10) - { - if(tileMap[tileY][tileX] == 1) - { - left = 0; - } - else - { - pos_x--; - } - left = 0; - } - if(right > 10) - { - if(tileMap[tileY][tileX+1] == 1) - { - right = 0; - } - else - { - pos_x++; - } - - - right = 0; - } - - if(up > 10) - { - if(tileMap[tileY+1][tileX] == 1) - { - up = 0; - } - else - { - pos_y++; - } - up = 0; - - - - } - if(down > 10) + } + else + { + left = 0; + } + if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == 1) { - if( tileMap[tileY][tileX] == 1) - { - down = 0; - } - else - { - pos_y--; - } - - down = 0; + right++; } - // } - - - - - data_send[0] = 0b00000000; - data_send[1] = pos_y_bit[0] ; - data_send[2] = pos_y_bit[1]; - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); - HAL_SPI_Transmit(&hspi1, data_send, 3, HAL_MAX_DELAY); //2*8 bit - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); - data_send[0] = 0b01000000; - data_send[1] = pos_x_bit[0] ; - data_send[2] = pos_x_bit[1]; - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); - HAL_SPI_Transmit(&hspi1, data_send, 3, HAL_MAX_DELAY); //2*8 bit - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); + else + { + right = 0; + } + if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6) == 1) + { + up++; + } + else + { + up = 0; + } + if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == 1) + { + down++; + } + else + { + down = 0; + } + // compare position x/y with tilemap for collision + if(left > 10) + { + if(tileMap[tileY][tileX] == 1) + { + left = 0; + } + else + { + pos_x--; + } + left = 0; + } + if(right > 10) + { + if(tileMap[tileY][tileX+1] == 1) + { + right = 0; + } + else + { + pos_x++; + } + right = 0; + } + if(up > 10) + { + if(tileMap[tileY+1][tileX] == 1) + { + up = 0; + } + else + { + pos_y++; + } + up = 0; + } + if(down > 10) + { + if( tileMap[tileY][tileX] == 1) + { + down = 0; + } + else + { + pos_y--; + } + down = 0; + } + // send data via SPI + data_send[0] = 0b00000000; // first byte is address + data_send[1] = pos_y_bit[0] ; + data_send[2] = pos_y_bit[1]; + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); + HAL_SPI_Transmit(&hspi1, data_send, 3, HAL_MAX_DELAY); //3*8 bit + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); + data_send[0] = 0b01000000; // first byte is address + data_send[1] = pos_x_bit[0] ; + data_send[2] = pos_x_bit[1]; + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); + HAL_SPI_Transmit(&hspi1, data_send, 3, HAL_MAX_DELAY); //3*8 bit + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); /* USER CODE END WHILE */ -- cgit v1.2.3 From 5a30ce4f44b97e2514093fe716db44ee4c9ea420 Mon Sep 17 00:00:00 2001 From: Flenk008 Date: Thu, 9 Mar 2023 20:39:44 +0100 Subject: Update stm32Design.md --- GameLogic/stm32/stm32Design.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/GameLogic/stm32/stm32Design.md b/GameLogic/stm32/stm32Design.md index 19f0aa3..f4569d2 100644 --- a/GameLogic/stm32/stm32Design.md +++ b/GameLogic/stm32/stm32Design.md @@ -15,3 +15,19 @@ Pin layout | JB 7 | SPI clock | | JB 8 | SPI data | | JB 9 | SPI cs | + + + +constraints: + +set_property PACKAGE_PIN A15 [get_ports clkSPI] + +set_property PACKAGE_PIN C15 [get_ports csSPI] + +set_property PACKAGE_PIN A17 [get_ports dataSPI] + +set_property IOSTANDARD LVCMOS33 [get_ports dataSPI] + +set_property IOSTANDARD LVCMOS33 [get_ports csSPI] + +set_property IOSTANDARD LVCMOS33 [get_ports clkSPI] . -- cgit v1.2.3 From 2983fd4fba208b3039be753c80d17804eb4a123e Mon Sep 17 00:00:00 2001 From: Flenk008 Date: Thu, 9 Mar 2023 20:43:36 +0100 Subject: Add files via upload Updated with functions --- GameLogic/stm32/main.c | 392 ++++++++++++++++++++++++++++++------------------- 1 file changed, 245 insertions(+), 147 deletions(-) diff --git a/GameLogic/stm32/main.c b/GameLogic/stm32/main.c index edabde5..666992f 100644 --- a/GameLogic/stm32/main.c +++ b/GameLogic/stm32/main.c @@ -21,7 +21,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ - +#include /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -45,6 +45,58 @@ TIM_HandleTypeDef htim3; /* USER CODE BEGIN PV */ +static int8_t buttonDPAD[] = {0,0,0,0}; //1left 2right 3down 4up + +struct playerData{ + uint16_t posX; + uint16_t posY; + uint8_t radius; + uint8_t rotation; //45 degrees steps 0 == right 2 == down 4 == left 6 == up + uint8_t directionX; //direction where its looking at in case no input; + int8_t speed; //10 default L/R MODifier + bool inAir; + +}; + +struct playerData player1; + +uint8_t tileMap[30][40] = + { + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 } + + + + }; + /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -53,12 +105,15 @@ static void MX_GPIO_Init(void); static void MX_SPI1_Init(void); static void MX_TIM3_Init(void); /* USER CODE BEGIN PFP */ - +void buttonRead(); +void playerMovement(); +void sendData(uint8_t, uint16_t); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ + /* USER CODE END 0 */ /** @@ -93,50 +148,15 @@ int main(void) MX_TIM3_Init(); /* USER CODE BEGIN 2 */ // correct byte for led control - uint16_t pos_x = 310; //0b0000 0001 0011 0110 - uint16_t pos_y = 210; + uint16_t pos_x; //0b0000 0001 0011 0110 + uint16_t pos_y; uint8_t left = 0; uint8_t right = 0; uint8_t up = 0; uint8_t down = 0; - uint8_t tileMap[30][40] = - { - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 } - - - }; uint8_t pos_x_bit[2]; uint8_t pos_y_bit[2]; @@ -144,11 +164,17 @@ int main(void) int tileX; int tileY; - - - - - +// struct playerData player1; + //int buttons[] = {GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_8}; // 1 left // 2 right // 3 up // 4 down + +/// init struct + player1.posX = 31000; //0b0000 0001 0011 0110 + player1.posY = 21000; + player1.radius = 8; + player1.speed = 1; + player1.directionX = 1; + player1.rotation = 8; + player1.inAir = false; /* USER CODE END 2 */ /* Infinite loop */ @@ -156,113 +182,19 @@ int main(void) while (1) { - //shift int into 2 8bit u_int - pos_x_bit[1] = pos_x & 0xff; - pos_x_bit[0] = (pos_x >> 8); - pos_y_bit[1] = pos_y & 0xff; - pos_y_bit[0] = (pos_y >> 8); - // simplify coor for tilemap - tileX = pos_x / 20; - tileY = pos_y / 16; + buttonRead(); + playerMovement(); - //read buttons 4 times - if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == 1) - { - left++; - } - else - { - left = 0; - } - if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == 1) - { - right++; - } - else - { - right = 0; - } - if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6) == 1) - { - up++; - } - else - { - up = 0; - } - if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == 1) - { - down++; - } - else - { - down = 0; - } - // compare position x/y with tilemap for collision - if(left > 10) - { - if(tileMap[tileY][tileX] == 1) - { - left = 0; - } - else - { - pos_x--; - } - left = 0; - } - if(right > 10) - { - if(tileMap[tileY][tileX+1] == 1) - { - right = 0; - } - else - { - pos_x++; - } - right = 0; - } - if(up > 10) - { - if(tileMap[tileY+1][tileX] == 1) - { - up = 0; - } - else - { - pos_y++; - } - up = 0; - } - if(down > 10) - { - if( tileMap[tileY][tileX] == 1) - { - down = 0; - } - else - { - pos_y--; - } - down = 0; - } - // send data via SPI - data_send[0] = 0b00000000; // first byte is address - data_send[1] = pos_y_bit[0] ; - data_send[2] = pos_y_bit[1]; - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); - HAL_SPI_Transmit(&hspi1, data_send, 3, HAL_MAX_DELAY); //3*8 bit - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); - data_send[0] = 0b01000000; // first byte is address - data_send[1] = pos_x_bit[0] ; - data_send[2] = pos_x_bit[1]; - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); - HAL_SPI_Transmit(&hspi1, data_send, 3, HAL_MAX_DELAY); //3*8 bit - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); + + // send data via SPI //adjust map size + pos_x = player1.posX / 100; + pos_y = player1.posY / 100; + + sendData(0b01000000,pos_x); + sendData(0b00000000,pos_y); /* USER CODE END WHILE */ @@ -424,7 +356,173 @@ static void MX_GPIO_Init(void) } /* USER CODE BEGIN 4 */ +void sendData(uint8_t address, uint16_t data) +{ + uint8_t bitData[3]; + bitData[2] = data & 0xff; + bitData[1] = (data >> 8); + bitData[0] = address; // first byte is address + + + + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); + HAL_SPI_Transmit(&hspi1, bitData, 3, 100); //2*8 bit data + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); + +} + +/* +#define GPIO_PIN_0 ((uint16_t)0x0001U) Pin 0 selected +#define GPIO_PIN_1 ((uint16_t)0x0002U) Pin 1 selected +#define GPIO_PIN_2 ((uint16_t)0x0004U) Pin 2 selected +#define GPIO_PIN_3 ((uint16_t)0x0008U) Pin 3 selected +#define GPIO_PIN_4 ((uint16_t)0x0010U) Pin 4 selected +#define GPIO_PIN_5 ((uint16_t)0x0020U) Pin 5 selected +#define GPIO_PIN_6 ((uint16_t)0x0040U) Pin 6 selected +#define GPIO_PIN_7 ((uint16_t)0x0080U) Pin 7 selected +#define GPIO_PIN_8 ((uint16_t)0x0100U) Pin 8 selected +#define GPIO_PIN_9 ((uint16_t)0x0200U) Pin 9 selected +#define GPIO_PIN_10 ((uint16_t)0x0400U) Pin 10 selected +#define GPIO_PIN_11 ((uint16_t)0x0800U) Pin 11 selected +#define GPIO_PIN_12 ((uint16_t)0x1000U) Pin 12 selected +#define GPIO_PIN_13 ((uint16_t)0x2000U) Pin 13 selected +#define GPIO_PIN_14 ((uint16_t)0x4000U) Pin 14 selected +#define GPIO_PIN_15 ((uint16_t)0x8000U) Pin 15 selected +#define GPIO_PIN_All ((uint16_t)0xFFFFU) All pins selected +*/ + +void buttonRead() +{ + //int buttons[] = {GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_8}; // 1 left // 2 right // 3 down // 4 up 8-6-4-5 + uint16_t buttons[] = {0x0100U,0x0040U,0x0010U,0x0020U}; // 1 left // 2 right // 3 down // 4 up + + for(int i = 0; i < 4; i++) + { + if(HAL_GPIO_ReadPin(GPIOB, buttons[i]) == 1) + { + if((i+2) % 2 == 0) + { + buttonDPAD[i] = 1; + } + else + { + buttonDPAD[i] = -1; + } + } + else + { + buttonDPAD[i] = 0; + } + } +} + +void playerMovement() +{ + + int8_t directionX = 0; // -1 = L || 1 == R + int8_t directionY = 0; // -1 = D || 1 == U + + uint8_t i,j; + uint8_t rotation = 0; // 0-7 + //temp var for testing + + + + // direction calc + directionX = buttonDPAD[0] + buttonDPAD[1]; + directionY = buttonDPAD[2] + buttonDPAD[3]; + + //rotation calc + for(i = -1; i < 2;i++) + { + for(j = -1; j < 2; j++) + { + if(directionX == i) + { + if(directionY == j) + { + if(i != 0 && j != 0) //dont update when player idle + { + player1.rotation = rotation; + } + } + } + rotation++; + } + } + //direction calc + if(directionX != 0) //update direction if player is not idle + { + player1.directionX = directionX; + } + //collision map x-axis + + //tile calc including radius and direction for background coliision + + uint16_t tileColX; + uint16_t tileColY = ( player1.posY / 100) / 16; ; + + // remaining space between grid and exact + uint8_t modTileX; + uint8_t modTileY; + + + + if(player1.inAir == false && directionX != 0) + { + if(directionX == 1) + { + tileColX = ( ( player1.posX / 100) + player1.radius ) / 20; + modTileX = ( player1.posX + ( 100 * player1.radius ) ) % 2000; + } + else if(directionX == -1) + { + tileColX = ( ( player1.posX / 100) - player1.radius ) / 20; + modTileX = ( player1.posX - ( 100 * player1.radius ) ) % 2000; + } + + if(tileMap[tileColY][tileColX + directionX] != 1) + { + player1.posX = player1.posX + (directionX * player1.speed); // NEW x set + } + + else if(tileMap[tileColY][tileColX + directionX] == 1) + { + if(modTileX < player1.speed) + { + player1.posX = player1.posX + (directionX * modTileX); // NEW x set + } + else + { + player1.posX = player1.posX + (directionX * player1.speed); // NEW x set + } + } + + } + else //if in air different all borders have to be checked + { + + } + + //collision map floor (y-axis) (falling) + // if falling no jump press (implement) + /* + tileColY = (( player1.posY / 100) + player1.radius) / 16; //bottom of player box + modTileY = 1; + if(tileMap[tileColY+1][tileColX] != 1) //rework after jumping + { + player1.posY = player1.posY + 5 ;// NEW y set //makew var gravity + //playerStat = falling; //for later use of graphics/sound + } + */ + //else if(tileMap[]) + + + + + +} /* USER CODE END 4 */ /** -- cgit v1.2.3 From eb3a6a29ff9ed83a661588bd584e2fb9c9fada92 Mon Sep 17 00:00:00 2001 From: Flenk008 Date: Thu, 9 Mar 2023 20:43:56 +0100 Subject: Add files via upload --- GameLogic/vhdl/cnts.xdc | 72 ++++++++++++++++++++++++++++ GameLogic/vhdl/constraints.txt | 6 +++ GameLogic/vhdl/spiSlave.vhd | 105 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 GameLogic/vhdl/cnts.xdc create mode 100644 GameLogic/vhdl/constraints.txt create mode 100644 GameLogic/vhdl/spiSlave.vhd diff --git a/GameLogic/vhdl/cnts.xdc b/GameLogic/vhdl/cnts.xdc new file mode 100644 index 0000000..b8c0604 --- /dev/null +++ b/GameLogic/vhdl/cnts.xdc @@ -0,0 +1,72 @@ +set_property PACKAGE_PIN W5 [get_ports clk100] +set_property PACKAGE_PIN P19 [get_ports hsync] +set_property PACKAGE_PIN R19 [get_ports vsync] +set_property PACKAGE_PIN N18 [get_ports {blue[3]}] +set_property PACKAGE_PIN L18 [get_ports {blue[2]}] +set_property PACKAGE_PIN K18 [get_ports {blue[1]}] +set_property PACKAGE_PIN J18 [get_ports {blue[0]}] +set_property PACKAGE_PIN J17 [get_ports {green[3]}] +set_property PACKAGE_PIN H17 [get_ports {green[2]}] +set_property PACKAGE_PIN G17 [get_ports {green[1]}] +set_property PACKAGE_PIN D17 [get_ports {green[0]}] +set_property PACKAGE_PIN G19 [get_ports {red[3]}] +set_property PACKAGE_PIN H19 [get_ports {red[2]}] +set_property PACKAGE_PIN J19 [get_ports {red[1]}] +set_property PACKAGE_PIN N19 [get_ports {red[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports clk100] +set_property IOSTANDARD LVCMOS33 [get_ports hsync] +set_property IOSTANDARD LVCMOS33 [get_ports vsync] +set_property IOSTANDARD LVCMOS33 [get_ports {blue[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {blue[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {blue[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {blue[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {green[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {green[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {green[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {red[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {red[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {red[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {red[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {green[0]}] + +set_property PACKAGE_PIN T18 [get_ports resetButton] +set_property IOSTANDARD LVCMOS33 [get_ports resetButton] + +set_property PACKAGE_PIN A15 [get_ports clkSPI] +set_property PACKAGE_PIN C15 [get_ports csSPI] +set_property PACKAGE_PIN A17 [get_ports dataSPI] +set_property IOSTANDARD LVCMOS33 [get_ports dataSPI] +set_property IOSTANDARD LVCMOS33 [get_ports csSPI] +set_property IOSTANDARD LVCMOS33 [get_ports clkSPI] +set_property PACKAGE_PIN L1 [get_ports {led[15]}] +set_property PACKAGE_PIN P1 [get_ports {led[14]}] +set_property PACKAGE_PIN N3 [get_ports {led[13]}] +set_property PACKAGE_PIN P3 [get_ports {led[12]}] +set_property PACKAGE_PIN U3 [get_ports {led[11]}] +set_property PACKAGE_PIN W3 [get_ports {led[10]}] +set_property PACKAGE_PIN V3 [get_ports {led[9]}] +set_property PACKAGE_PIN V13 [get_ports {led[8]}] +set_property PACKAGE_PIN V14 [get_ports {led[7]}] +set_property PACKAGE_PIN U14 [get_ports {led[6]}] +set_property PACKAGE_PIN U15 [get_ports {led[5]}] +set_property PACKAGE_PIN W18 [get_ports {led[4]}] +set_property PACKAGE_PIN V19 [get_ports {led[3]}] +set_property PACKAGE_PIN U19 [get_ports {led[2]}] +set_property PACKAGE_PIN E19 [get_ports {led[1]}] +set_property PACKAGE_PIN U16 [get_ports {led[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[8]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[9]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[10]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[11]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[12]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[13]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[14]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led[15]}] diff --git a/GameLogic/vhdl/constraints.txt b/GameLogic/vhdl/constraints.txt new file mode 100644 index 0000000..f254cdd --- /dev/null +++ b/GameLogic/vhdl/constraints.txt @@ -0,0 +1,6 @@ +set_property PACKAGE_PIN A15 [get_ports clkSPI] +set_property PACKAGE_PIN C15 [get_ports csSPI] +set_property PACKAGE_PIN A17 [get_ports dataSPI] +set_property IOSTANDARD LVCMOS33 [get_ports dataSPI] +set_property IOSTANDARD LVCMOS33 [get_ports csSPI] +set_property IOSTANDARD LVCMOS33 [get_ports clkSPI] \ No newline at end of file diff --git a/GameLogic/vhdl/spiSlave.vhd b/GameLogic/vhdl/spiSlave.vhd new file mode 100644 index 0000000..7cf3e63 --- /dev/null +++ b/GameLogic/vhdl/spiSlave.vhd @@ -0,0 +1,105 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 15.02.2023 21:09:16 +-- Design Name: +-- Module Name: top - Behavioral +-- Project Name: +-- Target Devices: +-- Tool Versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- + + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; + +-- Uncomment the following library declaration if using +-- arithmetic functions with Signed or Unsigned values +use IEEE.NUMERIC_STD.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; +-- Uncomment the following library declaration if instantiating +-- any Xilinx leaf cells in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity spiSlave is + Port ( clkBoard : in std_logic; -- clock basys3 100MHz + clkSPI : in std_logic; -- incoming clock of SPI + dataSPI : in std_logic; -- incoming data of SPI + csSPI : in std_logic; -- incoming select of SPI + dataRead : out std_logic_vector(23 downto 0) := (others => '0') -- data read + + ); +end spiSlave; + +architecture Behavioral of spiSlave is + signal PulseFF0,PulseFF1,PulseFF2,PulseFF3 : std_logic := '0'; -- signal for metastability synchronizer of clk SPI + signal dataFF0,dataFF1,dataFF2,dataFF3 : std_logic := '0'; -- signal for metastability synchronizer of data SPI + signal ssFF0,ssFF1,ssFF2,ssFF3 : std_logic := '0'; -- signal for metastability synchronizer of slave select SPI + + signal data : std_logic_vector(23 downto 0) := (others => '0'); -- signal to store incomming data of dataSPI (2x 8bit) + signal counter : integer := 23; --counter for data position + signal enable : std_logic := '0'; -- enable signal if slave is selected +begin + + process (clkBoard) + begin + + if rising_edge(clkBoard) then + -- flip flop for clk SPI to synchronise a + PulseFF0 <= clkSPI; + PulseFF1 <= PulseFF0; + PulseFF2 <= PulseFF1; + PulseFF3 <= PulseFF2; + -- flip flop for data SPI to synchronise + dataFF0 <= dataSPI; + dataFF1 <= dataFF0; + dataFF2 <= dataFF1; + dataFF3 <= dataFF2; + -- flip flop for slave select SPI to synchronise + ssFF0 <= csSPI; + ssFF1 <= ssFF0; + ssFF2 <= ssFF1; + ssFF3 <= ssFF2; + -- check if slave select signal has falling edge (slave is selected by master) + if(ssFF3 = '1' and ssFF2 = '0') then + --reset counter if true + counter <= 23; + --disable data read if rising edge (slave is not selected) + elsif (ssFF3 = '0' and ssFF2 = '1') then + enable <= '0'; + end if; + --check if synchronised slave select signal is falling edge or data read is enabled + if(ssFF3 = '1' and ssFF2 = '0') or enable = '1' then + enable <= '1'; --enable data read + if (PulseFF3 = '0' and PulseFF2 = '1') then -- check for rising edge of clk SPI + if counter > -1 then + counter <= counter - 1; + -- data transfer into vector + data(counter) <= dataFF3; + end if; + end if; + --check if counter is done + if counter = -1 then + counter <= 23; --reset counter + dataRead <= data; + end if; + elsif (enable = '0') then + --dataRead <= data; + + end if; + + end if; + + end process; + +end Behavioral; -- cgit v1.2.3 From c6563a099ce05d9291a0c27fdbab3ffd9efddc48 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Fri, 10 Mar 2023 12:26:33 +0100 Subject: initial merge of #26 --- GameLogic/stm32/main.c | 558 ----------------------------------- GameLogic/stm32/main.h | 69 ----- GameLogic/stm32/stm32Design.md | 33 --- GameLogic/stm32/stm32f0xx_hal_conf.h | 322 -------------------- GameLogic/stm32/stm32f0xx_hal_msp.c | 190 ------------ GameLogic/stm32/stm32f0xx_it.c | 145 --------- GameLogic/stm32/stm32f0xx_it.h | 62 ---- GameLogic/stm32/syscalls.c | 176 ----------- GameLogic/stm32/sysmem.c | 79 ----- GameLogic/stm32/system_stm32f0xx.c | 247 ---------------- GameLogic/vhdl/cnts.xdc | 72 ----- GameLogic/vhdl/constraints.txt | 6 - GameLogic/vhdl/spiSlave.vhd | 105 ------- basys3/basys3.srcs/io.xdc | 6 + basys3/basys3.srcs/top.vhd | 105 +++++++ pinout.md | 33 +++ src/ds.c | 15 + src/ds.mk | 3 +- src/main.c | 247 +++++++++++++++- src/ppu/stm.c | 4 + src/stm32.mk | 30 +- src/stm32/setup.c | 197 +++++++++++++ src/stm32/setup.h | 24 ++ src/stm32/stm32f0xx_hal_conf.h | 16 +- 24 files changed, 650 insertions(+), 2094 deletions(-) delete mode 100644 GameLogic/stm32/main.c delete mode 100644 GameLogic/stm32/main.h delete mode 100644 GameLogic/stm32/stm32Design.md delete mode 100644 GameLogic/stm32/stm32f0xx_hal_conf.h delete mode 100644 GameLogic/stm32/stm32f0xx_hal_msp.c delete mode 100644 GameLogic/stm32/stm32f0xx_it.c delete mode 100644 GameLogic/stm32/stm32f0xx_it.h delete mode 100644 GameLogic/stm32/syscalls.c delete mode 100644 GameLogic/stm32/sysmem.c delete mode 100644 GameLogic/stm32/system_stm32f0xx.c delete mode 100644 GameLogic/vhdl/cnts.xdc delete mode 100644 GameLogic/vhdl/constraints.txt delete mode 100644 GameLogic/vhdl/spiSlave.vhd create mode 100644 basys3/basys3.srcs/io.xdc create mode 100644 basys3/basys3.srcs/top.vhd create mode 100644 pinout.md create mode 100644 src/ds.c create mode 100644 src/ppu/stm.c create mode 100644 src/stm32/setup.c create mode 100644 src/stm32/setup.h diff --git a/GameLogic/stm32/main.c b/GameLogic/stm32/main.c deleted file mode 100644 index 666992f..0000000 --- a/GameLogic/stm32/main.c +++ /dev/null @@ -1,558 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @attention - * - * Copyright (c) 2023 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -#include -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ - -/* USER CODE END PTD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -SPI_HandleTypeDef hspi1; - -TIM_HandleTypeDef htim3; - -/* USER CODE BEGIN PV */ - -static int8_t buttonDPAD[] = {0,0,0,0}; //1left 2right 3down 4up - -struct playerData{ - uint16_t posX; - uint16_t posY; - uint8_t radius; - uint8_t rotation; //45 degrees steps 0 == right 2 == down 4 == left 6 == up - uint8_t directionX; //direction where its looking at in case no input; - int8_t speed; //10 default L/R MODifier - bool inAir; - -}; - -struct playerData player1; - -uint8_t tileMap[30][40] = - { - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 } - - - - }; - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -static void MX_GPIO_Init(void); -static void MX_SPI1_Init(void); -static void MX_TIM3_Init(void); -/* USER CODE BEGIN PFP */ -void buttonRead(); -void playerMovement(); -void sendData(uint8_t, uint16_t); -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - - -/* USER CODE END 0 */ - -/** - * @brief The application entry point. - * @retval int - */ -int main(void) -{ - /* USER CODE BEGIN 1 */ - - /* USER CODE END 1 */ - - /* MCU Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* Configure the system clock */ - SystemClock_Config(); - - /* USER CODE BEGIN SysInit */ - - /* USER CODE END SysInit */ - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_SPI1_Init(); - MX_TIM3_Init(); - /* USER CODE BEGIN 2 */ - // correct byte for led control - uint16_t pos_x; //0b0000 0001 0011 0110 - uint16_t pos_y; - - uint8_t left = 0; - uint8_t right = 0; - uint8_t up = 0; - uint8_t down = 0; - - - - uint8_t pos_x_bit[2]; - uint8_t pos_y_bit[2]; - uint8_t data_send[3]; - - int tileX; - int tileY; -// struct playerData player1; - //int buttons[] = {GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_8}; // 1 left // 2 right // 3 up // 4 down - -/// init struct - player1.posX = 31000; //0b0000 0001 0011 0110 - player1.posY = 21000; - player1.radius = 8; - player1.speed = 1; - player1.directionX = 1; - player1.rotation = 8; - player1.inAir = false; - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - while (1) - { - - - - - buttonRead(); - playerMovement(); - - - // send data via SPI //adjust map size - pos_x = player1.posX / 100; - pos_y = player1.posY / 100; - - sendData(0b01000000,pos_x); - sendData(0b00000000,pos_y); - - - /* USER CODE END WHILE */ - - /* USER CODE BEGIN 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}; - - /** 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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; - - 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) -{ - - /* USER CODE BEGIN SPI1_Init 0 */ - - /* USER CODE END SPI1_Init 0 */ - - /* 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_1LINE; - 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_16; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLE; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi1.Init.CRCPolynomial = 7; - hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - if (HAL_SPI_Init(&hspi1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN SPI1_Init 2 */ - - /* USER CODE END SPI1_Init 2 */ - -} - -/** - * @brief TIM3 Initialization Function - * @param None - * @retval None - */ -static void MX_TIM3_Init(void) -{ - - /* USER CODE BEGIN TIM3_Init 0 */ - - /* USER CODE END TIM3_Init 0 */ - - TIM_ClockConfigTypeDef sClockSourceConfig = {0}; - TIM_MasterConfigTypeDef sMasterConfig = {0}; - - /* USER CODE BEGIN TIM3_Init 1 */ - - /* USER CODE END TIM3_Init 1 */ - htim3.Instance = TIM3; - htim3.Init.Prescaler = 7999; - htim3.Init.CounterMode = TIM_COUNTERMODE_UP; - htim3.Init.Period = 65535; - htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_Base_Init(&htim3) != HAL_OK) - { - Error_Handler(); - } - sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; - if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM3_Init 2 */ - - /* USER CODE END TIM3_Init 2 */ - -} - -/** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ -static void MX_GPIO_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); - - /*Configure GPIO pin : PA9 */ - GPIO_InitStruct.Pin = GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /*Configure GPIO pins : PB4 PB5 PB6 PB8 */ - GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_8; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - -} - -/* USER CODE BEGIN 4 */ -void sendData(uint8_t address, uint16_t data) -{ - uint8_t bitData[3]; - bitData[2] = data & 0xff; - bitData[1] = (data >> 8); - bitData[0] = address; // first byte is address - - - - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); - HAL_SPI_Transmit(&hspi1, bitData, 3, 100); //2*8 bit data - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); - -} - - -/* -#define GPIO_PIN_0 ((uint16_t)0x0001U) Pin 0 selected -#define GPIO_PIN_1 ((uint16_t)0x0002U) Pin 1 selected -#define GPIO_PIN_2 ((uint16_t)0x0004U) Pin 2 selected -#define GPIO_PIN_3 ((uint16_t)0x0008U) Pin 3 selected -#define GPIO_PIN_4 ((uint16_t)0x0010U) Pin 4 selected -#define GPIO_PIN_5 ((uint16_t)0x0020U) Pin 5 selected -#define GPIO_PIN_6 ((uint16_t)0x0040U) Pin 6 selected -#define GPIO_PIN_7 ((uint16_t)0x0080U) Pin 7 selected -#define GPIO_PIN_8 ((uint16_t)0x0100U) Pin 8 selected -#define GPIO_PIN_9 ((uint16_t)0x0200U) Pin 9 selected -#define GPIO_PIN_10 ((uint16_t)0x0400U) Pin 10 selected -#define GPIO_PIN_11 ((uint16_t)0x0800U) Pin 11 selected -#define GPIO_PIN_12 ((uint16_t)0x1000U) Pin 12 selected -#define GPIO_PIN_13 ((uint16_t)0x2000U) Pin 13 selected -#define GPIO_PIN_14 ((uint16_t)0x4000U) Pin 14 selected -#define GPIO_PIN_15 ((uint16_t)0x8000U) Pin 15 selected -#define GPIO_PIN_All ((uint16_t)0xFFFFU) All pins selected -*/ - -void buttonRead() -{ - //int buttons[] = {GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_8}; // 1 left // 2 right // 3 down // 4 up 8-6-4-5 - uint16_t buttons[] = {0x0100U,0x0040U,0x0010U,0x0020U}; // 1 left // 2 right // 3 down // 4 up - - for(int i = 0; i < 4; i++) - { - if(HAL_GPIO_ReadPin(GPIOB, buttons[i]) == 1) - { - if((i+2) % 2 == 0) - { - buttonDPAD[i] = 1; - } - else - { - buttonDPAD[i] = -1; - } - } - else - { - buttonDPAD[i] = 0; - } - } -} - -void playerMovement() -{ - - int8_t directionX = 0; // -1 = L || 1 == R - int8_t directionY = 0; // -1 = D || 1 == U - - uint8_t i,j; - uint8_t rotation = 0; // 0-7 - //temp var for testing - - - - // direction calc - directionX = buttonDPAD[0] + buttonDPAD[1]; - directionY = buttonDPAD[2] + buttonDPAD[3]; - - //rotation calc - for(i = -1; i < 2;i++) - { - for(j = -1; j < 2; j++) - { - if(directionX == i) - { - if(directionY == j) - { - if(i != 0 && j != 0) //dont update when player idle - { - player1.rotation = rotation; - } - } - } - rotation++; - } - } - //direction calc - if(directionX != 0) //update direction if player is not idle - { - player1.directionX = directionX; - } - //collision map x-axis - - //tile calc including radius and direction for background coliision - - uint16_t tileColX; - uint16_t tileColY = ( player1.posY / 100) / 16; ; - - // remaining space between grid and exact - uint8_t modTileX; - uint8_t modTileY; - - - - if(player1.inAir == false && directionX != 0) - { - if(directionX == 1) - { - tileColX = ( ( player1.posX / 100) + player1.radius ) / 20; - modTileX = ( player1.posX + ( 100 * player1.radius ) ) % 2000; - } - else if(directionX == -1) - { - tileColX = ( ( player1.posX / 100) - player1.radius ) / 20; - modTileX = ( player1.posX - ( 100 * player1.radius ) ) % 2000; - } - - if(tileMap[tileColY][tileColX + directionX] != 1) - { - player1.posX = player1.posX + (directionX * player1.speed); // NEW x set - } - - else if(tileMap[tileColY][tileColX + directionX] == 1) - { - if(modTileX < player1.speed) - { - player1.posX = player1.posX + (directionX * modTileX); // NEW x set - } - else - { - player1.posX = player1.posX + (directionX * player1.speed); // NEW x set - } - } - - } - else //if in air different all borders have to be checked - { - - } - - //collision map floor (y-axis) (falling) - // if falling no jump press (implement) - /* - tileColY = (( player1.posY / 100) + player1.radius) / 16; //bottom of player box - modTileY = 1; - if(tileMap[tileColY+1][tileColX] != 1) //rework after jumping - { - player1.posY = player1.posY + 5 ;// NEW y set //makew var gravity - //playerStat = falling; //for later use of graphics/sound - } - */ - //else if(tileMap[]) - - - - - -} -/* USER CODE END 4 */ - -/** - * @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 */ -} - -#ifdef USE_FULL_ASSERT -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t *file, uint32_t line) -{ - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ -} -#endif /* USE_FULL_ASSERT */ diff --git a/GameLogic/stm32/main.h b/GameLogic/stm32/main.h deleted file mode 100644 index 4495405..0000000 --- a/GameLogic/stm32/main.h +++ /dev/null @@ -1,69 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @attention - * - * Copyright (c) 2023 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MAIN_H -#define __MAIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_hal.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void Error_Handler(void); - -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -/* Private defines -----------------------------------------------------------*/ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -#ifdef __cplusplus -} -#endif - -#endif /* __MAIN_H */ diff --git a/GameLogic/stm32/stm32Design.md b/GameLogic/stm32/stm32Design.md deleted file mode 100644 index f4569d2..0000000 --- a/GameLogic/stm32/stm32Design.md +++ /dev/null @@ -1,33 +0,0 @@ -Pin layout - -| pin STM | function | -|---------|----------| -| PA5 / D13 | SPI clock | -| PA7 / D11 | SPI MOSI | -| PA9 / D8 | SPI cs | -| PB4 / D5 | button 1 | -| PB5 / D4 | button 2 | -| PB6 / D10 | button 3 | -| PB8 / D15 | button 4 | - -| pin FPGA | function | -|---------|----------| -| JB 7 | SPI clock | -| JB 8 | SPI data | -| JB 9 | SPI cs | - - - -constraints: - -set_property PACKAGE_PIN A15 [get_ports clkSPI] - -set_property PACKAGE_PIN C15 [get_ports csSPI] - -set_property PACKAGE_PIN A17 [get_ports dataSPI] - -set_property IOSTANDARD LVCMOS33 [get_ports dataSPI] - -set_property IOSTANDARD LVCMOS33 [get_ports csSPI] - -set_property IOSTANDARD LVCMOS33 [get_ports clkSPI] . diff --git a/GameLogic/stm32/stm32f0xx_hal_conf.h b/GameLogic/stm32/stm32f0xx_hal_conf.h deleted file mode 100644 index 02785c6..0000000 --- a/GameLogic/stm32/stm32f0xx_hal_conf.h +++ /dev/null @@ -1,322 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f0xx_hal_conf.h - * @brief HAL configuration file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0xx_HAL_CONF_H -#define __STM32F0xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED - /*#define HAL_ADC_MODULE_ENABLED */ -/*#define HAL_CRYP_MODULE_ENABLED */ -/*#define HAL_CAN_MODULE_ENABLED */ -/*#define HAL_CEC_MODULE_ENABLED */ -/*#define HAL_COMP_MODULE_ENABLED */ -/*#define HAL_CRC_MODULE_ENABLED */ -/*#define HAL_CRYP_MODULE_ENABLED */ -/*#define HAL_TSC_MODULE_ENABLED */ -/*#define HAL_DAC_MODULE_ENABLED */ -/*#define HAL_I2S_MODULE_ENABLED */ -/*#define HAL_IWDG_MODULE_ENABLED */ -/*#define HAL_LCD_MODULE_ENABLED */ -/*#define HAL_LPTIM_MODULE_ENABLED */ -/*#define HAL_RNG_MODULE_ENABLED */ -/*#define HAL_RTC_MODULE_ENABLED */ -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -/*#define HAL_UART_MODULE_ENABLED */ -/*#define HAL_USART_MODULE_ENABLED */ -/*#define HAL_IRDA_MODULE_ENABLED */ -/*#define HAL_SMARTCARD_MODULE_ENABLED */ -/*#define HAL_SMBUS_MODULE_ENABLED */ -/*#define HAL_WWDG_MODULE_ENABLED */ -/*#define HAL_PCD_MODULE_ENABLED */ -#define HAL_CORTEX_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -/** - * @brief In the following line adjust the External High Speed oscillator (HSE) Startup - * Timeout value - */ -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup - * Timeout value - */ -#if !defined (HSI_STARTUP_TIMEOUT) - #define HSI_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for HSI start up */ -#endif /* HSI_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator for ADC (HSI14) value. - */ -#if !defined (HSI14_VALUE) -#define HSI14_VALUE ((uint32_t)14000000) /*!< Value of the Internal High Speed oscillator for ADC in Hz. - The real value may vary depending on the variations - in voltage and temperature. */ -#endif /* HSI14_VALUE */ - -/** - * @brief Internal High Speed oscillator for USB (HSI48) value. - */ -#if !defined (HSI48_VALUE) - #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal High Speed oscillator for USB in Hz. - The real value may vary depending on the variations - in voltage and temperature. */ -#endif /* HSI48_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)40000) -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature. */ -/** - * @brief External Low Speed oscillator (LSI) value. - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -/** - * @brief Time out for LSE start up value in ms. - */ -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)3) /*!< tick interrupt priority (lowest by default) */ - /* Warning: Must be set to higher priority for HAL_Delay() */ - /* and HAL_GetTick() usage under interrupt context */ -#define USE_RTOS 0 -#define PREFETCH_ENABLE 1 -#define INSTRUCTION_CACHE_ENABLE 0 -#define DATA_CACHE_ENABLE 0 -#define USE_SPI_CRC 0U - -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ -#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ -#define USE_HAL_COMP_REGISTER_CALLBACKS 0U /* COMP register callback disabled */ -#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ -#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ -#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ -#define USE_HAL_TSC_REGISTER_CALLBACKS 0U /* TSC register callback disabled */ -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32f0xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32f0xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32f0xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32f0xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32f0xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32f0xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED - #include "stm32f0xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED - #include "stm32f0xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_COMP_MODULE_ENABLED - #include "stm32f0xx_hal_comp.h" -#endif /* HAL_COMP_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32f0xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32f0xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32f0xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32f0xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32f0xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32f0xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32f0xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32f0xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32f0xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32f0xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32f0xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED - #include "stm32f0xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32f0xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32f0xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_TSC_MODULE_ENABLED - #include "stm32f0xx_hal_tsc.h" -#endif /* HAL_TSC_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32f0xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32f0xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32f0xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0xx_HAL_CONF_H */ - diff --git a/GameLogic/stm32/stm32f0xx_hal_msp.c b/GameLogic/stm32/stm32f0xx_hal_msp.c deleted file mode 100644 index 93bc303..0000000 --- a/GameLogic/stm32/stm32f0xx_hal_msp.c +++ /dev/null @@ -1,190 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f0xx_hal_msp.c - * @brief This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - * Copyright (c) 2023 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/** -* @brief SPI MSP Initialization -* This function configures the hardware resources used in this example -* @param hspi: SPI handle pointer -* @retval None -*/ -void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(hspi->Instance==SPI1) - { - /* USER CODE BEGIN SPI1_MspInit 0 */ - - /* USER CODE END SPI1_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_SPI1_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**SPI1 GPIO Configuration - PA5 ------> SPI1_SCK - PA7 ------> SPI1_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF0_SPI1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI1_MspInit 1 */ - - /* USER CODE END SPI1_MspInit 1 */ - } - -} - -/** -* @brief SPI MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param hspi: SPI handle pointer -* @retval None -*/ -void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) -{ - if(hspi->Instance==SPI1) - { - /* USER CODE BEGIN SPI1_MspDeInit 0 */ - - /* USER CODE END SPI1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI1_CLK_DISABLE(); - - /**SPI1 GPIO Configuration - PA5 ------> SPI1_SCK - PA7 ------> SPI1_MOSI - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_7); - - /* USER CODE BEGIN SPI1_MspDeInit 1 */ - - /* USER CODE END SPI1_MspDeInit 1 */ - } - -} - -/** -* @brief TIM_Base MSP Initialization -* This function configures the hardware resources used in this example -* @param htim_base: TIM_Base handle pointer -* @retval None -*/ -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) -{ - if(htim_base->Instance==TIM3) - { - /* USER CODE BEGIN TIM3_MspInit 0 */ - - /* USER CODE END TIM3_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM3_CLK_ENABLE(); - /* USER CODE BEGIN TIM3_MspInit 1 */ - - /* USER CODE END TIM3_MspInit 1 */ - } - -} - -/** -* @brief TIM_Base MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param htim_base: TIM_Base handle pointer -* @retval None -*/ -void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) -{ - if(htim_base->Instance==TIM3) - { - /* USER CODE BEGIN TIM3_MspDeInit 0 */ - - /* USER CODE END TIM3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM3_CLK_DISABLE(); - /* USER CODE BEGIN TIM3_MspDeInit 1 */ - - /* USER CODE END TIM3_MspDeInit 1 */ - } - -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/GameLogic/stm32/stm32f0xx_it.c b/GameLogic/stm32/stm32f0xx_it.c deleted file mode 100644 index ced8734..0000000 --- a/GameLogic/stm32/stm32f0xx_it.c +++ /dev/null @@ -1,145 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f0xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention - * - * Copyright (c) 2023 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "stm32f0xx_it.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* External variables --------------------------------------------------------*/ - -/* USER CODE BEGIN EV */ - -/* USER CODE END EV */ - -/******************************************************************************/ -/* Cortex-M0 Processor Interruption and Exception Handlers */ -/******************************************************************************/ -/** - * @brief This function handles Non maskable interrupt. - */ -void NMI_Handler(void) -{ - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - while (1) - { - } - /* USER CODE END NonMaskableInt_IRQn 1 */ -} - -/** - * @brief This function handles Hard fault interrupt. - */ -void HardFault_Handler(void) -{ - /* USER CODE BEGIN HardFault_IRQn 0 */ - - /* USER CODE END HardFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_HardFault_IRQn 0 */ - /* USER CODE END W1_HardFault_IRQn 0 */ - } -} - -/** - * @brief This function handles System service call via SWI instruction. - */ -void SVC_Handler(void) -{ - /* USER CODE BEGIN SVC_IRQn 0 */ - - /* USER CODE END SVC_IRQn 0 */ - /* USER CODE BEGIN SVC_IRQn 1 */ - - /* USER CODE END SVC_IRQn 1 */ -} - -/** - * @brief This function handles Pendable request for system service. - */ -void PendSV_Handler(void) -{ - /* USER CODE BEGIN PendSV_IRQn 0 */ - - /* USER CODE END PendSV_IRQn 0 */ - /* USER CODE BEGIN PendSV_IRQn 1 */ - - /* USER CODE END PendSV_IRQn 1 */ -} - -/** - * @brief This function handles System tick timer. - */ -void SysTick_Handler(void) -{ - /* USER CODE BEGIN SysTick_IRQn 0 */ - - /* USER CODE END SysTick_IRQn 0 */ - HAL_IncTick(); - /* USER CODE BEGIN SysTick_IRQn 1 */ - - /* USER CODE END SysTick_IRQn 1 */ -} - -/******************************************************************************/ -/* STM32F0xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32f0xx.s). */ -/******************************************************************************/ - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/GameLogic/stm32/stm32f0xx_it.h b/GameLogic/stm32/stm32f0xx_it.h deleted file mode 100644 index a3fa1b9..0000000 --- a/GameLogic/stm32/stm32f0xx_it.h +++ /dev/null @@ -1,62 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f0xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2023 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0xx_IT_H -#define __STM32F0xx_IT_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void NMI_Handler(void); -void HardFault_Handler(void); -void SVC_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0xx_IT_H */ diff --git a/GameLogic/stm32/syscalls.c b/GameLogic/stm32/syscalls.c deleted file mode 100644 index f4278b7..0000000 --- a/GameLogic/stm32/syscalls.c +++ /dev/null @@ -1,176 +0,0 @@ -/** - ****************************************************************************** - * @file syscalls.c - * @author Auto-generated by STM32CubeIDE - * @brief STM32CubeIDE Minimal System calls file - * - * For more information about which c-functions - * need which of these lowlevel functions - * please consult the Newlib libc-manual - ****************************************************************************** - * @attention - * - * Copyright (c) 2020-2022 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes */ -#include -#include -#include -#include -#include -#include -#include -#include - - -/* Variables */ -extern int __io_putchar(int ch) __attribute__((weak)); -extern int __io_getchar(void) __attribute__((weak)); - - -char *__env[1] = { 0 }; -char **environ = __env; - - -/* Functions */ -void initialise_monitor_handles() -{ -} - -int _getpid(void) -{ - return 1; -} - -int _kill(int pid, int sig) -{ - (void)pid; - (void)sig; - errno = EINVAL; - return -1; -} - -void _exit (int status) -{ - _kill(status, -1); - while (1) {} /* Make sure we hang here */ -} - -__attribute__((weak)) int _read(int file, char *ptr, int len) -{ - (void)file; - int DataIdx; - - for (DataIdx = 0; DataIdx < len; DataIdx++) - { - *ptr++ = __io_getchar(); - } - - return len; -} - -__attribute__((weak)) int _write(int file, char *ptr, int len) -{ - (void)file; - int DataIdx; - - for (DataIdx = 0; DataIdx < len; DataIdx++) - { - __io_putchar(*ptr++); - } - return len; -} - -int _close(int file) -{ - (void)file; - return -1; -} - - -int _fstat(int file, struct stat *st) -{ - (void)file; - st->st_mode = S_IFCHR; - return 0; -} - -int _isatty(int file) -{ - (void)file; - return 1; -} - -int _lseek(int file, int ptr, int dir) -{ - (void)file; - (void)ptr; - (void)dir; - return 0; -} - -int _open(char *path, int flags, ...) -{ - (void)path; - (void)flags; - /* Pretend like we always fail */ - return -1; -} - -int _wait(int *status) -{ - (void)status; - errno = ECHILD; - return -1; -} - -int _unlink(char *name) -{ - (void)name; - errno = ENOENT; - return -1; -} - -int _times(struct tms *buf) -{ - (void)buf; - return -1; -} - -int _stat(char *file, struct stat *st) -{ - (void)file; - st->st_mode = S_IFCHR; - return 0; -} - -int _link(char *old, char *new) -{ - (void)old; - (void)new; - errno = EMLINK; - return -1; -} - -int _fork(void) -{ - errno = EAGAIN; - return -1; -} - -int _execve(char *name, char **argv, char **env) -{ - (void)name; - (void)argv; - (void)env; - errno = ENOMEM; - return -1; -} diff --git a/GameLogic/stm32/sysmem.c b/GameLogic/stm32/sysmem.c deleted file mode 100644 index 54081ac..0000000 --- a/GameLogic/stm32/sysmem.c +++ /dev/null @@ -1,79 +0,0 @@ -/** - ****************************************************************************** - * @file sysmem.c - * @author Generated by STM32CubeIDE - * @brief STM32CubeIDE System Memory calls file - * - * For more information about which C functions - * need which of these lowlevel functions - * please consult the newlib libc manual - ****************************************************************************** - * @attention - * - * Copyright (c) 2022 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes */ -#include -#include - -/** - * Pointer to the current high watermark of the heap usage - */ -static uint8_t *__sbrk_heap_end = NULL; - -/** - * @brief _sbrk() allocates memory to the newlib heap and is used by malloc - * and others from the C library - * - * @verbatim - * ############################################################################ - * # .data # .bss # newlib heap # MSP stack # - * # # # # Reserved by _Min_Stack_Size # - * ############################################################################ - * ^-- RAM start ^-- _end _estack, RAM end --^ - * @endverbatim - * - * This implementation starts allocating at the '_end' linker symbol - * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack - * The implementation considers '_estack' linker symbol to be RAM end - * NOTE: If the MSP stack, at any point during execution, grows larger than the - * reserved size, please increase the '_Min_Stack_Size'. - * - * @param incr Memory size - * @return Pointer to allocated memory - */ -void *_sbrk(ptrdiff_t incr) -{ - extern uint8_t _end; /* Symbol defined in the linker script */ - extern uint8_t _estack; /* Symbol defined in the linker script */ - extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ - const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; - const uint8_t *max_heap = (uint8_t *)stack_limit; - uint8_t *prev_heap_end; - - /* Initialize heap end at first call */ - if (NULL == __sbrk_heap_end) - { - __sbrk_heap_end = &_end; - } - - /* Protect heap from growing into the reserved MSP stack */ - if (__sbrk_heap_end + incr > max_heap) - { - errno = ENOMEM; - return (void *)-1; - } - - prev_heap_end = __sbrk_heap_end; - __sbrk_heap_end += incr; - - return (void *)prev_heap_end; -} diff --git a/GameLogic/stm32/system_stm32f0xx.c b/GameLogic/stm32/system_stm32f0xx.c deleted file mode 100644 index 1b0fbe5..0000000 --- a/GameLogic/stm32/system_stm32f0xx.c +++ /dev/null @@ -1,247 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32f0xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M0 Device Peripheral Access Layer System Source File. - * - * 1. This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f0xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2016 STMicroelectronics. - * All rights reserved.

- * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f0xx_system - * @{ - */ - -/** @addtogroup STM32F0xx_System_Private_Includes - * @{ - */ - -#include "stm32f0xx.h" - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Defines - * @{ - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)8000000) /*!< Default value of the External oscillator in Hz. - This value can be provided and adapted by the user application. */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)8000000) /*!< Default value of the Internal oscillator in Hz. - This value can be provided and adapted by the user application. */ -#endif /* HSI_VALUE */ - -#if !defined (HSI48_VALUE) -#define HSI48_VALUE ((uint32_t)48000000) /*!< Default value of the HSI48 Internal oscillator in Hz. - This value can be provided and adapted by the user application. */ -#endif /* HSI48_VALUE */ -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Variables - * @{ - */ - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ -uint32_t SystemCoreClock = 8000000; - -const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; -const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* NOTE :SystemInit(): This function is called at startup just after reset and - before branch to main program. This call is made inside - the "startup_stm32f0xx.s" file. - User can setups the default system clock (System clock source, PLL Multiplier - and Divider factors, AHB/APBx prescalers and Flash settings). - */ -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f0xx_hal_conf.h file (default value - * 8 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f0xx_hal_conf.h file (its value - * depends on the application requirements), user has to ensure that HSE_VALUE - * is same as the real frequency of the crystal used. Otherwise, this function - * may have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate (void) -{ - uint32_t tmp = 0, pllmull = 0, pllsource = 0, predivfactor = 0; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock */ - SystemCoreClock = HSI_VALUE; - break; - case RCC_CFGR_SWS_HSE: /* HSE used as system clock */ - SystemCoreClock = HSE_VALUE; - break; - case RCC_CFGR_SWS_PLL: /* PLL used as system clock */ - /* Get PLL clock source and multiplication factor ----------------------*/ - pllmull = RCC->CFGR & RCC_CFGR_PLLMUL; - pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; - pllmull = ( pllmull >> 18) + 2; - predivfactor = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1; - - if (pllsource == RCC_CFGR_PLLSRC_HSE_PREDIV) - { - /* HSE used as PLL clock source : SystemCoreClock = HSE/PREDIV * PLLMUL */ - SystemCoreClock = (HSE_VALUE/predivfactor) * pllmull; - } -#if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F091xC) || defined(STM32F098xx) - else if (pllsource == RCC_CFGR_PLLSRC_HSI48_PREDIV) - { - /* HSI48 used as PLL clock source : SystemCoreClock = HSI48/PREDIV * PLLMUL */ - SystemCoreClock = (HSI48_VALUE/predivfactor) * pllmull; - } -#endif /* STM32F042x6 || STM32F048xx || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx */ - else - { -#if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F070x6) \ - || defined(STM32F078xx) || defined(STM32F071xB) || defined(STM32F072xB) \ - || defined(STM32F070xB) || defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC) - /* HSI used as PLL clock source : SystemCoreClock = HSI/PREDIV * PLLMUL */ - SystemCoreClock = (HSI_VALUE/predivfactor) * pllmull; -#else - /* HSI used as PLL clock source : SystemCoreClock = HSI/2 * PLLMUL */ - SystemCoreClock = (HSI_VALUE >> 1) * pllmull; -#endif /* STM32F042x6 || STM32F048xx || STM32F070x6 || - STM32F071xB || STM32F072xB || STM32F078xx || STM32F070xB || - STM32F091xC || STM32F098xx || STM32F030xC */ - } - break; - default: /* HSI used as system clock */ - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK clock frequency ----------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK clock frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/GameLogic/vhdl/cnts.xdc b/GameLogic/vhdl/cnts.xdc deleted file mode 100644 index b8c0604..0000000 --- a/GameLogic/vhdl/cnts.xdc +++ /dev/null @@ -1,72 +0,0 @@ -set_property PACKAGE_PIN W5 [get_ports clk100] -set_property PACKAGE_PIN P19 [get_ports hsync] -set_property PACKAGE_PIN R19 [get_ports vsync] -set_property PACKAGE_PIN N18 [get_ports {blue[3]}] -set_property PACKAGE_PIN L18 [get_ports {blue[2]}] -set_property PACKAGE_PIN K18 [get_ports {blue[1]}] -set_property PACKAGE_PIN J18 [get_ports {blue[0]}] -set_property PACKAGE_PIN J17 [get_ports {green[3]}] -set_property PACKAGE_PIN H17 [get_ports {green[2]}] -set_property PACKAGE_PIN G17 [get_ports {green[1]}] -set_property PACKAGE_PIN D17 [get_ports {green[0]}] -set_property PACKAGE_PIN G19 [get_ports {red[3]}] -set_property PACKAGE_PIN H19 [get_ports {red[2]}] -set_property PACKAGE_PIN J19 [get_ports {red[1]}] -set_property PACKAGE_PIN N19 [get_ports {red[0]}] -set_property IOSTANDARD LVCMOS33 [get_ports clk100] -set_property IOSTANDARD LVCMOS33 [get_ports hsync] -set_property IOSTANDARD LVCMOS33 [get_ports vsync] -set_property IOSTANDARD LVCMOS33 [get_ports {blue[3]}] -set_property IOSTANDARD LVCMOS33 [get_ports {blue[2]}] -set_property IOSTANDARD LVCMOS33 [get_ports {blue[0]}] -set_property IOSTANDARD LVCMOS33 [get_ports {blue[1]}] -set_property IOSTANDARD LVCMOS33 [get_ports {green[3]}] -set_property IOSTANDARD LVCMOS33 [get_ports {green[2]}] -set_property IOSTANDARD LVCMOS33 [get_ports {green[1]}] -set_property IOSTANDARD LVCMOS33 [get_ports {red[3]}] -set_property IOSTANDARD LVCMOS33 [get_ports {red[2]}] -set_property IOSTANDARD LVCMOS33 [get_ports {red[1]}] -set_property IOSTANDARD LVCMOS33 [get_ports {red[0]}] -set_property IOSTANDARD LVCMOS33 [get_ports {green[0]}] - -set_property PACKAGE_PIN T18 [get_ports resetButton] -set_property IOSTANDARD LVCMOS33 [get_ports resetButton] - -set_property PACKAGE_PIN A15 [get_ports clkSPI] -set_property PACKAGE_PIN C15 [get_ports csSPI] -set_property PACKAGE_PIN A17 [get_ports dataSPI] -set_property IOSTANDARD LVCMOS33 [get_ports dataSPI] -set_property IOSTANDARD LVCMOS33 [get_ports csSPI] -set_property IOSTANDARD LVCMOS33 [get_ports clkSPI] -set_property PACKAGE_PIN L1 [get_ports {led[15]}] -set_property PACKAGE_PIN P1 [get_ports {led[14]}] -set_property PACKAGE_PIN N3 [get_ports {led[13]}] -set_property PACKAGE_PIN P3 [get_ports {led[12]}] -set_property PACKAGE_PIN U3 [get_ports {led[11]}] -set_property PACKAGE_PIN W3 [get_ports {led[10]}] -set_property PACKAGE_PIN V3 [get_ports {led[9]}] -set_property PACKAGE_PIN V13 [get_ports {led[8]}] -set_property PACKAGE_PIN V14 [get_ports {led[7]}] -set_property PACKAGE_PIN U14 [get_ports {led[6]}] -set_property PACKAGE_PIN U15 [get_ports {led[5]}] -set_property PACKAGE_PIN W18 [get_ports {led[4]}] -set_property PACKAGE_PIN V19 [get_ports {led[3]}] -set_property PACKAGE_PIN U19 [get_ports {led[2]}] -set_property PACKAGE_PIN E19 [get_ports {led[1]}] -set_property PACKAGE_PIN U16 [get_ports {led[0]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[4]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[5]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[6]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[7]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[8]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[9]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[10]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[11]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[12]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[13]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[14]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led[15]}] diff --git a/GameLogic/vhdl/constraints.txt b/GameLogic/vhdl/constraints.txt deleted file mode 100644 index f254cdd..0000000 --- a/GameLogic/vhdl/constraints.txt +++ /dev/null @@ -1,6 +0,0 @@ -set_property PACKAGE_PIN A15 [get_ports clkSPI] -set_property PACKAGE_PIN C15 [get_ports csSPI] -set_property PACKAGE_PIN A17 [get_ports dataSPI] -set_property IOSTANDARD LVCMOS33 [get_ports dataSPI] -set_property IOSTANDARD LVCMOS33 [get_ports csSPI] -set_property IOSTANDARD LVCMOS33 [get_ports clkSPI] \ No newline at end of file diff --git a/GameLogic/vhdl/spiSlave.vhd b/GameLogic/vhdl/spiSlave.vhd deleted file mode 100644 index 7cf3e63..0000000 --- a/GameLogic/vhdl/spiSlave.vhd +++ /dev/null @@ -1,105 +0,0 @@ ----------------------------------------------------------------------------------- --- Company: --- Engineer: --- --- Create Date: 15.02.2023 21:09:16 --- Design Name: --- Module Name: top - Behavioral --- Project Name: --- Target Devices: --- Tool Versions: --- Description: --- --- Dependencies: --- --- Revision: --- Revision 0.01 - File Created --- Additional Comments: --- ----------------------------------------------------------------------------------- - - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; - --- Uncomment the following library declaration if using --- arithmetic functions with Signed or Unsigned values -use IEEE.NUMERIC_STD.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; --- Uncomment the following library declaration if instantiating --- any Xilinx leaf cells in this code. ---library UNISIM; ---use UNISIM.VComponents.all; - -entity spiSlave is - Port ( clkBoard : in std_logic; -- clock basys3 100MHz - clkSPI : in std_logic; -- incoming clock of SPI - dataSPI : in std_logic; -- incoming data of SPI - csSPI : in std_logic; -- incoming select of SPI - dataRead : out std_logic_vector(23 downto 0) := (others => '0') -- data read - - ); -end spiSlave; - -architecture Behavioral of spiSlave is - signal PulseFF0,PulseFF1,PulseFF2,PulseFF3 : std_logic := '0'; -- signal for metastability synchronizer of clk SPI - signal dataFF0,dataFF1,dataFF2,dataFF3 : std_logic := '0'; -- signal for metastability synchronizer of data SPI - signal ssFF0,ssFF1,ssFF2,ssFF3 : std_logic := '0'; -- signal for metastability synchronizer of slave select SPI - - signal data : std_logic_vector(23 downto 0) := (others => '0'); -- signal to store incomming data of dataSPI (2x 8bit) - signal counter : integer := 23; --counter for data position - signal enable : std_logic := '0'; -- enable signal if slave is selected -begin - - process (clkBoard) - begin - - if rising_edge(clkBoard) then - -- flip flop for clk SPI to synchronise a - PulseFF0 <= clkSPI; - PulseFF1 <= PulseFF0; - PulseFF2 <= PulseFF1; - PulseFF3 <= PulseFF2; - -- flip flop for data SPI to synchronise - dataFF0 <= dataSPI; - dataFF1 <= dataFF0; - dataFF2 <= dataFF1; - dataFF3 <= dataFF2; - -- flip flop for slave select SPI to synchronise - ssFF0 <= csSPI; - ssFF1 <= ssFF0; - ssFF2 <= ssFF1; - ssFF3 <= ssFF2; - -- check if slave select signal has falling edge (slave is selected by master) - if(ssFF3 = '1' and ssFF2 = '0') then - --reset counter if true - counter <= 23; - --disable data read if rising edge (slave is not selected) - elsif (ssFF3 = '0' and ssFF2 = '1') then - enable <= '0'; - end if; - --check if synchronised slave select signal is falling edge or data read is enabled - if(ssFF3 = '1' and ssFF2 = '0') or enable = '1' then - enable <= '1'; --enable data read - if (PulseFF3 = '0' and PulseFF2 = '1') then -- check for rising edge of clk SPI - if counter > -1 then - counter <= counter - 1; - -- data transfer into vector - data(counter) <= dataFF3; - end if; - end if; - --check if counter is done - if counter = -1 then - counter <= 23; --reset counter - dataRead <= data; - end if; - elsif (enable = '0') then - --dataRead <= data; - - end if; - - end if; - - end process; - -end Behavioral; diff --git a/basys3/basys3.srcs/io.xdc b/basys3/basys3.srcs/io.xdc new file mode 100644 index 0000000..f254cdd --- /dev/null +++ b/basys3/basys3.srcs/io.xdc @@ -0,0 +1,6 @@ +set_property PACKAGE_PIN A15 [get_ports clkSPI] +set_property PACKAGE_PIN C15 [get_ports csSPI] +set_property PACKAGE_PIN A17 [get_ports dataSPI] +set_property IOSTANDARD LVCMOS33 [get_ports dataSPI] +set_property IOSTANDARD LVCMOS33 [get_ports csSPI] +set_property IOSTANDARD LVCMOS33 [get_ports clkSPI] \ No newline at end of file diff --git a/basys3/basys3.srcs/top.vhd b/basys3/basys3.srcs/top.vhd new file mode 100644 index 0000000..7cf3e63 --- /dev/null +++ b/basys3/basys3.srcs/top.vhd @@ -0,0 +1,105 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 15.02.2023 21:09:16 +-- Design Name: +-- Module Name: top - Behavioral +-- Project Name: +-- Target Devices: +-- Tool Versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- + + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; + +-- Uncomment the following library declaration if using +-- arithmetic functions with Signed or Unsigned values +use IEEE.NUMERIC_STD.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; +-- Uncomment the following library declaration if instantiating +-- any Xilinx leaf cells in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity spiSlave is + Port ( clkBoard : in std_logic; -- clock basys3 100MHz + clkSPI : in std_logic; -- incoming clock of SPI + dataSPI : in std_logic; -- incoming data of SPI + csSPI : in std_logic; -- incoming select of SPI + dataRead : out std_logic_vector(23 downto 0) := (others => '0') -- data read + + ); +end spiSlave; + +architecture Behavioral of spiSlave is + signal PulseFF0,PulseFF1,PulseFF2,PulseFF3 : std_logic := '0'; -- signal for metastability synchronizer of clk SPI + signal dataFF0,dataFF1,dataFF2,dataFF3 : std_logic := '0'; -- signal for metastability synchronizer of data SPI + signal ssFF0,ssFF1,ssFF2,ssFF3 : std_logic := '0'; -- signal for metastability synchronizer of slave select SPI + + signal data : std_logic_vector(23 downto 0) := (others => '0'); -- signal to store incomming data of dataSPI (2x 8bit) + signal counter : integer := 23; --counter for data position + signal enable : std_logic := '0'; -- enable signal if slave is selected +begin + + process (clkBoard) + begin + + if rising_edge(clkBoard) then + -- flip flop for clk SPI to synchronise a + PulseFF0 <= clkSPI; + PulseFF1 <= PulseFF0; + PulseFF2 <= PulseFF1; + PulseFF3 <= PulseFF2; + -- flip flop for data SPI to synchronise + dataFF0 <= dataSPI; + dataFF1 <= dataFF0; + dataFF2 <= dataFF1; + dataFF3 <= dataFF2; + -- flip flop for slave select SPI to synchronise + ssFF0 <= csSPI; + ssFF1 <= ssFF0; + ssFF2 <= ssFF1; + ssFF3 <= ssFF2; + -- check if slave select signal has falling edge (slave is selected by master) + if(ssFF3 = '1' and ssFF2 = '0') then + --reset counter if true + counter <= 23; + --disable data read if rising edge (slave is not selected) + elsif (ssFF3 = '0' and ssFF2 = '1') then + enable <= '0'; + end if; + --check if synchronised slave select signal is falling edge or data read is enabled + if(ssFF3 = '1' and ssFF2 = '0') or enable = '1' then + enable <= '1'; --enable data read + if (PulseFF3 = '0' and PulseFF2 = '1') then -- check for rising edge of clk SPI + if counter > -1 then + counter <= counter - 1; + -- data transfer into vector + data(counter) <= dataFF3; + end if; + end if; + --check if counter is done + if counter = -1 then + counter <= 23; --reset counter + dataRead <= data; + end if; + elsif (enable = '0') then + --dataRead <= data; + + end if; + + end if; + + end process; + +end Behavioral; diff --git a/pinout.md b/pinout.md new file mode 100644 index 0000000..f4569d2 --- /dev/null +++ b/pinout.md @@ -0,0 +1,33 @@ +Pin layout + +| pin STM | function | +|---------|----------| +| PA5 / D13 | SPI clock | +| PA7 / D11 | SPI MOSI | +| PA9 / D8 | SPI cs | +| PB4 / D5 | button 1 | +| PB5 / D4 | button 2 | +| PB6 / D10 | button 3 | +| PB8 / D15 | button 4 | + +| pin FPGA | function | +|---------|----------| +| JB 7 | SPI clock | +| JB 8 | SPI data | +| JB 9 | SPI cs | + + + +constraints: + +set_property PACKAGE_PIN A15 [get_ports clkSPI] + +set_property PACKAGE_PIN C15 [get_ports csSPI] + +set_property PACKAGE_PIN A17 [get_ports dataSPI] + +set_property IOSTANDARD LVCMOS33 [get_ports dataSPI] + +set_property IOSTANDARD LVCMOS33 [get_ports csSPI] + +set_property IOSTANDARD LVCMOS33 [get_ports clkSPI] . diff --git a/src/ds.c b/src/ds.c new file mode 100644 index 0000000..d6d4357 --- /dev/null +++ b/src/ds.c @@ -0,0 +1,15 @@ +#include "main.h" +#include "ppu/ppu.h" +#include "demo.h" + +void hh_setup() { + hh_ppu_init(); + + hh_demo_setup(); +} + +void hh_exit() { + g_hh_run = false; + + hh_ppu_deinit(); +} diff --git a/src/ds.mk b/src/ds.mk index d4354a2..b5633b3 100644 --- a/src/ds.mk +++ b/src/ds.mk @@ -10,5 +10,6 @@ endif DESKTOP_SRCS += ppusim/sim.c \ ppusim/mem.c \ ppusim/pixel.c \ - ppusim/work.c + ppusim/work.c \ + ds.c diff --git a/src/main.c b/src/main.c index f4de225..ee6125f 100644 --- a/src/main.c +++ b/src/main.c @@ -1,13 +1,98 @@ #include #include "main.h" -#include "ppu/ppu.h" #include "demo.h" bool g_hh_run = true; +static int8_t buttonDPAD[] = {0,0,0,0}; //1left 2right 3down 4up + +struct playerData{ + uint16_t posX; + uint16_t posY; + uint8_t radius; + uint8_t rotation; //45 degrees steps 0 == right 2 == down 4 == left 6 == up + uint8_t directionX; //direction where its looking at in case no input; + int8_t speed; //10 default L/R MODifier + bool inAir; + +}; + +struct playerData player1; + +uint8_t tileMap[30][40] = + { + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 } + + + + }; + +void buttonRead(); +void playerMovement(); +void sendData(uint8_t, uint16_t); + + uint16_t pos_x; //0b0000 0001 0011 0110 + uint16_t pos_y; + + uint8_t left = 0; + uint8_t right = 0; + uint8_t up = 0; + uint8_t down = 0; + + + + uint8_t pos_x_bit[2]; + uint8_t pos_y_bit[2]; + uint8_t data_send[3]; + + int tileX; + int tileY; +// struct playerData player1; + //int buttons[] = {GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_8}; // 1 left // 2 right // 3 up // 4 down + + int main() { hh_setup(); + +/// init struct + player1.posX = 31000; //0b0000 0001 0011 0110 + player1.posY = 21000; + player1.radius = 8; + player1.speed = 1; + player1.directionX = 1; + player1.rotation = 8; + player1.inAir = false; + hh_loop(); hh_exit(); return 0; @@ -17,17 +102,163 @@ void hh_ppu_vblank_interrupt() { static unsigned long frame = 0; frame++; - hh_demo_loop(frame); + buttonRead(); + playerMovement(); + + + // send data via SPI //adjust map size + pos_x = player1.posX / 100; + pos_y = player1.posY / 100; + + sendData(0b01000000,pos_x); + sendData(0b00000000,pos_y); + + // hh_demo_loop(frame); } -void hh_setup() { - hh_ppu_init(); +void sendData(uint8_t address, uint16_t data) +{ + uint8_t bitData[3]; + bitData[2] = data & 0xff; + bitData[1] = (data >> 8); + bitData[0] = address; // first byte is address + + + + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); + HAL_SPI_Transmit(&hspi1, bitData, 3, 100); //2*8 bit data + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); - hh_demo_setup(); } -void hh_exit() { - g_hh_run = false; +void buttonRead() +{ + //int buttons[] = {GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_8}; // 1 left // 2 right // 3 down // 4 up 8-6-4-5 + uint16_t buttons[] = {0x0100U,0x0040U,0x0010U,0x0020U}; // 1 left // 2 right // 3 down // 4 up + + for(int i = 0; i < 4; i++) + { + if(HAL_GPIO_ReadPin(GPIOB, buttons[i]) == 1) + { + if((i+2) % 2 == 0) + { + buttonDPAD[i] = 1; + } + else + { + buttonDPAD[i] = -1; + } + } + else + { + buttonDPAD[i] = 0; + } + } +} + +void playerMovement() +{ + + int8_t directionX = 0; // -1 = L || 1 == R + int8_t directionY = 0; // -1 = D || 1 == U + + uint8_t i,j; + uint8_t rotation = 0; // 0-7 + //temp var for testing + + + + // direction calc + directionX = buttonDPAD[0] + buttonDPAD[1]; + directionY = buttonDPAD[2] + buttonDPAD[3]; + + //rotation calc + for(i = -1; i < 2;i++) + { + for(j = -1; j < 2; j++) + { + if(directionX == i) + { + if(directionY == j) + { + if(i != 0 && j != 0) //dont update when player idle + { + player1.rotation = rotation; + } + } + } + rotation++; + } + } + //direction calc + if(directionX != 0) //update direction if player is not idle + { + player1.directionX = directionX; + } + //collision map x-axis + + //tile calc including radius and direction for background coliision + + uint16_t tileColX; + uint16_t tileColY = ( player1.posY / 100) / 16; ; + + // remaining space between grid and exact + uint8_t modTileX; + uint8_t modTileY; + + + + if(player1.inAir == false && directionX != 0) + { + if(directionX == 1) + { + tileColX = ( ( player1.posX / 100) + player1.radius ) / 20; + modTileX = ( player1.posX + ( 100 * player1.radius ) ) % 2000; + } + else if(directionX == -1) + { + tileColX = ( ( player1.posX / 100) - player1.radius ) / 20; + modTileX = ( player1.posX - ( 100 * player1.radius ) ) % 2000; + } + + if(tileMap[tileColY][tileColX + directionX] != 1) + { + player1.posX = player1.posX + (directionX * player1.speed); // NEW x set + } + + else if(tileMap[tileColY][tileColX + directionX] == 1) + { + if(modTileX < player1.speed) + { + player1.posX = player1.posX + (directionX * modTileX); // NEW x set + } + else + { + player1.posX = player1.posX + (directionX * player1.speed); // NEW x set + } + } + + } + else //if in air different all borders have to be checked + { + + } + + //collision map floor (y-axis) (falling) + // if falling no jump press (implement) + /* + tileColY = (( player1.posY / 100) + player1.radius) / 16; //bottom of player box + modTileY = 1; + if(tileMap[tileColY+1][tileColX] != 1) //rework after jumping + { + player1.posY = player1.posY + 5 ;// NEW y set //makew var gravity + //playerStat = falling; //for later use of graphics/sound + } + */ + //else if(tileMap[]) + + + + - hh_ppu_deinit(); } diff --git a/src/ppu/stm.c b/src/ppu/stm.c new file mode 100644 index 0000000..fd4a18c --- /dev/null +++ b/src/ppu/stm.c @@ -0,0 +1,4 @@ +#include "ppu/ppu.h" + +void hh_ppu_init() {} +void hh_ppu_deinit() {} diff --git a/src/stm32.mk b/src/stm32.mk index 6926dea..eab34a4 100644 --- a/src/stm32.mk +++ b/src/stm32.mk @@ -43,22 +43,24 @@ STM_SRCS += lib/FreeRTOS-Kernel/croutine.c \ lib/FreeRTOS-Kernel/timers.c \ lib/FreeRTOS-Kernel/portable/GCC/ARM_CM0/port.c \ lib/FreeRTOS-Kernel/portable/MemMang/heap_4.c -STM_SRCS += lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_rcc.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_rcc_ex.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_i2c.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_i2c_ex.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_gpio.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_dma.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_cortex.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_pwr.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_pwr_ex.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_flash.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_flash_ex.c \ +STM_SRCS += lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal.c \ + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_spi.c \ + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_spi_ex.c \ lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_tim.c \ lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_tim_ex.c \ lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_uart.c \ - lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_uart_ex.c + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_uart_ex.c \ + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_cortex.c \ + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_dma.c \ + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_flash.c \ + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_flash_ex.c \ + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_gpio.c \ + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_pwr.c \ + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_pwr_ex.c \ + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_rcc.c \ + lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal_rcc_ex.c STM_SRCS += stm32/idle_task_static_memory.c \ - stm32/main.c + stm32/main.c \ + stm32/setup.c \ + ppu/stm.c diff --git a/src/stm32/setup.c b/src/stm32/setup.c new file mode 100644 index 0000000..2c3552b --- /dev/null +++ b/src/stm32/setup.c @@ -0,0 +1,197 @@ +#include +#include +#include +#include +#include +#include + +#include "main.h" +#include "setup.h" +#include "ppu/ppu.h" + +UART_HandleTypeDef huart2 = { + .Instance = USART2, + .Init.BaudRate = 115200, + .Init.WordLength = UART_WORDLENGTH_8B, + .Init.StopBits = UART_STOPBITS_1, + .Init.Parity = UART_PARITY_NONE, + .Init.Mode = UART_MODE_TX_RX, + .Init.HwFlowCtl = UART_HWCONTROL_NONE, + .Init.OverSampling = UART_OVERSAMPLING_16, + .Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE, + .AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT, +}; + +GPIO_InitTypeDef spi_gpio = { + .Pin = HH_IO_SPI_PINS, + .Mode = GPIO_MODE_AF_PP, + .Pull = GPIO_NOPULL, + .Speed = GPIO_SPEED_FREQ_HIGH, + .Alternate = GPIO_AF0_SPI1, +}; + +SPI_HandleTypeDef hspi1 = { + .Instance = SPI1, + .Init.Mode = SPI_MODE_MASTER, + .Init.Direction = SPI_DIRECTION_1LINE, + .Init.DataSize = SPI_DATASIZE_8BIT, + .Init.CLKPolarity = SPI_POLARITY_LOW, + .Init.CLKPhase = SPI_PHASE_1EDGE, + .Init.NSS = SPI_NSS_SOFT, + .Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16, + .Init.FirstBit = SPI_FIRSTBIT_MSB, + .Init.TIMode = SPI_TIMODE_DISABLE, + .Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE, + .Init.CRCPolynomial = 7, + .Init.CRCLength = SPI_CRC_LENGTH_DATASIZE, + .Init.NSSPMode = SPI_NSS_PULSE_DISABLE, +}; + +TIM_HandleTypeDef htim3 = { + .Instance = TIM3, + .Init.Prescaler = 7999, + .Init.CounterMode = TIM_COUNTERMODE_UP, + .Init.Period = 65535, + .Init.ClockDivision = TIM_CLOCKDIVISION_DIV1, + .Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE, +}; + +static void hh_io_spi_setup(); +static void hh_io_tim_setup(); +static void hh_io_usart2_setup(); +static void hh_io_gpio_setup(); +static void hh_io_clock_setup(); +static void hh_io_setup_error_handler(); + +void hh_setup() { + HAL_Init(); + + hh_io_clock_setup(); + hh_io_usart2_setup(); + hh_io_gpio_setup(); + hh_io_spi_setup(); + hh_io_tim_setup(); + + hh_ppu_init(); +} + +void hh_exit() { + hh_ppu_deinit(); + + HAL_DeInit(); +} + +void hh_io_clock_setup() { + if (HAL_OK != HAL_RCC_OscConfig(&(RCC_OscInitTypeDef){ + .OscillatorType = RCC_OSCILLATORTYPE_HSI, + .HSIState = RCC_HSI_ON, + .HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT, + .PLL.PLLState = RCC_PLL_ON, + })) return hh_io_setup_error_handler(); + + // cpu, ahb & apb clocks + if (HAL_OK != HAL_RCC_ClockConfig(&(RCC_ClkInitTypeDef){ + .ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1, + .SYSCLKSource = RCC_SYSCLKSOURCE_HSI, + .AHBCLKDivider = RCC_SYSCLK_DIV1, + .APB1CLKDivider = RCC_HCLK_DIV1, + }, FLASH_LATENCY_1)) return hh_io_setup_error_handler(); + + // usart2 clock (usb serial) + if (HAL_RCCEx_PeriphCLKConfig(&(RCC_PeriphCLKInitTypeDef){ + .PeriphClockSelection = RCC_PERIPHCLK_USART2, + .Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1, + .I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI, + }) != HAL_OK) return hh_io_setup_error_handler(); +} + +void hh_io_spi_setup() { + if (HAL_SPI_Init(&hspi1) != HAL_OK) + return hh_io_setup_error_handler(); +} + +void hh_io_usart2_setup() { + if (HAL_UART_Init(&huart2) != HAL_OK) + return hh_io_setup_error_handler(); +} + +void hh_io_tim_setup() { + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) + return hh_io_setup_error_handler(); + + if (HAL_TIM_ConfigClockSource(&htim3, &(TIM_ClockConfigTypeDef) { + .ClockSource = TIM_CLOCKSOURCE_INTERNAL + }) != HAL_OK) return hh_io_setup_error_handler(); + + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &(TIM_MasterConfigTypeDef) { + .MasterOutputTrigger = TIM_TRGO_RESET, + .MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE, + }) != HAL_OK) return hh_io_setup_error_handler(); +} + +void hh_io_gpio_setup() { + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); + HAL_GPIO_Init(GPIOA, &(GPIO_InitTypeDef) { + .Pin = GPIO_PIN_9, + .Mode = GPIO_MODE_OUTPUT_PP, + .Pull = GPIO_NOPULL, + .Speed = GPIO_SPEED_FREQ_LOW, + }); + HAL_GPIO_Init(GPIOA, &(GPIO_InitTypeDef) { + .Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_8, + .Mode = GPIO_MODE_INPUT, + .Pull = GPIO_PULLDOWN, + }); +} + +void HAL_MspInit() { + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); +} + +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) { + if(hspi->Instance != SPI1) return; + + __HAL_RCC_SPI1_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + HAL_GPIO_Init(HH_IO_SPI_PORT, &spi_gpio); +} + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) { + if(hspi->Instance != SPI1) return; + + __HAL_RCC_SPI1_CLK_DISABLE(); + + HAL_GPIO_DeInit(HH_IO_SPI_PORT, HH_IO_SPI_PINS); +} + +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) { + if(htim_base->Instance != TIM3) return; + + __HAL_RCC_TIM3_CLK_ENABLE(); +} + +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) { + if(htim_base->Instance != TIM3) return; + + __HAL_RCC_TIM3_CLK_DISABLE(); +} + +void SysTick_Handler() { + HAL_IncTick(); + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + xPortSysTickHandler(); +} + +void HardFault_Handler() { + for(;;); +} + +void hh_io_setup_error_handler() { + __disable_irq(); + while (1); +} diff --git a/src/stm32/setup.h b/src/stm32/setup.h new file mode 100644 index 0000000..66d5ff3 --- /dev/null +++ b/src/stm32/setup.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include +#include + +#define HH_IO_SPI_PINS (GPIO_PIN_5 | GPIO_PIN_7) +#define HH_IO_SPI_PORT GPIOA + +extern UART_HandleTypeDef huart2; // NOLINT +extern GPIO_InitTypeDef spi_gpio; // NOLINT +extern SPI_HandleTypeDef hspi1; // NOLINT +extern TIM_HandleTypeDef htim3; // NOLINT + +// required HAL setup functions +void HAL_MspInit(); // NOLINT +void HAL_UART_MspInit(UART_HandleTypeDef *huart); // NOLINT +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi); // NOLINT +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi); // NOLINT +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base); // NOLINT +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base); // NOLINT +void HardFault_Handler(); // NOLINT +void SysTick_Handler(); // NOLINT diff --git a/src/stm32/stm32f0xx_hal_conf.h b/src/stm32/stm32f0xx_hal_conf.h index fc27221..84a3b74 100644 --- a/src/stm32/stm32f0xx_hal_conf.h +++ b/src/stm32/stm32f0xx_hal_conf.h @@ -19,16 +19,18 @@ #define DATA_CACHE_ENABLE 0U #define USE_SPI_CRC 0U -#define HAL_RCC_MODULE_ENABLED #define HAL_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +// #define HAL_I2C_MODULE_ENABLED #ifdef HAL_RCC_MODULE_ENABLED #include -- cgit v1.2.3 From bf8c5fdb43ae2446a502227a95f17167c3dcda33 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Fri, 10 Mar 2023 13:12:02 +0100 Subject: add input emulation to test collision --- src/demo.c | 153 +++++++++++++++++++++++++++++++-- src/demo.h | 35 ++++++++ src/ds.mk | 4 +- src/entity.h | 15 ++++ src/input.h | 22 +++++ src/main.c | 248 +---------------------------------------------------- src/ppusim/input.c | 16 ++++ src/stm32.mk | 3 +- src/stm32/input.c | 13 +++ 9 files changed, 256 insertions(+), 253 deletions(-) create mode 100644 src/entity.h create mode 100644 src/input.h create mode 100644 src/ppusim/input.c create mode 100644 src/stm32/input.c diff --git a/src/demo.c b/src/demo.c index 019750a..c4e4d7a 100644 --- a/src/demo.c +++ b/src/demo.c @@ -2,10 +2,36 @@ #include "demo.h" #include "ppu/ppu.h" +#include "input.h" +#include "entity.h" -#define HH_DEMO_BALL_COUNT 5 +#define HH_DEMO_BALL_COUNT 1 hh_s_ppu_loc_fam_entry g_hh_demo_balls[HH_DEMO_BALL_COUNT]; +hh_s_entity_player g_hh_player_1 = { + .pos_x = 31000, //0b0000 0001 0011 0110 + .pos_y = 21000, + .radius = 8, + .speed = 1, + .direction_x = 1, + .rotation = 8, + .in_air = false, +}; + +void playerMovement(); + +uint16_t pos_x; //0b0000 0001 0011 0110 +uint16_t pos_y; +uint8_t left = 0; +uint8_t right = 0; +uint8_t up = 0; +uint8_t down = 0; +uint8_t pos_x_bit[2]; +uint8_t pos_y_bit[2]; +uint8_t data_send[3]; +int tileX; +int tileY; + void hh_demo_setup() { // load sprites hh_ppu_update_sprite(0, HH_DBG_SPRITE_BALL); @@ -39,6 +65,22 @@ void hh_demo_setup() { } void hh_demo_loop(unsigned long frame) { + playerMovement(); + + //adjust map size + pos_x = g_hh_player_1.pos_x / 100; + pos_y = g_hh_player_1.pos_y / 100; + + // input testing (no hitbox stuff) + // pos_x += (-1 * g_hh_controller_p1.dpad_left) + (1 * g_hh_controller_p1.dpad_right); // -1 = L || 1 == R + // pos_y += (-1 * g_hh_controller_p1.dpad_up) + (1 * g_hh_controller_p1.dpad_down); // -1 = D || 1 == U + + // update player sprite on ppu + g_hh_demo_balls[0].position_x = pos_x; + g_hh_demo_balls[0].position_y = pos_y; + hh_ppu_update_foreground(0, g_hh_demo_balls[0]); + + // set background pattern position hh_ppu_update_aux((hh_s_ppu_loc_aux) { .bg_shift_x = (frame / 2) % HH_PPU_SPRITE_WIDTH, @@ -46,10 +88,111 @@ void hh_demo_loop(unsigned long frame) { .fg_fetch = 0, .sysreset = 0, }); +} + +// void sendData(uint8_t address, uint16_t data) { +// uint8_t bitData[3]; +// bitData[2] = data & 0xff; +// bitData[1] = (data >> 8); +// bitData[0] = address; // first byte is address +// +// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); +// HAL_SPI_Transmit(&hspi1, bitData, 3, 100); //2*8 bit data +// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); +// } + +void playerMovement() { + int8_t directionX = (-1 * g_hh_controller_p1.dpad_left) + (1 * g_hh_controller_p1.dpad_right); // -1 = L || 1 == R + int8_t directionY = (-1 * g_hh_controller_p1.dpad_down) + (1 * g_hh_controller_p1.dpad_up); // -1 = D || 1 == U + + uint8_t i,j; + uint8_t rotation = 0; // 0-7 + + //rotation calc + for(i = -1; i < 2;i++) + { + for(j = -1; j < 2; j++) + { + if(directionX == i) + { + if(directionY == j) + { + if(i != 0 && j != 0) //dont update when player idle + { + g_hh_player_1.rotation = rotation; + } + } + } + rotation++; + } + } + //direction calc + if(directionX != 0) //update direction if player is not idle + { + g_hh_player_1.direction_x = directionX; + } + //collision map x-axis + + //tile calc including radius and direction for background coliision + + uint16_t tileColX; + uint16_t tileColY = ( g_hh_player_1.pos_y / 100) / 16; ; + + // remaining space between grid and exact + uint8_t modTileX; + uint8_t modTileY; + + if(g_hh_player_1.in_air == false && directionX != 0) + { + if(directionX == 1) + { + tileColX = ( ( g_hh_player_1.pos_x / 100) + g_hh_player_1.radius ) / 20; + modTileX = ( g_hh_player_1.pos_x + ( 100 * g_hh_player_1.radius ) ) % 2000; + } + else if(directionX == -1) + { + tileColX = ( ( g_hh_player_1.pos_x / 100) - g_hh_player_1.radius ) / 20; + modTileX = ( g_hh_player_1.pos_x - ( 100 * g_hh_player_1.radius ) ) % 2000; + } + + if(HH_DEMO_HITBOX_TILEMAP[tileColY][tileColX + directionX] != 1) + { + g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * g_hh_player_1.speed); // NEW x set + } + + else if(HH_DEMO_HITBOX_TILEMAP[tileColY][tileColX + directionX] == 1) + { + if(modTileX < g_hh_player_1.speed) + { + g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * modTileX); // NEW x set + } + else + { + g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * g_hh_player_1.speed); // NEW x set + } + } + + } + else //if in air different all borders have to be checked + { - for (unsigned i = 0; i < HH_DEMO_BALL_COUNT; i++) { - g_hh_demo_balls[i].position_x = HH_PPU_SCREEN_WIDTH/2 - HH_PPU_SPRITE_WIDTH/2 + (int)(60 * (double)sin((1*(double)frame / 10) + (double)i * 12)); - g_hh_demo_balls[i].position_y = HH_PPU_SCREEN_HEIGHT/2 - HH_PPU_SPRITE_HEIGHT/2 + (int)(30 * (double)sin((2*(double)frame / 10) + (double)i * 12)); - hh_ppu_update_foreground(i, g_hh_demo_balls[i]); } + + //collision map floor (y-axis) (falling) + // if falling no jump press (implement) + /* + tileColY = (( g_hh_player_1.pos_y / 100) + g_hh_player_1.radius) / 16; //bottom of player box + modTileY = 1; + if(HH_DEMO_HITBOX_TILEMAP[tileColY+1][tileColX] != 1) //rework after jumping + { + g_hh_player_1.pos_y = g_hh_player_1.pos_y + 5 ;// NEW y set //makew var gravity + //playerStat = falling; //for later use of graphics/sound + } + */ + //else if(HH_DEMO_HITBOX_TILEMAP[]) + + + + + } diff --git a/src/demo.h b/src/demo.h index 89436b5..ddf8403 100644 --- a/src/demo.h +++ b/src/demo.h @@ -42,3 +42,38 @@ static const hh_s_ppu_loc_sprite HH_DBG_SPRITE_CHECKERBOARD = { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }; + +static const uint8_t HH_DEMO_HITBOX_TILEMAP[30][40] = + { + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, + {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 } + }; + diff --git a/src/ds.mk b/src/ds.mk index b5633b3..57d1776 100644 --- a/src/ds.mk +++ b/src/ds.mk @@ -11,5 +11,5 @@ DESKTOP_SRCS += ppusim/sim.c \ ppusim/mem.c \ ppusim/pixel.c \ ppusim/work.c \ - ds.c - + ds.c \ + ppusim/input.c diff --git a/src/entity.h b/src/entity.h new file mode 100644 index 0000000..20cbf42 --- /dev/null +++ b/src/entity.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +typedef struct { + uint16_t pos_x; + uint16_t pos_y; + uint8_t radius; + uint8_t rotation; //45 degrees steps 0 == right 2 == down 4 == left 6 == up + uint8_t direction_x; //direction where its looking at in case no input; + int8_t speed; //10 default L/R MODifier + bool in_air; +} hh_s_entity_player; + diff --git a/src/input.h b/src/input.h new file mode 100644 index 0000000..adacba2 --- /dev/null +++ b/src/input.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +/** @brief game controller state */ +typedef struct { + bool dpad_up; + bool dpad_down; + bool dpad_left; + bool dpad_right; + bool button_primary; + bool button_secondary; +} hh_s_gamepad; + +/** @brief player 1's controller */ +extern hh_s_gamepad g_hh_controller_p1; +/** @brief player 2's controller */ +extern hh_s_gamepad g_hh_controller_p2; + +/** @brief update g_hh_controller_p1 and 2 by reading buttons */ +void hh_input_read(); + diff --git a/src/main.c b/src/main.c index ee6125f..fa63aa2 100644 --- a/src/main.c +++ b/src/main.c @@ -2,97 +2,12 @@ #include "main.h" #include "demo.h" +#include "input.h" bool g_hh_run = true; -static int8_t buttonDPAD[] = {0,0,0,0}; //1left 2right 3down 4up - -struct playerData{ - uint16_t posX; - uint16_t posY; - uint8_t radius; - uint8_t rotation; //45 degrees steps 0 == right 2 == down 4 == left 6 == up - uint8_t directionX; //direction where its looking at in case no input; - int8_t speed; //10 default L/R MODifier - bool inAir; - -}; - -struct playerData player1; - -uint8_t tileMap[30][40] = - { - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 }, - {1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1 } - - - - }; - -void buttonRead(); -void playerMovement(); -void sendData(uint8_t, uint16_t); - - uint16_t pos_x; //0b0000 0001 0011 0110 - uint16_t pos_y; - - uint8_t left = 0; - uint8_t right = 0; - uint8_t up = 0; - uint8_t down = 0; - - - - uint8_t pos_x_bit[2]; - uint8_t pos_y_bit[2]; - uint8_t data_send[3]; - - int tileX; - int tileY; -// struct playerData player1; - //int buttons[] = {GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_8}; // 1 left // 2 right // 3 up // 4 down - - int main() { hh_setup(); - -/// init struct - player1.posX = 31000; //0b0000 0001 0011 0110 - player1.posY = 21000; - player1.radius = 8; - player1.speed = 1; - player1.directionX = 1; - player1.rotation = 8; - player1.inAir = false; - hh_loop(); hh_exit(); return 0; @@ -100,165 +15,8 @@ int main() { void hh_ppu_vblank_interrupt() { static unsigned long frame = 0; + hh_input_read(); + hh_demo_loop(frame); frame++; - - buttonRead(); - playerMovement(); - - - // send data via SPI //adjust map size - pos_x = player1.posX / 100; - pos_y = player1.posY / 100; - - sendData(0b01000000,pos_x); - sendData(0b00000000,pos_y); - - // hh_demo_loop(frame); } -void sendData(uint8_t address, uint16_t data) -{ - uint8_t bitData[3]; - bitData[2] = data & 0xff; - bitData[1] = (data >> 8); - bitData[0] = address; // first byte is address - - - - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); - HAL_SPI_Transmit(&hspi1, bitData, 3, 100); //2*8 bit data - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); - -} - -void buttonRead() -{ - //int buttons[] = {GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_8}; // 1 left // 2 right // 3 down // 4 up 8-6-4-5 - uint16_t buttons[] = {0x0100U,0x0040U,0x0010U,0x0020U}; // 1 left // 2 right // 3 down // 4 up - - for(int i = 0; i < 4; i++) - { - if(HAL_GPIO_ReadPin(GPIOB, buttons[i]) == 1) - { - if((i+2) % 2 == 0) - { - buttonDPAD[i] = 1; - } - else - { - buttonDPAD[i] = -1; - } - } - else - { - buttonDPAD[i] = 0; - } - } -} - -void playerMovement() -{ - - int8_t directionX = 0; // -1 = L || 1 == R - int8_t directionY = 0; // -1 = D || 1 == U - - uint8_t i,j; - uint8_t rotation = 0; // 0-7 - //temp var for testing - - - - // direction calc - directionX = buttonDPAD[0] + buttonDPAD[1]; - directionY = buttonDPAD[2] + buttonDPAD[3]; - - //rotation calc - for(i = -1; i < 2;i++) - { - for(j = -1; j < 2; j++) - { - if(directionX == i) - { - if(directionY == j) - { - if(i != 0 && j != 0) //dont update when player idle - { - player1.rotation = rotation; - } - } - } - rotation++; - } - } - //direction calc - if(directionX != 0) //update direction if player is not idle - { - player1.directionX = directionX; - } - //collision map x-axis - - //tile calc including radius and direction for background coliision - - uint16_t tileColX; - uint16_t tileColY = ( player1.posY / 100) / 16; ; - - // remaining space between grid and exact - uint8_t modTileX; - uint8_t modTileY; - - - - if(player1.inAir == false && directionX != 0) - { - if(directionX == 1) - { - tileColX = ( ( player1.posX / 100) + player1.radius ) / 20; - modTileX = ( player1.posX + ( 100 * player1.radius ) ) % 2000; - } - else if(directionX == -1) - { - tileColX = ( ( player1.posX / 100) - player1.radius ) / 20; - modTileX = ( player1.posX - ( 100 * player1.radius ) ) % 2000; - } - - if(tileMap[tileColY][tileColX + directionX] != 1) - { - player1.posX = player1.posX + (directionX * player1.speed); // NEW x set - } - - else if(tileMap[tileColY][tileColX + directionX] == 1) - { - if(modTileX < player1.speed) - { - player1.posX = player1.posX + (directionX * modTileX); // NEW x set - } - else - { - player1.posX = player1.posX + (directionX * player1.speed); // NEW x set - } - } - - } - else //if in air different all borders have to be checked - { - - } - - //collision map floor (y-axis) (falling) - // if falling no jump press (implement) - /* - tileColY = (( player1.posY / 100) + player1.radius) / 16; //bottom of player box - modTileY = 1; - if(tileMap[tileColY+1][tileColX] != 1) //rework after jumping - { - player1.posY = player1.posY + 5 ;// NEW y set //makew var gravity - //playerStat = falling; //for later use of graphics/sound - } - */ - //else if(tileMap[]) - - - - - -} diff --git a/src/ppusim/input.c b/src/ppusim/input.c new file mode 100644 index 0000000..bdb94ac --- /dev/null +++ b/src/ppusim/input.c @@ -0,0 +1,16 @@ +#include + +#include "input.h" + +hh_s_gamepad g_hh_controller_p1 = { 0 }; +hh_s_gamepad g_hh_controller_p2 = { 0 }; + +void hh_input_read() { + // SDL_PumpEvents(); + const Uint8* kb = SDL_GetKeyboardState(NULL); + g_hh_controller_p1.dpad_up = kb[SDL_SCANCODE_W]; + g_hh_controller_p1.dpad_down = kb[SDL_SCANCODE_S]; + g_hh_controller_p1.dpad_left = kb[SDL_SCANCODE_A]; + g_hh_controller_p1.dpad_right = kb[SDL_SCANCODE_D]; +} + diff --git a/src/stm32.mk b/src/stm32.mk index eab34a4..3b5ccb9 100644 --- a/src/stm32.mk +++ b/src/stm32.mk @@ -62,5 +62,6 @@ STM_SRCS += lib/STM32-base-STM32Cube/HAL/STM32F0xx/src/stm32f0xx_hal.c \ STM_SRCS += stm32/idle_task_static_memory.c \ stm32/main.c \ stm32/setup.c \ - ppu/stm.c + ppu/stm.c \ + stm32/input.c diff --git a/src/stm32/input.c b/src/stm32/input.c new file mode 100644 index 0000000..e2d07cb --- /dev/null +++ b/src/stm32/input.c @@ -0,0 +1,13 @@ +#include + +#include "input.h" + +hh_s_gamepad g_hh_controller_p1 = { 0 }; +hh_s_gamepad g_hh_controller_p2 = { 0 }; + +void hh_input_read() { + g_hh_controller_p1.dpad_left = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4); + g_hh_controller_p1.dpad_right = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5); + g_hh_controller_p1.dpad_down = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6); + g_hh_controller_p1.dpad_up = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8); +} -- cgit v1.2.3 From c37397234534e9888dfeed9b1728c46646c33b58 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Fri, 10 Mar 2023 13:16:16 +0100 Subject: `clang-format` --- src/demo.c | 182 +++++++++++++++++++++++----------------------------- src/ds.c | 2 +- src/main.c | 3 +- src/makefile | 4 +- src/ppu/internals.c | 75 +++++++--------------- src/ppu/ppu.c | 22 +++---- src/ppusim/input.c | 13 ++-- src/ppusim/mem.c | 4 +- src/ppusim/pixel.c | 77 +++++++++++----------- src/ppusim/sim.c | 16 +++-- src/ppusim/work.c | 35 +++++----- 11 files changed, 186 insertions(+), 247 deletions(-) diff --git a/src/demo.c b/src/demo.c index c4e4d7a..b9bba17 100644 --- a/src/demo.c +++ b/src/demo.c @@ -1,36 +1,36 @@ #include #include "demo.h" -#include "ppu/ppu.h" -#include "input.h" #include "entity.h" +#include "input.h" +#include "ppu/ppu.h" #define HH_DEMO_BALL_COUNT 1 hh_s_ppu_loc_fam_entry g_hh_demo_balls[HH_DEMO_BALL_COUNT]; hh_s_entity_player g_hh_player_1 = { - .pos_x = 31000, //0b0000 0001 0011 0110 - .pos_y = 21000, - .radius = 8, - .speed = 1, + .pos_x = 31000, // 0b0000 0001 0011 0110 + .pos_y = 21000, + .radius = 8, + .speed = 1, .direction_x = 1, - .rotation = 8, - .in_air = false, + .rotation = 8, + .in_air = false, }; -void playerMovement(); +void hh_player_movement(); -uint16_t pos_x; //0b0000 0001 0011 0110 -uint16_t pos_y; -uint8_t left = 0; -uint8_t right = 0; -uint8_t up = 0; -uint8_t down = 0; -uint8_t pos_x_bit[2]; -uint8_t pos_y_bit[2]; -uint8_t data_send[3]; -int tileX; -int tileY; +uint16_t g_hh_pos_x; // 0b0000 0001 0011 0110 +uint16_t g_hh_pos_y; +uint8_t g_hh_left = 0; +uint8_t g_hh_right = 0; +uint8_t g_hh_up = 0; +uint8_t g_hh_down = 0; +uint8_t g_hh_pos_x_bit[2]; +uint8_t g_hh_pos_y_bit[2]; +uint8_t g_hh_data_send[3]; +int g_hh_tile_x; +int g_hh_tile_y; void hh_demo_setup() { // load sprites @@ -38,55 +38,54 @@ void hh_demo_setup() { hh_ppu_update_sprite(1, HH_DBG_SPRITE_CHECKERBOARD); // background pattern - hh_ppu_update_color(0, 1, (hh_ppu_rgb_color_t) {0x4, 0x4, 0x4}); + hh_ppu_update_color(0, 1, (hh_ppu_rgb_color_t){0x4, 0x4, 0x4}); for (unsigned i = 0; i < HH_PPU_BG_CANVAS_TILES_H * HH_PPU_BG_CANVAS_TILES_V; i++) { - hh_ppu_update_background(i, (hh_s_ppu_loc_bam_entry) { - .horizontal_flip = false, - .vertical_flip = false, - .palette_index = 0, - .tilemap_index = 1, - }); + hh_ppu_update_background(i, (hh_s_ppu_loc_bam_entry){ + .horizontal_flip = false, + .vertical_flip = false, + .palette_index = 0, + .tilemap_index = 1, + }); } // cool colors - hh_ppu_update_color(1, 1, (hh_ppu_rgb_color_t) {0xf, 0x0, 0xf}); - hh_ppu_update_color(2, 1, (hh_ppu_rgb_color_t) {0xf, 0xf, 0xf}); - hh_ppu_update_color(3, 1, (hh_ppu_rgb_color_t) {0xf, 0x0, 0x0}); - hh_ppu_update_color(4, 1, (hh_ppu_rgb_color_t) {0x0, 0xf, 0xf}); - hh_ppu_update_color(5, 1, (hh_ppu_rgb_color_t) {0x0, 0x0, 0xf}); + hh_ppu_update_color(1, 1, (hh_ppu_rgb_color_t){0xf, 0x0, 0xf}); + hh_ppu_update_color(2, 1, (hh_ppu_rgb_color_t){0xf, 0xf, 0xf}); + hh_ppu_update_color(3, 1, (hh_ppu_rgb_color_t){0xf, 0x0, 0x0}); + hh_ppu_update_color(4, 1, (hh_ppu_rgb_color_t){0x0, 0xf, 0xf}); + hh_ppu_update_color(5, 1, (hh_ppu_rgb_color_t){0x0, 0x0, 0xf}); // balls for (unsigned i = 0; i < HH_DEMO_BALL_COUNT; i++) { g_hh_demo_balls[i].horizontal_flip = false; - g_hh_demo_balls[i].vertical_flip = false; - g_hh_demo_balls[i].palette_index = i+1; - g_hh_demo_balls[i].tilemap_index = 0; + g_hh_demo_balls[i].vertical_flip = false; + g_hh_demo_balls[i].palette_index = i + 1; + g_hh_demo_balls[i].tilemap_index = 0; } } void hh_demo_loop(unsigned long frame) { - playerMovement(); + hh_player_movement(); + + // adjust map size + g_hh_pos_x = g_hh_player_1.pos_x / 100; + g_hh_pos_y = g_hh_player_1.pos_y / 100; - //adjust map size - pos_x = g_hh_player_1.pos_x / 100; - pos_y = g_hh_player_1.pos_y / 100; - // input testing (no hitbox stuff) // pos_x += (-1 * g_hh_controller_p1.dpad_left) + (1 * g_hh_controller_p1.dpad_right); // -1 = L || 1 == R // pos_y += (-1 * g_hh_controller_p1.dpad_up) + (1 * g_hh_controller_p1.dpad_down); // -1 = D || 1 == U // update player sprite on ppu - g_hh_demo_balls[0].position_x = pos_x; - g_hh_demo_balls[0].position_y = pos_y; + g_hh_demo_balls[0].position_x = g_hh_pos_x; + g_hh_demo_balls[0].position_y = g_hh_pos_y; hh_ppu_update_foreground(0, g_hh_demo_balls[0]); - // set background pattern position - hh_ppu_update_aux((hh_s_ppu_loc_aux) { + hh_ppu_update_aux((hh_s_ppu_loc_aux){ .bg_shift_x = (frame / 2) % HH_PPU_SPRITE_WIDTH, .bg_shift_y = (frame / 8) % HH_PPU_SPRITE_HEIGHT, - .fg_fetch = 0, - .sysreset = 0, + .fg_fetch = 0, + .sysreset = 0, }); } @@ -95,91 +94,77 @@ void hh_demo_loop(unsigned long frame) { // bitData[2] = data & 0xff; // bitData[1] = (data >> 8); // bitData[0] = address; // first byte is address -// +// // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); // HAL_SPI_Transmit(&hspi1, bitData, 3, 100); //2*8 bit data // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); // } -void playerMovement() { +void hh_player_movement() { int8_t directionX = (-1 * g_hh_controller_p1.dpad_left) + (1 * g_hh_controller_p1.dpad_right); // -1 = L || 1 == R - int8_t directionY = (-1 * g_hh_controller_p1.dpad_down) + (1 * g_hh_controller_p1.dpad_up); // -1 = D || 1 == U + int8_t directionY = (-1 * g_hh_controller_p1.dpad_down) + (1 * g_hh_controller_p1.dpad_up); // -1 = D || 1 == U - uint8_t i,j; + uint8_t i, j; uint8_t rotation = 0; // 0-7 - //rotation calc - for(i = -1; i < 2;i++) - { - for(j = -1; j < 2; j++) - { - if(directionX == i) - { - if(directionY == j) - { - if(i != 0 && j != 0) //dont update when player idle + // rotation calc + for (i = -1; i < 2; i++) { + for (j = -1; j < 2; j++) { + if (directionX == i) { + if (directionY == j) { + if (i != 0 && j != 0) // dont update when player idle { g_hh_player_1.rotation = rotation; } } } - rotation++; + rotation++; } } - //direction calc - if(directionX != 0) //update direction if player is not idle + // direction calc + if (directionX != 0) // update direction if player is not idle { g_hh_player_1.direction_x = directionX; } - //collision map x-axis + // collision map x-axis - //tile calc including radius and direction for background coliision + // tile calc including radius and direction for background coliision uint16_t tileColX; - uint16_t tileColY = ( g_hh_player_1.pos_y / 100) / 16; ; + uint16_t tileColY = (g_hh_player_1.pos_y / 100) / 16; + ; // remaining space between grid and exact uint8_t modTileX; uint8_t modTileY; - if(g_hh_player_1.in_air == false && directionX != 0) - { - if(directionX == 1) - { - tileColX = ( ( g_hh_player_1.pos_x / 100) + g_hh_player_1.radius ) / 20; - modTileX = ( g_hh_player_1.pos_x + ( 100 * g_hh_player_1.radius ) ) % 2000; + if (g_hh_player_1.in_air == false && directionX != 0) { + if (directionX == 1) { + tileColX = ((g_hh_player_1.pos_x / 100) + g_hh_player_1.radius) / 20; + modTileX = (g_hh_player_1.pos_x + (100 * g_hh_player_1.radius)) % 2000; + } else if (directionX == -1) { + tileColX = ((g_hh_player_1.pos_x / 100) - g_hh_player_1.radius) / 20; + modTileX = (g_hh_player_1.pos_x - (100 * g_hh_player_1.radius)) % 2000; } - else if(directionX == -1) - { - tileColX = ( ( g_hh_player_1.pos_x / 100) - g_hh_player_1.radius ) / 20; - modTileX = ( g_hh_player_1.pos_x - ( 100 * g_hh_player_1.radius ) ) % 2000; + + if (HH_DEMO_HITBOX_TILEMAP[tileColY][tileColX + directionX] != 1) { + g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * g_hh_player_1.speed); // NEW x set } - if(HH_DEMO_HITBOX_TILEMAP[tileColY][tileColX + directionX] != 1) - { + else if (HH_DEMO_HITBOX_TILEMAP[tileColY][tileColX + directionX] == 1) { + if (modTileX < g_hh_player_1.speed) { + g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * modTileX); // NEW x set + } else { g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * g_hh_player_1.speed); // NEW x set } + } - else if(HH_DEMO_HITBOX_TILEMAP[tileColY][tileColX + directionX] == 1) - { - if(modTileX < g_hh_player_1.speed) - { - g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * modTileX); // NEW x set - } - else - { - g_hh_player_1.pos_x = g_hh_player_1.pos_x + (directionX * g_hh_player_1.speed); // NEW x set - } - } - - } - else //if in air different all borders have to be checked + } else // if in air different all borders have to be checked { - } - //collision map floor (y-axis) (falling) - // if falling no jump press (implement) + // collision map floor (y-axis) (falling) + // if falling no jump press (implement) /* tileColY = (( g_hh_player_1.pos_y / 100) + g_hh_player_1.radius) / 16; //bottom of player box modTileY = 1; @@ -189,10 +174,5 @@ void playerMovement() { //playerStat = falling; //for later use of graphics/sound } */ - //else if(HH_DEMO_HITBOX_TILEMAP[]) - - - - - + // else if(HH_DEMO_HITBOX_TILEMAP[]) } diff --git a/src/ds.c b/src/ds.c index d6d4357..24ef58f 100644 --- a/src/ds.c +++ b/src/ds.c @@ -1,6 +1,6 @@ +#include "demo.h" #include "main.h" #include "ppu/ppu.h" -#include "demo.h" void hh_setup() { hh_ppu_init(); diff --git a/src/main.c b/src/main.c index fa63aa2..191d5d9 100644 --- a/src/main.c +++ b/src/main.c @@ -1,8 +1,8 @@ #include -#include "main.h" #include "demo.h" #include "input.h" +#include "main.h" bool g_hh_run = true; @@ -19,4 +19,3 @@ void hh_ppu_vblank_interrupt() { hh_demo_loop(frame); frame++; } - diff --git a/src/makefile b/src/makefile index 1115874..c69bfb5 100644 --- a/src/makefile +++ b/src/makefile @@ -81,8 +81,8 @@ compile_commands.json: makefile stm32.mk ds.mk PHONY += format format: - clang-format -i $(LOCAL_SRCS) - clang-tidy --fix-errors $(LOCAL_SRCS) + clang-format -i $(LOCAL_SRCS) $(DESKTOP_SRCS) + clang-tidy --fix-errors $(LOCAL_SRCS) $(DESKTOP_SRCS) PHONY += clean clean: diff --git a/src/ppu/internals.c b/src/ppu/internals.c index 650ba3e..b8d3e27 100644 --- a/src/ppu/internals.c +++ b/src/ppu/internals.c @@ -1,8 +1,8 @@ #include -#include "ppu/types.h" -#include "ppu/internals.h" #include "ppu/consts.h" +#include "ppu/internals.h" +#include "ppu/types.h" bool hh_ppu_vram_valid_address(hh_ppu_addr_t addr) { #pragma GCC diagnostic push @@ -17,88 +17,59 @@ bool hh_ppu_vram_valid_address(hh_ppu_addr_t addr) { } void hh_ppu_vram_write(hh_s_ppu_vram_data data) { - for (unsigned i = 0; i < data.size; i++) - hh_ppu_vram_dwrite(data.offset + i, data.data[i]); + for (unsigned i = 0; i < data.size; i++) hh_ppu_vram_dwrite(data.offset + i, data.data[i]); } hh_s_ppu_vram_data hh_ppu_2nat_bam(hh_s_ppu_loc_bam_entry e) { - hh_ppu_data_t* data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_BAM_ENTRY_SIZE); + hh_ppu_data_t *data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_BAM_ENTRY_SIZE); - data[0] = HH_RESIZE(e.tilemap_index, 9, 0) << 0 | - HH_RESIZE(e.palette_index, 2, 0) << 10 | - e.vertical_flip << 13 | - e.horizontal_flip << 14; + data[0] = HH_RESIZE(e.tilemap_index, 9, 0) << 0 | HH_RESIZE(e.palette_index, 2, 0) << 10 | e.vertical_flip << 13 | e.horizontal_flip << 14; - hh_s_ppu_vram_data out = { - .data = data, - .size = HH_PPU_VRAM_FAM_ENTRY_SIZE - }; + hh_s_ppu_vram_data out = {.data = data, .size = HH_PPU_VRAM_FAM_ENTRY_SIZE}; return out; } hh_s_ppu_vram_data hh_ppu_2nat_fam(hh_s_ppu_loc_fam_entry e) { - hh_ppu_data_t* data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_FAM_ENTRY_SIZE); + hh_ppu_data_t *data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_FAM_ENTRY_SIZE); e.position_x += 16; e.position_y += 16; - data[0] = HH_RESIZE(e.tilemap_index, 9, 0) << 0 | - HH_RESIZE(e.palette_index, 2, 0) << 10 | - HH_RESIZE(e.position_y, 2, 0) << 13; - data[1] = HH_RESIZE(e.position_y, 7, 3) << 0 | - HH_RESIZE(e.position_x, 8, 0) << 5 | - e.vertical_flip << 14 | - e.horizontal_flip << 15; - - hh_s_ppu_vram_data out = { - .data = data, - .size = HH_PPU_VRAM_FAM_ENTRY_SIZE - }; + data[0] = HH_RESIZE(e.tilemap_index, 9, 0) << 0 | HH_RESIZE(e.palette_index, 2, 0) << 10 | HH_RESIZE(e.position_y, 2, 0) << 13; + data[1] = HH_RESIZE(e.position_y, 7, 3) << 0 | HH_RESIZE(e.position_x, 8, 0) << 5 | e.vertical_flip << 14 | e.horizontal_flip << 15; + + hh_s_ppu_vram_data out = {.data = data, .size = HH_PPU_VRAM_FAM_ENTRY_SIZE}; return out; } hh_s_ppu_vram_data hh_ppu_2nat_aux(hh_s_ppu_loc_aux aux) { - hh_ppu_data_t* data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_AUX_SIZE); - - data[0] = HH_RESIZE(aux.bg_shift_y, 7, 0) << 0 | - HH_RESIZE(aux.bg_shift_x, 7, 0) << 8; - data[1] = HH_RESIZE(aux.bg_shift_x, 8, 8) << 0 | - aux.fg_fetch << 1 | - aux.sysreset << 2; - - hh_s_ppu_vram_data out = { - .data = data, - .size = HH_PPU_VRAM_AUX_SIZE - }; + hh_ppu_data_t *data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_AUX_SIZE); + + data[0] = HH_RESIZE(aux.bg_shift_y, 7, 0) << 0 | HH_RESIZE(aux.bg_shift_x, 7, 0) << 8; + data[1] = HH_RESIZE(aux.bg_shift_x, 8, 8) << 0 | aux.fg_fetch << 1 | aux.sysreset << 2; + + hh_s_ppu_vram_data out = {.data = data, .size = HH_PPU_VRAM_AUX_SIZE}; return out; } hh_s_ppu_vram_data hh_ppu_2nat_sprite(const hh_ppu_loc_sprite_data_t sprite_data) { - hh_ppu_data_t* data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_TMM_SPRITE_SIZE); + hh_ppu_data_t *data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_TMM_SPRITE_SIZE); for (unsigned i = 0; i < HH_PPU_SPRITE_WIDTH * HH_PPU_SPRITE_HEIGHT; i++) { - unsigned word = i / 5; + unsigned word = i / 5; unsigned pixel = i % 5; if (pixel == 0) data[word] = 0; data[word] |= HH_RESIZE(sprite_data[i], 2, 0) << pixel * 3; } - hh_s_ppu_vram_data out = { - .data = data, - .size = HH_PPU_VRAM_TMM_SPRITE_SIZE - }; + hh_s_ppu_vram_data out = {.data = data, .size = HH_PPU_VRAM_TMM_SPRITE_SIZE}; return out; } hh_s_ppu_vram_data hh_ppu_2nat_color(hh_ppu_rgb_color_t rgb) { - hh_ppu_data_t* data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_PAL_ENTRY_SIZE); + hh_ppu_data_t *data = malloc(sizeof(hh_ppu_data_t) * HH_PPU_VRAM_PAL_ENTRY_SIZE); - data[0] = HH_RESIZE(rgb[0], 3, 0) << 8 | - HH_RESIZE(rgb[1], 3, 0) << 4 | - HH_RESIZE(rgb[2], 3, 0) << 0; + data[0] = HH_RESIZE(rgb[0], 3, 0) << 8 | HH_RESIZE(rgb[1], 3, 0) << 4 | HH_RESIZE(rgb[2], 3, 0) << 0; - hh_s_ppu_vram_data out = { - .data = data, - .size = HH_PPU_VRAM_PAL_ENTRY_SIZE - }; + hh_s_ppu_vram_data out = {.data = data, .size = HH_PPU_VRAM_PAL_ENTRY_SIZE}; return out; } diff --git a/src/ppu/ppu.c b/src/ppu/ppu.c index 5f33c55..df14b9f 100644 --- a/src/ppu/ppu.c +++ b/src/ppu/ppu.c @@ -1,52 +1,48 @@ #include -#include "ppu/ppu.h" -#include "ppu/internals.h" #include "ppu/consts.h" +#include "ppu/internals.h" +#include "ppu/ppu.h" void hh_ppu_update_foreground(unsigned index, hh_s_ppu_loc_fam_entry e) { hh_s_ppu_vram_data s = hh_ppu_2nat_fam(e); - s.offset = HH_PPU_VRAM_FAM_OFFSET + HH_PPU_VRAM_FAM_ENTRY_SIZE * index; + s.offset = HH_PPU_VRAM_FAM_OFFSET + HH_PPU_VRAM_FAM_ENTRY_SIZE * index; hh_ppu_vram_write(s); free(s.data); } void hh_ppu_update_background(unsigned index, hh_s_ppu_loc_bam_entry e) { hh_s_ppu_vram_data s = hh_ppu_2nat_bam(e); - s.offset = HH_PPU_VRAM_BAM_OFFSET + HH_PPU_VRAM_BAM_ENTRY_SIZE * index; + s.offset = HH_PPU_VRAM_BAM_OFFSET + HH_PPU_VRAM_BAM_ENTRY_SIZE * index; hh_ppu_vram_write(s); free(s.data); } void hh_ppu_update_sprite(unsigned tilemap_index, const hh_s_ppu_loc_sprite sprite) { hh_s_ppu_vram_data s = hh_ppu_2nat_sprite(sprite); - s.offset = HH_PPU_VRAM_TMM_OFFSET + HH_PPU_VRAM_TMM_SPRITE_SIZE * tilemap_index; + s.offset = HH_PPU_VRAM_TMM_OFFSET + HH_PPU_VRAM_TMM_SPRITE_SIZE * tilemap_index; hh_ppu_vram_write(s); free(s.data); } void hh_ppu_update_aux(hh_s_ppu_loc_aux aux) { hh_s_ppu_vram_data a = hh_ppu_2nat_aux(aux); - a.offset = HH_PPU_VRAM_AUX_OFFSET; + a.offset = HH_PPU_VRAM_AUX_OFFSET; hh_ppu_vram_write(a); free(a.data); } void hh_ppu_update_palette_table(hh_ppu_loc_palette_table_t table) { - for(unsigned i = 0; i < HH_PPU_PALETTE_COUNT; i++) - hh_ppu_update_palette(i, table[i]); + for (unsigned i = 0; i < HH_PPU_PALETTE_COUNT; i++) hh_ppu_update_palette(i, table[i]); } void hh_ppu_update_palette(unsigned palette_index, hh_ppu_loc_palette_data_t palette) { - for(unsigned i = 0; i < HH_PPU_PALETTE_COLOR_COUNT; i++) - hh_ppu_update_color(palette_index, i, palette[i]); + for (unsigned i = 0; i < HH_PPU_PALETTE_COLOR_COUNT; i++) hh_ppu_update_color(palette_index, i, palette[i]); } void hh_ppu_update_color(unsigned palette_index, unsigned color_index, hh_ppu_rgb_color_t color) { hh_s_ppu_vram_data c = hh_ppu_2nat_color(color); - c.offset = HH_PPU_VRAM_PAL_OFFSET + - palette_index * HH_PPU_VRAM_PAL_ENTRY_SIZE * HH_PPU_PALETTE_COLOR_COUNT + - color_index * HH_PPU_VRAM_PAL_ENTRY_SIZE; + c.offset = HH_PPU_VRAM_PAL_OFFSET + palette_index * HH_PPU_VRAM_PAL_ENTRY_SIZE * HH_PPU_PALETTE_COLOR_COUNT + color_index * HH_PPU_VRAM_PAL_ENTRY_SIZE; hh_ppu_vram_write(c); free(c.data); } diff --git a/src/ppusim/input.c b/src/ppusim/input.c index bdb94ac..08bc382 100644 --- a/src/ppusim/input.c +++ b/src/ppusim/input.c @@ -2,15 +2,14 @@ #include "input.h" -hh_s_gamepad g_hh_controller_p1 = { 0 }; -hh_s_gamepad g_hh_controller_p2 = { 0 }; +hh_s_gamepad g_hh_controller_p1 = {0}; +hh_s_gamepad g_hh_controller_p2 = {0}; void hh_input_read() { // SDL_PumpEvents(); - const Uint8* kb = SDL_GetKeyboardState(NULL); - g_hh_controller_p1.dpad_up = kb[SDL_SCANCODE_W]; - g_hh_controller_p1.dpad_down = kb[SDL_SCANCODE_S]; - g_hh_controller_p1.dpad_left = kb[SDL_SCANCODE_A]; + const Uint8 *kb = SDL_GetKeyboardState(NULL); + g_hh_controller_p1.dpad_up = kb[SDL_SCANCODE_W]; + g_hh_controller_p1.dpad_down = kb[SDL_SCANCODE_S]; + g_hh_controller_p1.dpad_left = kb[SDL_SCANCODE_A]; g_hh_controller_p1.dpad_right = kb[SDL_SCANCODE_D]; } - diff --git a/src/ppusim/mem.c b/src/ppusim/mem.c index e3f41f5..bd8606e 100644 --- a/src/ppusim/mem.c +++ b/src/ppusim/mem.c @@ -1,8 +1,8 @@ -#include #include +#include -#include "ppusim/mem.h" #include "ppu/internals.h" +#include "ppusim/mem.h" hh_ppu_data_t *g_hh_ppusim_vram = NULL; diff --git a/src/ppusim/pixel.c b/src/ppusim/pixel.c index 6e915e6..0457d55 100644 --- a/src/ppusim/pixel.c +++ b/src/ppusim/pixel.c @@ -1,10 +1,10 @@ #include #include -#include "ppusim/work.h" +#include "ppu/consts.h" #include "ppu/internals.h" #include "ppusim/mem.h" -#include "ppu/consts.h" +#include "ppusim/work.h" /* transform xy if tile is flipped */ static uint16_t hh_ppusim_apply_transform(unsigned x, unsigned y, bool fliph, bool flipv) { @@ -15,25 +15,25 @@ static uint16_t hh_ppusim_apply_transform(unsigned x, unsigned y, bool fliph, bo /* @brief get current bg pixel cidx */ static uint8_t hh_ppusim_bg_pixel(unsigned x, unsigned y) { - hh_ppu_data_t* aux = &g_hh_ppusim_vram[HH_PPU_VRAM_AUX_OFFSET]; - unsigned bg_shift_y = HH_RESIZE(aux[0], 7, 0); - unsigned bg_shift_x = HH_RESIZE(aux[0], 15, 8) | HH_RESIZE(aux[1], 0, 0) << 8; - unsigned abs_x = bg_shift_x + x; - unsigned abs_y = bg_shift_y + y; - unsigned grid_x = abs_x / HH_PPU_SPRITE_WIDTH; - unsigned grid_y = abs_y / HH_PPU_SPRITE_HEIGHT; - unsigned loc_x = abs_x - grid_x * HH_PPU_SPRITE_WIDTH; - unsigned loc_y = abs_y - grid_y * HH_PPU_SPRITE_HEIGHT; - unsigned bam_offset = grid_y * HH_PPU_BG_CANVAS_TILES_H + grid_x; - hh_ppu_data_t bam = g_hh_ppusim_vram[HH_PPU_VRAM_BAM_OFFSET + bam_offset]; - uint8_t cidx = 0; + hh_ppu_data_t *aux = &g_hh_ppusim_vram[HH_PPU_VRAM_AUX_OFFSET]; + unsigned bg_shift_y = HH_RESIZE(aux[0], 7, 0); + unsigned bg_shift_x = HH_RESIZE(aux[0], 15, 8) | HH_RESIZE(aux[1], 0, 0) << 8; + unsigned abs_x = bg_shift_x + x; + unsigned abs_y = bg_shift_y + y; + unsigned grid_x = abs_x / HH_PPU_SPRITE_WIDTH; + unsigned grid_y = abs_y / HH_PPU_SPRITE_HEIGHT; + unsigned loc_x = abs_x - grid_x * HH_PPU_SPRITE_WIDTH; + unsigned loc_y = abs_y - grid_y * HH_PPU_SPRITE_HEIGHT; + unsigned bam_offset = grid_y * HH_PPU_BG_CANVAS_TILES_H + grid_x; + hh_ppu_data_t bam = g_hh_ppusim_vram[HH_PPU_VRAM_BAM_OFFSET + bam_offset]; + uint8_t cidx = 0; uint16_t tile_pixel_idx = hh_ppusim_apply_transform(loc_x, loc_y, HH_RESIZE(bam, 14, 14), HH_RESIZE(bam, 13, 13)); - uint16_t tile_idx = HH_RESIZE(bam, 9, 0); - hh_ppu_addr_t ttm_addr = tile_idx * HH_PPU_VRAM_TMM_SPRITE_SIZE + tile_pixel_idx / 5; - uint8_t word_bit_addr = (tile_pixel_idx % 5) * 3; - hh_ppu_data_t tmm = g_hh_ppusim_vram[HH_PPU_VRAM_TMM_OFFSET + ttm_addr]; + uint16_t tile_idx = HH_RESIZE(bam, 9, 0); + hh_ppu_addr_t ttm_addr = tile_idx * HH_PPU_VRAM_TMM_SPRITE_SIZE + tile_pixel_idx / 5; + uint8_t word_bit_addr = (tile_pixel_idx % 5) * 3; + hh_ppu_data_t tmm = g_hh_ppusim_vram[HH_PPU_VRAM_TMM_OFFSET + ttm_addr]; cidx |= HH_RESIZE(bam, 12, 10) << 3; - cidx |= HH_RESIZE(tmm, word_bit_addr+2, word_bit_addr) << 0; + cidx |= HH_RESIZE(tmm, word_bit_addr + 2, word_bit_addr) << 0; return cidx; } @@ -44,42 +44,37 @@ static uint8_t hh_ppusim_fg_pixel(unsigned x, unsigned y) { uint8_t cidx = 0; for (unsigned i = 0; i < HH_PPU_FG_SPRITE_COUNT; i++) { unsigned fam_offset = i * HH_PPU_VRAM_FAM_ENTRY_SIZE; - hh_ppu_data_t* fam = &g_hh_ppusim_vram[HH_PPU_VRAM_FAM_OFFSET + fam_offset]; - unsigned sprite_y = HH_RESIZE(fam[0], 15, 13) | HH_RESIZE(fam[1], 4, 0) << 3; - unsigned sprite_x = HH_RESIZE(fam[1], 13, 5); + hh_ppu_data_t *fam = &g_hh_ppusim_vram[HH_PPU_VRAM_FAM_OFFSET + fam_offset]; + unsigned sprite_y = HH_RESIZE(fam[0], 15, 13) | HH_RESIZE(fam[1], 4, 0) << 3; + unsigned sprite_x = HH_RESIZE(fam[1], 13, 5); if (x < sprite_x) continue; if (x >= sprite_x + HH_PPU_SPRITE_WIDTH) continue; if (y < sprite_y) continue; if (y >= sprite_y + HH_PPU_SPRITE_HEIGHT) continue; - unsigned loc_x = x - sprite_x; - unsigned loc_y = y - sprite_y; + unsigned loc_x = x - sprite_x; + unsigned loc_y = y - sprite_y; uint16_t tile_pixel_idx = hh_ppusim_apply_transform(loc_x, loc_y, HH_RESIZE(fam[1], 15, 15), HH_RESIZE(fam[1], 14, 14)); - uint16_t tile_idx = HH_RESIZE(fam[0], 9, 0); - hh_ppu_addr_t ttm_addr = tile_idx * HH_PPU_VRAM_TMM_SPRITE_SIZE + tile_pixel_idx / 5; - uint8_t word_bit_addr = (tile_pixel_idx % 5) * 3; - hh_ppu_data_t tmm = g_hh_ppusim_vram[HH_PPU_VRAM_TMM_OFFSET + ttm_addr]; - unsigned cidx_col = HH_RESIZE(tmm, word_bit_addr+2, word_bit_addr); + uint16_t tile_idx = HH_RESIZE(fam[0], 9, 0); + hh_ppu_addr_t ttm_addr = tile_idx * HH_PPU_VRAM_TMM_SPRITE_SIZE + tile_pixel_idx / 5; + uint8_t word_bit_addr = (tile_pixel_idx % 5) * 3; + hh_ppu_data_t tmm = g_hh_ppusim_vram[HH_PPU_VRAM_TMM_OFFSET + ttm_addr]; + unsigned cidx_col = HH_RESIZE(tmm, word_bit_addr + 2, word_bit_addr); if (cidx_col == 0) continue; unsigned cidx_pal = HH_RESIZE(fam[0], 12, 10); - cidx = (cidx_col << 0) | (cidx_pal << 3); + cidx = (cidx_col << 0) | (cidx_pal << 3); break; } return cidx; } -void hh_ppusim_pixel(uint8_t* s, unsigned x, unsigned y) { - uint8_t bg_cidx = hh_ppusim_bg_pixel(x, y); - uint8_t fg_cidx = hh_ppusim_fg_pixel(x, y); - uint8_t cidx = (fg_cidx & HH_MASK(3)) == 0 ? bg_cidx : fg_cidx; - hh_ppu_data_t pal_rgb = g_hh_ppusim_vram[HH_PPU_VRAM_PAL_OFFSET + cidx]; - hh_ppu_rgb_color_t rgb = { - HH_RESIZE(pal_rgb, 11, 8), - HH_RESIZE(pal_rgb, 7, 4), - HH_RESIZE(pal_rgb, 3, 0) - }; +void hh_ppusim_pixel(uint8_t *s, unsigned x, unsigned y) { + uint8_t bg_cidx = hh_ppusim_bg_pixel(x, y); + uint8_t fg_cidx = hh_ppusim_fg_pixel(x, y); + uint8_t cidx = (fg_cidx & HH_MASK(3)) == 0 ? bg_cidx : fg_cidx; + hh_ppu_data_t pal_rgb = g_hh_ppusim_vram[HH_PPU_VRAM_PAL_OFFSET + cidx]; + hh_ppu_rgb_color_t rgb = {HH_RESIZE(pal_rgb, 11, 8), HH_RESIZE(pal_rgb, 7, 4), HH_RESIZE(pal_rgb, 3, 0)}; s[0] = rgb[0] << 4; s[1] = rgb[1] << 4; s[2] = rgb[2] << 4; } - diff --git a/src/ppusim/sim.c b/src/ppusim/sim.c index 2816b31..449b78d 100644 --- a/src/ppusim/sim.c +++ b/src/ppusim/sim.c @@ -1,6 +1,6 @@ -#include -#include #include +#include +#include #include "main.h" #include "ppu/ppu.h" @@ -8,16 +8,17 @@ #include "ppusim/sim.h" #include "ppusim/work.h" -SDL_Window *g_hh_window = NULL; +SDL_Window *g_hh_window = NULL; SDL_Renderer *g_hh_renderer = NULL; void hh_ppu_init() { SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS); - g_hh_window = SDL_CreateWindow("ppusim", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, HH_PPU_SCREEN_WIDTH * HH_PPUSIM_UPSCALE_FACTOR, HH_PPU_SCREEN_HEIGHT * HH_PPUSIM_UPSCALE_FACTOR, SDL_WINDOW_SHOWN); + g_hh_window = SDL_CreateWindow("ppusim", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, HH_PPU_SCREEN_WIDTH * HH_PPUSIM_UPSCALE_FACTOR, + HH_PPU_SCREEN_HEIGHT * HH_PPUSIM_UPSCALE_FACTOR, SDL_WINDOW_SHOWN); g_hh_renderer = SDL_CreateRenderer(g_hh_window, -1, SDL_RENDERER_ACCELERATED); g_hh_ppusim_core_count = SDL_GetCPUCount(); - g_hh_ppusim_threads = malloc(sizeof(pthread_t) * g_hh_ppusim_core_count); + g_hh_ppusim_threads = malloc(sizeof(pthread_t) * g_hh_ppusim_core_count); g_hh_ppusim_vram = malloc(sizeof(hh_ppu_data_t) * 0xffff); memset(g_hh_ppusim_vram, 0x0000, 0xffff); @@ -36,8 +37,9 @@ void hh_loop() { SDL_Event e; while (g_hh_run) { uint32_t start = SDL_GetTicks(); - while (SDL_PollEvent(&e)) if (e.type == SDL_QUIT) exit(0); - + while (SDL_PollEvent(&e)) + if (e.type == SDL_QUIT) exit(0); + hh_ppu_vblank_interrupt(); SDL_RenderClear(g_hh_renderer); diff --git a/src/ppusim/work.c b/src/ppusim/work.c index 3b9cee6..96d15aa 100644 --- a/src/ppusim/work.c +++ b/src/ppusim/work.c @@ -2,12 +2,12 @@ #include #include -#include "ppusim/work.h" -#include "ppusim/sim.h" #include "ppu/consts.h" #include "ppusim/pixel.h" +#include "ppusim/sim.h" +#include "ppusim/work.h" -pthread_t* g_hh_ppusim_threads; +pthread_t *g_hh_ppusim_threads; unsigned g_hh_ppusim_core_count; hh_s_ppusim_screen g_hh_ppusim_screen; @@ -15,29 +15,26 @@ hh_s_ppusim_screen g_hh_ppusim_screen; #pragma GCC diagnostic ignored "-Wint-to-pointer-cast" #pragma GCC diagnostic ignored "-Wpointer-to-int-cast" -void* hh_ppusim_draw_thread(void* arg) { - unsigned core = (unsigned long) arg; +void *hh_ppusim_draw_thread(void *arg) { + unsigned core = (unsigned long)arg; for (unsigned y = core; y < HH_PPU_SCREEN_HEIGHT; y += g_hh_ppusim_core_count) - for (unsigned x = 0; x < HH_PPU_SCREEN_WIDTH; x++) - hh_ppusim_pixel(g_hh_ppusim_screen[y][x], x, y); + for (unsigned x = 0; x < HH_PPU_SCREEN_WIDTH; x++) hh_ppusim_pixel(g_hh_ppusim_screen[y][x], x, y); return NULL; } -void hh_ppusim_draw_frame(SDL_Renderer* renderer) { - for (unsigned core = 0; core < g_hh_ppusim_core_count; core++) - pthread_create(&g_hh_ppusim_threads[core], NULL, hh_ppusim_draw_thread, (void*)(unsigned long)core); - for (unsigned core = 0; core < g_hh_ppusim_core_count; core++) - pthread_join(g_hh_ppusim_threads[core], NULL); - +void hh_ppusim_draw_frame(SDL_Renderer *renderer) { + for (unsigned core = 0; core < g_hh_ppusim_core_count; core++) pthread_create(&g_hh_ppusim_threads[core], NULL, hh_ppusim_draw_thread, (void *)(unsigned long)core); + for (unsigned core = 0; core < g_hh_ppusim_core_count; core++) pthread_join(g_hh_ppusim_threads[core], NULL); + for (unsigned x = 0; x < HH_PPU_SCREEN_WIDTH; x++) { for (unsigned y = 0; y < HH_PPU_SCREEN_HEIGHT; y++) { SDL_SetRenderDrawColor(renderer, g_hh_ppusim_screen[y][x][0], g_hh_ppusim_screen[y][x][1], g_hh_ppusim_screen[y][x][2], 255); - SDL_RenderFillRect(renderer, &(SDL_Rect) { - .x = x * HH_PPUSIM_UPSCALE_FACTOR, - .y = y * HH_PPUSIM_UPSCALE_FACTOR, - .w = HH_PPUSIM_UPSCALE_FACTOR, - .h = HH_PPUSIM_UPSCALE_FACTOR, - }); + SDL_RenderFillRect(renderer, &(SDL_Rect){ + .x = x * HH_PPUSIM_UPSCALE_FACTOR, + .y = y * HH_PPUSIM_UPSCALE_FACTOR, + .w = HH_PPUSIM_UPSCALE_FACTOR, + .h = HH_PPUSIM_UPSCALE_FACTOR, + }); } } } -- cgit v1.2.3 From 4a740898621dcfc16fe257b6fe8695c768ec4dd6 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Fri, 10 Mar 2023 14:02:25 +0100 Subject: update style guide --- style.md | 1 + 1 file changed, 1 insertion(+) diff --git a/style.md b/style.md index 3fe912b..db3e1d7 100644 --- a/style.md +++ b/style.md @@ -31,6 +31,7 @@ before formatting as a failsafe. - library hooks that need specific symbol names are exempt from the naming conventions (e.g. `main` or `HAL_UART_MspInit`) - names are always in English +- filenames should not be prefixed by anything. ## others -- cgit v1.2.3