Merged gyro management
Added some comments
This commit is contained in:
parent
60a8090bf3
commit
cff45d045d
@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.549955279">
|
||||
@ -42,9 +42,9 @@
|
||||
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy"/>
|
||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/>
|
||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/2P-ProjectPong/Utilities/Fonts}"" />
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/2P-ProjectPong/Drivers/BSP/Components}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/2P-ProjectPong/Drivers/BSP/STM32412G-Discovery}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/2P-ProjectPong/Utilities/Fonts}""/>
|
||||
</option>
|
||||
<option id="gnu.c.compiler.option.preprocessor.def.symbols.1001009273" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__weak=__attribute__((weak))"/>
|
||||
@ -158,9 +158,9 @@
|
||||
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy"/>
|
||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/>
|
||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/2P-ProjectPong/Utilities/Fonts}"" />
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/2P-ProjectPong/Drivers/BSP/Components}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/2P-ProjectPong/Drivers/BSP/STM32412G-Discovery}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/2P-ProjectPong/Utilities/Fonts}""/>
|
||||
</option>
|
||||
<option id="gnu.c.compiler.option.preprocessor.def.symbols.1001009273" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__weak=__attribute__((weak))"/>
|
||||
|
@ -1,7 +1,7 @@
|
||||
[PreviousGenFiles]
|
||||
HeaderPath=D:/JCS/Documents/STM32_PROJECTS/2P-ProjectPong/Inc
|
||||
HeaderPath=D:/JCS/Documents/GITRepos/STM32-SchoolProjects/2P-ProjectPong/Inc
|
||||
HeaderFiles=gpio.h;stm32f4xx_it.h;stm32f4xx_hal_conf.h;main.h;usart.h;i2c.h;quadspi.h;fsmc.h;RTE_Components.h;rng.h;tim.h;
|
||||
SourcePath=D:/JCS/Documents/STM32_PROJECTS/2P-ProjectPong/Src
|
||||
SourcePath=D:/JCS/Documents/GITRepos/STM32-SchoolProjects/2P-ProjectPong/Src
|
||||
SourceFiles=gpio.c;stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c;usart.c;i2c.c;quadspi.c;fsmc.c;rng.c;tim.c;
|
||||
|
||||
[PreviousLibFiles]
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>2P-ProjectPong</name>
|
||||
<comment></comment>
|
||||
<comment />
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
@ -28,7 +28,7 @@
|
||||
<link>
|
||||
<name>Utilities</name>
|
||||
<type>2</type>
|
||||
<locationURI>PARENT-3-PROJECT_LOC/STM32Cube/Repository/STM32Cube_FW_F4_V1.23.0/Utilities</locationURI>
|
||||
<location>PARENT-3-PROJECT_LOC/STM32Cube/Repository/STM32Cube_FW_F4_V1.23.0/Utilities</location>
|
||||
</link>
|
||||
</linkedResources>
|
||||
</projectDescription>
|
||||
|
@ -3,7 +3,7 @@ File.Version=6
|
||||
KeepUserPlacement=false
|
||||
Mcu.Family=STM32F4
|
||||
Mcu.IP0=FSMC
|
||||
Mcu.IP1=I2C1
|
||||
Mcu.IP1=I2C2
|
||||
Mcu.IP2=NVIC
|
||||
Mcu.IP3=QUADSPI
|
||||
Mcu.IP4=RCC
|
||||
@ -108,7 +108,7 @@ NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:true
|
||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:true
|
||||
NVIC.EXTI0_IRQn=true\:0\:0\:false\:false\:true\:true
|
||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:true
|
||||
NVIC.I2C1_EV_IRQn=true\:0\:0\:true\:false\:true\:true
|
||||
NVIC.I2C2_EV_IRQn=true\:0\:0\:false\:false\:true\:true
|
||||
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:true
|
||||
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:true
|
||||
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:true
|
||||
@ -168,6 +168,7 @@ PB1.Signal=S_DATAIN0DFSDM1
|
||||
PB10.GPIOParameters=GPIO_Label
|
||||
PB10.GPIO_Label=I2C2_SCL
|
||||
PB10.Locked=true
|
||||
PB10.Mode=I2C
|
||||
PB10.Signal=I2C2_SCL
|
||||
PB11.GPIOParameters=GPIO_Label
|
||||
PB11.GPIO_Label=M2_CKIN
|
||||
@ -197,16 +198,15 @@ PB5.Signal=I2S3_SD
|
||||
PB6.GPIOParameters=GPIO_Label
|
||||
PB6.GPIO_Label=I2C1_SCL [WM8994ECS/R_SCLK]
|
||||
PB6.Locked=true
|
||||
PB6.Mode=I2C
|
||||
PB6.Signal=I2C1_SCL
|
||||
PB7.GPIOParameters=GPIO_Label
|
||||
PB7.GPIO_Label=I2C1_SDA [WM8994ECS/R_SDA]
|
||||
PB7.Locked=true
|
||||
PB7.Mode=I2C
|
||||
PB7.Signal=I2C1_SDA
|
||||
PB9.GPIOParameters=GPIO_Label
|
||||
PB9.GPIO_Label=I2C2_SDA
|
||||
PB9.Locked=true
|
||||
PB9.Mode=I2C
|
||||
PB9.Signal=I2C2_SDA
|
||||
PC10.GPIOParameters=GPIO_Label
|
||||
PC10.GPIO_Label=uSD_D2
|
||||
@ -475,7 +475,7 @@ ProjectManager.StackSize=0x400
|
||||
ProjectManager.TargetToolchain=SW4STM32
|
||||
ProjectManager.ToolChainLocation=
|
||||
ProjectManager.UnderRoot=true
|
||||
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_FSMC_Init-FSMC-false-HAL-true,6-MX_QUADSPI_Init-QUADSPI-false-HAL-true,7-MX_RNG_Init-RNG-false-HAL-true,8-MX_TIM6_Init-TIM6-false-HAL-true
|
||||
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_FSMC_Init-FSMC-false-HAL-true,5-MX_QUADSPI_Init-QUADSPI-false-HAL-true,6-MX_RNG_Init-RNG-false-HAL-true,7-MX_TIM6_Init-TIM6-false-HAL-true,8-MX_I2C2_Init-I2C2-false-HAL-true
|
||||
RCC.48MHZClocksFreq_Value=48000000
|
||||
RCC.AHBFreq_Value=16000000
|
||||
RCC.APB1CLKDivider=RCC_HCLK_DIV2
|
||||
|
@ -60,13 +60,13 @@
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
extern I2C_HandleTypeDef hi2c1;
|
||||
extern I2C_HandleTypeDef hi2c2;
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
void MX_I2C1_Init(void);
|
||||
void MX_I2C2_Init(void);
|
||||
|
||||
/* USER CODE BEGIN Prototypes */
|
||||
|
||||
|
27
2P-ProjectPong/Inc/sensor_interface.h
Normal file
27
2P-ProjectPong/Inc/sensor_interface.h
Normal file
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* sensor_interface.h
|
||||
*
|
||||
* Created on: 7 déc. 2019
|
||||
* Author: JackCarterSmith
|
||||
*/
|
||||
|
||||
#ifndef SENSOR_INTERFACE_H_
|
||||
#define SENSOR_INTERFACE_H_
|
||||
|
||||
#include "stm32412g_discovery.h"
|
||||
|
||||
#define MEMS_ADD_RD 0x00D7
|
||||
#define MEMS_ADD_WR 0x00D6
|
||||
#define CTRL1_XL_REGISTER 0x10
|
||||
#define CTRL1_OUT_REGISTER 0x11
|
||||
|
||||
typedef struct {
|
||||
int16_t Pitch;
|
||||
int16_t Yaw;
|
||||
int16_t Roll;
|
||||
}PP_GyroAnglesTypeDef;
|
||||
|
||||
void initGyro();
|
||||
void getAnglesFromSensor();
|
||||
|
||||
#endif /* SENSOR_INTERFACE_H_ */
|
@ -72,7 +72,7 @@ void DebugMon_Handler(void);
|
||||
void PendSV_Handler(void);
|
||||
void SysTick_Handler(void);
|
||||
void EXTI0_IRQHandler(void);
|
||||
void I2C1_EV_IRQHandler(void);
|
||||
void I2C2_EV_IRQHandler(void);
|
||||
void TIM6_IRQHandler(void);
|
||||
/* USER CODE BEGIN EFP */
|
||||
|
||||
|
@ -36,6 +36,9 @@ struct gameControlByte {
|
||||
} gCtrlByte;
|
||||
|
||||
|
||||
/**
|
||||
* @brief Generate new ball's pos and acc from random seed
|
||||
*/
|
||||
void generateNewBall(Game_ModeTypdef type, uint32_t seed) {
|
||||
switch (type) {
|
||||
case MULTI_MODE:
|
||||
@ -43,19 +46,20 @@ void generateNewBall(Game_ModeTypdef type, uint32_t seed) {
|
||||
case SOLO_MODE:
|
||||
default:
|
||||
ballDatas.posX = (seed & 0xFF) % 240;
|
||||
ballDatas.posY = ((seed & 0xFF00 >> 7) % 200) + 60;
|
||||
ballDatas.posY = ((seed & 0xFF00 >> 7) % 180) + 60;
|
||||
if (ballDatas.posX < 0) ballDatas.posX = -ballDatas.posX;
|
||||
if (ballDatas.posY < 0) ballDatas.posY = -ballDatas.posY;
|
||||
ballDatas.accX = ((seed & 0xFF0000 >> 15) % 8) + 4;
|
||||
ballDatas.accY = ((seed & 0xFF000000 >> 31) % 8) + 4;
|
||||
//ballDatas.accX = 5;
|
||||
//ballDatas.accY = 3;
|
||||
if (seed & 0x1) ballDatas.accX = -ballDatas.accX;
|
||||
if (seed & 0x2 >> 1) ballDatas.accY = -ballDatas.accY;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Collision and animation engine for the ball/bar
|
||||
*/
|
||||
void ballRayTracingEngine(PP_BarTypeDef *barDatas) {
|
||||
if (ballDatas.posX + ballDatas.accX > 236) {
|
||||
ballDatas.posX = 236;
|
||||
@ -84,20 +88,26 @@ void ballRayTracingEngine(PP_BarTypeDef *barDatas) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Refresh ball displayed on screen
|
||||
*/
|
||||
void updateBallDisplay() {
|
||||
BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
|
||||
BSP_LCD_FillRect(displayedBall.posX, displayedBall.posY, 4, 4); //Clean previous ball
|
||||
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
|
||||
BSP_LCD_FillRect(ballDatas.posX, ballDatas.posY, 4, 4); //Draw the ball !!!
|
||||
BSP_LCD_FillRect(ballDatas.posX, ballDatas.posY, 4, 4); //Draw the ball at new pos
|
||||
displayedBall.posX = ballDatas.posX;
|
||||
displayedBall.posY = ballDatas.posY;
|
||||
|
||||
if (ballDatas.posY == 236) displayEndMenu();
|
||||
if (ballDatas.posY >= 236) displayEndMenu();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Refresh bar displayed on screen
|
||||
*/
|
||||
void updatePongBar(PP_BarTypeDef *barDatas) {
|
||||
BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
|
||||
BSP_LCD_FillRect(0, BSP_LCD_GetYSize() - 12, BSP_LCD_GetXSize(), 7); //Clean previous ball
|
||||
BSP_LCD_FillRect(0, BSP_LCD_GetYSize() - 12, BSP_LCD_GetXSize(), 7); //Clean previous bar
|
||||
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
|
||||
if (barDatas->pos + barDatas->acc > BSP_LCD_GetXSize() - 20) {
|
||||
barDatas->pos = BSP_LCD_GetXSize() - 20;
|
||||
@ -106,23 +116,26 @@ void updatePongBar(PP_BarTypeDef *barDatas) {
|
||||
} else {
|
||||
barDatas->pos += barDatas->acc;
|
||||
}
|
||||
BSP_LCD_FillRect(barDatas->pos - 20, BSP_LCD_GetYSize() - 12, 40, 7);
|
||||
BSP_LCD_FillRect(barDatas->pos - 20, BSP_LCD_GetYSize() - 12, 40, 7); //Draw the bar at new pos
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Refresh displayed score on game screen
|
||||
*/
|
||||
void updateScoreArea(Game_ModeTypdef type, uint16_t newScore) {
|
||||
char sTextBuffer[32];
|
||||
|
||||
BSP_LCD_SetFont(&Font24);
|
||||
BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
|
||||
//BSP_LCD_FillRect(BSP_LCD_GetXSize() / 2 - 4 * BSP_LCD_GetFont()->Width, 1, 8 * BSP_LCD_GetFont()->Width, BSP_LCD_GetFont()->Height - 3); //Clean previous ball
|
||||
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
|
||||
sprintf(sTextBuffer, "%d", newScore);
|
||||
//BSP_LCD_DisplayStringAt(BSP_LCD_GetXSize() / 2 - (strlen(sTextBuffer)/2 * BSP_LCD_GetFont()->Width), 2, (uint8_t *)sTextBuffer, LEFT_MODE);
|
||||
BSP_LCD_DisplayStringAt(6, 2, (uint8_t *)sTextBuffer, RIGHT_MODE);
|
||||
//BSP_LCD_DrawRect(BSP_LCD_GetXSize() / 2 - (4 * BSP_LCD_GetFont()->Width) - 1, 0, 8 * BSP_LCD_GetFont()->Width + 1, BSP_LCD_GetFont()->Height - 3);
|
||||
BSP_LCD_FillRect(10, 24, BSP_LCD_GetXSize() - 20, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get a new random number
|
||||
*/
|
||||
uint32_t genSeed() {
|
||||
uint32_t tmp = 0;
|
||||
|
||||
@ -134,6 +147,9 @@ uint32_t genSeed() {
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Main function called when need to update screen
|
||||
*/
|
||||
void refreshCurrScreen(uint32_t _t, PP_BarTypeDef *_barDatas) {
|
||||
char sTextBuffer[32];
|
||||
|
||||
@ -151,7 +167,7 @@ void refreshCurrScreen(uint32_t _t, PP_BarTypeDef *_barDatas) {
|
||||
oldTicks = _t;
|
||||
}
|
||||
} else if (currGameMode == MULTI_MODE) {
|
||||
|
||||
//Nothing
|
||||
}
|
||||
} else if (currMenu == MENU_MAIN || currMenu == MENU_END) {
|
||||
if (_t - oldTicks >= 30 || _t - oldTicks < 0) {
|
||||
@ -169,6 +185,9 @@ void refreshCurrScreen(uint32_t _t, PP_BarTypeDef *_barDatas) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Just a cool screen to display when the board start
|
||||
*/
|
||||
void displayLoadingScreen() {
|
||||
char sTextBuffer[32];
|
||||
|
||||
@ -208,6 +227,9 @@ void displayStartMenu(PP_HighScoresTypeDef hsDatas) {
|
||||
BSP_LCD_DisplayStringAt(BSP_LCD_GetXSize() / 2 - 5 * 12, BSP_LCD_GetYSize() / 2 + 40, (uint8_t *)sTextBuffer, LEFT_MODE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Generate and display new game
|
||||
*/
|
||||
void displayGameArea(Game_ModeTypdef type, PP_BarTypeDef *_barDatas) {
|
||||
uint32_t seed = 0;
|
||||
currScore = 0;
|
||||
@ -247,7 +269,7 @@ void displayEndMenu() {
|
||||
sprintf(sTextBuffer, "SCORE: %d", currScore);
|
||||
BSP_LCD_DisplayStringAt(BSP_LCD_GetXSize() / 2 - (strlen(sTextBuffer)/2 * BSP_LCD_GetFont()->Width), BSP_LCD_GetYSize() / 2 - 40, (uint8_t *)sTextBuffer, LEFT_MODE);
|
||||
|
||||
//TODO: Save new HighScore if greather than the old one
|
||||
//TODO: Save new HighScore in EEPROM if greather than the old one
|
||||
|
||||
/* READY TO START NEW GAME! */
|
||||
strcpy(sTextBuffer, "Press START\0");
|
||||
|
@ -67,7 +67,6 @@
|
||||
PA3 ------> USART2_RX
|
||||
PA4 ------> I2S3_WS
|
||||
PB1 ------> S_DATAIN0DFSDM1
|
||||
PB10 ------> I2C2_SCL
|
||||
PB11 ------> I2S_CKIN
|
||||
PB12 ------> I2S3_CK
|
||||
PC7 ------> I2S3_MCK
|
||||
@ -83,7 +82,8 @@
|
||||
PD2 ------> SDIO_CMD
|
||||
PB4 ------> I2S3_ext_SD
|
||||
PB5 ------> I2S3_SD
|
||||
PB9 ------> I2C2_SDA
|
||||
PB6 ------> I2C1_SCL
|
||||
PB7 ------> I2C1_SDA
|
||||
*/
|
||||
void MX_GPIO_Init(void)
|
||||
{
|
||||
@ -184,14 +184,6 @@ void MX_GPIO_Init(void)
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : PtPin */
|
||||
GPIO_InitStruct.Pin = I2C2_SCL_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
|
||||
HAL_GPIO_Init(I2C2_SCL_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : PtPin */
|
||||
GPIO_InitStruct.Pin = M2_CKIN_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||
@ -284,13 +276,13 @@ void MX_GPIO_Init(void)
|
||||
GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
|
||||
HAL_GPIO_Init(CODEC_I2S3_SD_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : PtPin */
|
||||
GPIO_InitStruct.Pin = I2C2_SDA_Pin;
|
||||
/*Configure GPIO pins : PBPin PBPin */
|
||||
GPIO_InitStruct.Pin = I2C1_SCL_Pin|I2C1_SDA_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
GPIO_InitStruct.Alternate = GPIO_AF9_I2C2;
|
||||
HAL_GPIO_Init(I2C2_SDA_GPIO_Port, &GPIO_InitStruct);
|
||||
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* EXTI interrupt init*/
|
||||
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
|
||||
|
@ -54,22 +54,22 @@
|
||||
|
||||
/* USER CODE END 0 */
|
||||
|
||||
I2C_HandleTypeDef hi2c1;
|
||||
I2C_HandleTypeDef hi2c2;
|
||||
|
||||
/* I2C1 init function */
|
||||
void MX_I2C1_Init(void)
|
||||
/* I2C2 init function */
|
||||
void MX_I2C2_Init(void)
|
||||
{
|
||||
|
||||
hi2c1.Instance = I2C1;
|
||||
hi2c1.Init.ClockSpeed = 100000;
|
||||
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
|
||||
hi2c1.Init.OwnAddress1 = 0;
|
||||
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
||||
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
|
||||
hi2c1.Init.OwnAddress2 = 0;
|
||||
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
|
||||
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
|
||||
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
|
||||
hi2c2.Instance = I2C2;
|
||||
hi2c2.Init.ClockSpeed = 100000;
|
||||
hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
|
||||
hi2c2.Init.OwnAddress1 = 0;
|
||||
hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
||||
hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
|
||||
hi2c2.Init.OwnAddress2 = 0;
|
||||
hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
|
||||
hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
|
||||
if (HAL_I2C_Init(&hi2c2) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
@ -80,58 +80,65 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
|
||||
{
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
if(i2cHandle->Instance==I2C1)
|
||||
if(i2cHandle->Instance==I2C2)
|
||||
{
|
||||
/* USER CODE BEGIN I2C1_MspInit 0 */
|
||||
/* USER CODE BEGIN I2C2_MspInit 0 */
|
||||
|
||||
/* USER CODE END I2C1_MspInit 0 */
|
||||
/* USER CODE END I2C2_MspInit 0 */
|
||||
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
/**I2C1 GPIO Configuration
|
||||
PB6 ------> I2C1_SCL
|
||||
PB7 ------> I2C1_SDA
|
||||
/**I2C2 GPIO Configuration
|
||||
PB10 ------> I2C2_SCL
|
||||
PB9 ------> I2C2_SDA
|
||||
*/
|
||||
GPIO_InitStruct.Pin = I2C1_SCL_Pin|I2C1_SDA_Pin;
|
||||
GPIO_InitStruct.Pin = I2C2_SCL_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
|
||||
HAL_GPIO_Init(I2C2_SCL_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/* I2C1 clock enable */
|
||||
__HAL_RCC_I2C1_CLK_ENABLE();
|
||||
GPIO_InitStruct.Pin = I2C2_SDA_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
GPIO_InitStruct.Alternate = GPIO_AF9_I2C2;
|
||||
HAL_GPIO_Init(I2C2_SDA_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/* I2C1 interrupt Init */
|
||||
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
|
||||
/* USER CODE BEGIN I2C1_MspInit 1 */
|
||||
/* I2C2 clock enable */
|
||||
__HAL_RCC_I2C2_CLK_ENABLE();
|
||||
|
||||
/* USER CODE END I2C1_MspInit 1 */
|
||||
/* I2C2 interrupt Init */
|
||||
HAL_NVIC_SetPriority(I2C2_EV_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(I2C2_EV_IRQn);
|
||||
/* USER CODE BEGIN I2C2_MspInit 1 */
|
||||
|
||||
/* USER CODE END I2C2_MspInit 1 */
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
|
||||
{
|
||||
|
||||
if(i2cHandle->Instance==I2C1)
|
||||
if(i2cHandle->Instance==I2C2)
|
||||
{
|
||||
/* USER CODE BEGIN I2C1_MspDeInit 0 */
|
||||
/* USER CODE BEGIN I2C2_MspDeInit 0 */
|
||||
|
||||
/* USER CODE END I2C1_MspDeInit 0 */
|
||||
/* USER CODE END I2C2_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_I2C1_CLK_DISABLE();
|
||||
__HAL_RCC_I2C2_CLK_DISABLE();
|
||||
|
||||
/**I2C1 GPIO Configuration
|
||||
PB6 ------> I2C1_SCL
|
||||
PB7 ------> I2C1_SDA
|
||||
/**I2C2 GPIO Configuration
|
||||
PB10 ------> I2C2_SCL
|
||||
PB9 ------> I2C2_SDA
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOB, I2C1_SCL_Pin|I2C1_SDA_Pin);
|
||||
HAL_GPIO_DeInit(GPIOB, I2C2_SCL_Pin|I2C2_SDA_Pin);
|
||||
|
||||
/* I2C1 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(I2C1_EV_IRQn);
|
||||
/* USER CODE BEGIN I2C1_MspDeInit 1 */
|
||||
/* I2C2 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(I2C2_EV_IRQn);
|
||||
/* USER CODE BEGIN I2C2_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END I2C1_MspDeInit 1 */
|
||||
/* USER CODE END I2C2_MspDeInit 1 */
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -54,6 +54,7 @@
|
||||
#include "stm32412g_discovery.h"
|
||||
#include "stm32412g_discovery_lcd.h"
|
||||
#include "game_engine.h"
|
||||
#include "sensor_interface.h"
|
||||
//#include "lsm6dsl/lsm6dsl.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
@ -110,31 +111,31 @@ int main(void)
|
||||
|
||||
/* USER CODE BEGIN Init */
|
||||
PP_HighScoresTypeDef HighScoresDatas;
|
||||
PP_GyroAnglesTypeDef AnglesDatas;
|
||||
/* USER CODE END Init */
|
||||
|
||||
/* Configure the system clock */
|
||||
SystemClock_Config();
|
||||
|
||||
/* USER CODE BEGIN SysInit */
|
||||
RngHandle.Instance = RNG;
|
||||
RngHandle.Instance = RNG; // Associate periph to handle
|
||||
/* USER CODE END SysInit */
|
||||
|
||||
/* Initialize all configured peripherals */
|
||||
MX_GPIO_Init();
|
||||
MX_USART1_UART_Init();
|
||||
MX_I2C1_Init();
|
||||
MX_FSMC_Init();
|
||||
MX_QUADSPI_Init();
|
||||
MX_RNG_Init();
|
||||
MX_TIM6_Init();
|
||||
MX_I2C2_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
initPeriph(); // Start all periph func
|
||||
|
||||
displayLoadingScreen();
|
||||
barDatas.pos = BSP_LCD_GetXSize() / 2;
|
||||
//testEEPROM();
|
||||
|
||||
/* Load from NOR Flash and display high scores */
|
||||
/* Load from EEPROM and display high scores */
|
||||
getHighScores(&HighScoresDatas);
|
||||
displayStartMenu(HighScoresDatas);
|
||||
/* USER CODE END 2 */
|
||||
@ -143,6 +144,9 @@ int main(void)
|
||||
/* USER CODE BEGIN WHILE */
|
||||
while (1)
|
||||
{
|
||||
if (getCurrMenu() == MENU_GAME) {
|
||||
/* Joystick Debug Mode */
|
||||
/*
|
||||
if (BSP_JOY_GetState() == JOY_UP) {
|
||||
barDatas.acc = -6;
|
||||
} else if (BSP_JOY_GetState() == JOY_DOWN) {
|
||||
@ -150,6 +154,20 @@ int main(void)
|
||||
} else {
|
||||
barDatas.acc = 0;
|
||||
}
|
||||
*/
|
||||
|
||||
/* Gyro angles -> bar acceleration conversion */
|
||||
getAnglesFromSensor(&AnglesDatas);
|
||||
if (AnglesDatas.Roll <= 65 && AnglesDatas.Roll > 0) {
|
||||
barDatas.acc = -5;
|
||||
} else if (AnglesDatas.Roll >= -65 && AnglesDatas.Roll < 0) {
|
||||
barDatas.acc = 5;
|
||||
} else if (AnglesDatas.Roll > 65 || AnglesDatas.Roll < -65) {
|
||||
barDatas.acc = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* The only one important function, trigger refresh screen */
|
||||
refreshCurrScreen(ticks, &barDatas);
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
@ -209,26 +227,35 @@ void SystemClock_Config(void)
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 4 */
|
||||
/**
|
||||
* @brief Init all necessary hardware periph
|
||||
*/
|
||||
void initPeriph() {
|
||||
if (HAL_RNG_Init(&RngHandle) != HAL_OK) return;
|
||||
if (HAL_TIM_Base_Init(&htim6) != HAL_OK) return;
|
||||
if (HAL_TIM_Base_Start_IT(&htim6) != HAL_OK) return;
|
||||
BSP_LED_Init(LED_BLUE);
|
||||
BSP_LED_Init(LED_RED);
|
||||
BSP_LED_Init(LED_ORANGE);
|
||||
BSP_LED_Init(LED_GREEN);
|
||||
//if (BSP_JOY_Init(JOY_MODE_EXTI) != HAL_OK) return;
|
||||
|
||||
if (HAL_RNG_Init(&RngHandle) != HAL_OK) return;
|
||||
BSP_LED_On(LED_BLUE);
|
||||
if (HAL_TIM_Base_Init(&htim6) != HAL_OK) return;
|
||||
BSP_LED_On(LED_RED);
|
||||
if (HAL_TIM_Base_Start_IT(&htim6) != HAL_OK) return;
|
||||
BSP_LED_On(LED_ORANGE);
|
||||
initGyro();
|
||||
if (BSP_LCD_InitEx(LCD_ORIENTATION_PORTRAIT) == LCD_ERROR) return;
|
||||
HAL_Delay(400);
|
||||
BSP_LCD_Clear(LCD_COLOR_BLACK);
|
||||
|
||||
BSP_LED_On(LED_GREEN);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Function to retrieve HighScores from external EEPROM
|
||||
*/
|
||||
void getHighScores(PP_HighScoresTypeDef* hsDatas) {
|
||||
uint32_t tmp = 0;
|
||||
|
||||
/* Cheat, use random number generator because no EEPROM connected */
|
||||
// Can be use to test RNG
|
||||
if (HAL_RNG_Init(&RngHandle) == HAL_OK) {
|
||||
tmp = HAL_RNG_GetRandomNumber(&RngHandle);
|
||||
} else BSP_LED_On(LED_RED);
|
||||
@ -238,21 +265,28 @@ void getHighScores(PP_HighScoresTypeDef* hsDatas) {
|
||||
hsDatas->Multi_HS = (uint8_t)(tmp>>24);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Callback function for cadencer timer
|
||||
*/
|
||||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
|
||||
//BSP_LED_Toggle(LED_BLUE);
|
||||
// Increment ticks all 10ms
|
||||
if (++ticks >= 0xffffffffffffffff) ticks = 0;
|
||||
//HAL_TIM_Base_Stop_IT(&htim6);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Callback function for Joystick handling
|
||||
*/
|
||||
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
|
||||
// Scan current displayed "screen" to correctly interpret Joystick inputs
|
||||
switch(getCurrMenu()) {
|
||||
case MENU_GAME:
|
||||
|
||||
// Empty
|
||||
break;
|
||||
default:
|
||||
case MENU_END:
|
||||
case MENU_MAIN:
|
||||
if (BSP_JOY_GetState() == JOY_SEL) {
|
||||
displayGameArea(SOLO_MODE, &barDatas);
|
||||
displayGameArea(SOLO_MODE, &barDatas); // Start new game from main menu
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
39
2P-ProjectPong/Src/sensor_interface.c
Normal file
39
2P-ProjectPong/Src/sensor_interface.c
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* sensor_interface.c
|
||||
*
|
||||
* Created on: 7 déc. 2019
|
||||
* Author: JackCarterSmith
|
||||
*/
|
||||
|
||||
#include "sensor_interface.h"
|
||||
#include "i2c.h"
|
||||
|
||||
#include "math.h"
|
||||
|
||||
|
||||
void initGyro() {
|
||||
uint8_t MEMS_ODR_CONFIG []= {0x88};
|
||||
|
||||
//Configure all configurations datas for sensor chip
|
||||
HAL_I2C_Mem_Write(&hi2c2,MEMS_ADD_WR,CTRL1_XL_REGISTER,1,MEMS_ODR_CONFIG,1,HAL_TIMEOUT);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief function to retrieve values from sensors and calculate angles from it
|
||||
*/
|
||||
void getAnglesFromSensor(PP_GyroAnglesTypeDef *anglesVar) {
|
||||
int16_t OUTX_XL[1],OUTY_XL[1],OUTZ_XL[1];
|
||||
float tempX, tempY, tempZ;
|
||||
|
||||
HAL_I2C_Mem_Read(&hi2c2, MEMS_ADD_RD, 0x28, 1, (uint8_t*)&OUTX_XL, 2, HAL_TIMEOUT);
|
||||
HAL_I2C_Mem_Read(&hi2c2, MEMS_ADD_RD, 0x2A, 1, (uint8_t*)&OUTY_XL, 2, HAL_TIMEOUT);
|
||||
HAL_I2C_Mem_Read(&hi2c2, MEMS_ADD_RD, 0x2C, 1, (uint8_t*)&OUTZ_XL, 2, HAL_TIMEOUT);
|
||||
|
||||
tempX = (float)OUTX_XL[0];
|
||||
tempY = (float)OUTY_XL[0];
|
||||
tempZ = (float)OUTZ_XL[0];
|
||||
|
||||
anglesVar->Pitch = (int16_t)atanf(-tempY / tempZ) * 60;
|
||||
anglesVar->Yaw = (int16_t)atanf(-tempX / tempZ) * 60;
|
||||
anglesVar->Roll = (int16_t)atanf(-tempX / tempY) * 60;
|
||||
}
|
@ -71,7 +71,7 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
extern I2C_HandleTypeDef hi2c1;
|
||||
extern I2C_HandleTypeDef hi2c2;
|
||||
extern TIM_HandleTypeDef htim6;
|
||||
/* USER CODE BEGIN EV */
|
||||
|
||||
@ -228,17 +228,17 @@ void EXTI0_IRQHandler(void)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles I2C1 event interrupt.
|
||||
* @brief This function handles I2C2 event interrupt.
|
||||
*/
|
||||
void I2C1_EV_IRQHandler(void)
|
||||
void I2C2_EV_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN I2C1_EV_IRQn 0 */
|
||||
/* USER CODE BEGIN I2C2_EV_IRQn 0 */
|
||||
|
||||
/* USER CODE END I2C1_EV_IRQn 0 */
|
||||
HAL_I2C_EV_IRQHandler(&hi2c1);
|
||||
/* USER CODE BEGIN I2C1_EV_IRQn 1 */
|
||||
/* USER CODE END I2C2_EV_IRQn 0 */
|
||||
HAL_I2C_EV_IRQHandler(&hi2c2);
|
||||
/* USER CODE BEGIN I2C2_EV_IRQn 1 */
|
||||
|
||||
/* USER CODE END I2C1_EV_IRQn 1 */
|
||||
/* USER CODE END I2C2_EV_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user