diff --git a/termin3/aufgabe2/LaborRechnersysteme3.ioc b/termin3/aufgabe2/LaborRechnersysteme3.ioc
new file mode 100644
index 0000000..b7dee0e
--- /dev/null
+++ b/termin3/aufgabe2/LaborRechnersysteme3.ioc
@@ -0,0 +1,381 @@
+#MicroXplorer Configuration settings - do not modify
+Mcu.Family=STM32F4
+PA11.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+SH.GPXTI1.0=GPIO_EXTI1
+ProjectManager.MainLocation=Core/Src
+PC3.GPIO_Mode=GPIO_MODE_AF_PP
+PH0-OSC_IN.Locked=true
+PD12.GPIO_Label=LD4 [Green Led]
+PA6.Mode=Full_Duplex_Master
+USB_DEVICE.CLASS_NAME_FS=CDC
+PC7.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PH0-OSC_IN.Signal=RCC_OSC_IN
+RCC.CortexFreq_Value=168000000
+PC10.GPIO_PuPd=GPIO_NOPULL
+ProjectManager.KeepUserCode=true
+Mcu.UserName=STM32F407VGTx
+PB10.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+SPI1.VirtualType=VM_MASTER
+PB6.GPIO_Mode=GPIO_MODE_AF_OD
+PB10.GPIO_PuPd=GPIO_NOPULL
+PC12.Locked=true
+PA10.GPIO_PuPd=GPIO_NOPULL
+PC10.Locked=true
+PD15.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+RCC.PLLCLKFreq_Value=168000000
+PC10.Signal=I2S3_CK
+PC12.Signal=I2S3_SD
+PA14.GPIO_Label=SWCLK
+RCC.PLLQCLKFreq_Value=48000000
+PC7.Locked=true
+I2S3.IPParameters=AudioFreq-Half_Duplex_Master,ErrorAudioFreq-Half_Duplex_Master,RealAudioFreq-Half_Duplex_Master,RealAudioFreq,ErrorAudioFreq,Instance,VirtualMode,FullDuplexMode
+PA7.GPIO_Mode=GPIO_MODE_AF_PP
+PA12.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_I2C1_Init-I2C1-false-HAL-true,4-MX_I2S3_Init-I2S3-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true,6-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false
+PC0.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label
+PA9.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_Mode
+PA11.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PC0.GPIO_Label=OTG_FS_PowerSwitchOn
+PC3.Locked=true
+PA11.Mode=Device_Only
+RCC.RTCFreq_Value=32000
+PH0-OSC_IN.GPIOParameters=GPIO_Label
+PA6.GPIO_Label=SPI1_MISO [LIS302DL_SDO]
+PB6.GPIO_Label=Audio_SCL [CS43L22_SCL]
+USB_DEVICE.VirtualMode-CDC_FS=Cdc
+PC10.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+PD4.Locked=true
+PA11.GPIO_PuPd=GPIO_NOPULL
+PC15-OSC32_OUT.GPIO_Label=PC15-OSC32_OUT
+PinOutPanel.RotationAngle=0
+PC3.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
+ProjectManager.StackSize=0x400
+PA6.GPIO_Mode=GPIO_MODE_AF_PP
+SPI1.Mode-Full_Duplex_Master=SPI_MODE_MASTER
+PD13.Signal=GPIO_Output
+Mcu.IP4=SPI1
+RCC.FCLKCortexFreq_Value=168000000
+Mcu.IP5=SYS
+PD13.Locked=true
+Mcu.IP2=NVIC
+NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+Mcu.IP3=RCC
+PD14.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+Mcu.IP0=I2C1
+PA12.Locked=true
+Mcu.IP1=I2S3
+PA12.Signal=USB_OTG_FS_DP
+Mcu.UserConstants=
+PD15.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label
+PA4.Mode=Half_Duplex_Master
+Mcu.ThirdPartyNb=0
+SPI1.Direction=SPI_DIRECTION_2LINES
+I2S3.AudioFreq-Half_Duplex_Master=I2S_AUDIOFREQ_96K
+RCC.HCLKFreq_Value=168000000
+Mcu.IPNb=8
+RCC.I2SClocksFreq_Value=96000000
+ProjectManager.PreviousToolchain=
+PD4.Signal=GPIO_Output
+RCC.APB2TimFreq_Value=168000000
+PB6.Signal=I2C1_SCL
+RCC.VcooutputI2S=96000000
+PC7.Signal=I2S3_MCK
+PB6.Mode=I2C
+PC3.Signal=I2S2_SD
+Mcu.Pin6=PC3
+Mcu.Pin7=PA0-WKUP
+Mcu.Pin8=PA4
+Mcu.Pin9=PA5
+PE1.Signal=GPXTI1
+RCC.AHBFreq_Value=168000000
+PH0-OSC_IN.Mode=HSE-External-Oscillator
+PH0-OSC_IN.GPIO_Label=PH0-OSC_IN
+Mcu.Pin0=PE3
+Mcu.Pin1=PC14-OSC32_IN
+Mcu.Pin2=PC15-OSC32_OUT
+PA9.GPIO_Mode=GPIO_MODE_INPUT
+Mcu.Pin3=PH0-OSC_IN
+Mcu.Pin4=PH1-OSC_OUT
+PA0-WKUP.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI
+Mcu.Pin5=PC0
+ProjectManager.ProjectBuild=false
+RCC.HSE_VALUE=8000000
+NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+PA4.GPIO_PuPd=GPIO_NOPULL
+PB2.Signal=GPIO_Input
+PA4.Locked=true
+NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:true\:true
+PA4.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.26.2
+MxDb.Version=DB.6.0.21
+I2S3.ErrorAudioFreq=-2.34 %
+PA6.GPIO_PuPd=GPIO_NOPULL
+ProjectManager.BackupPrevious=false
+PC14-OSC32_IN.Mode=LSE-External-Oscillator
+RCC.VCOInputFreq_Value=1000000
+PA14.Mode=Serial_Wire
+USB_DEVICE.MANUFACTURER_STRING-CDC_FS=DHBW Horb
+PA5.GPIO_PuPd=GPIO_NOPULL
+I2S3.ErrorAudioFreq-Half_Duplex_Master=0.8 %
+File.Version=6
+PA10.GPIO_Label=OTG_FS_ID
+PC7.GPIO_Mode=GPIO_MODE_AF_PP
+PE3.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label
+PH1-OSC_OUT.Locked=true
+PD5.GPIO_Mode=GPIO_MODE_INPUT
+PB3.GPIOParameters=GPIO_Label
+PE3.Locked=true
+PD14.GPIO_PuPd=GPIO_NOPULL
+PE1.Locked=true
+PB6.Locked=true
+NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+PB6.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+ProjectManager.HalAssertFull=false
+PB2.GPIO_PuPd=GPIO_NOPULL
+PC14-OSC32_IN.GPIOParameters=GPIO_Label
+SPI1.CalculateBaudRate-Full_Duplex_Master=42.0 MBits/s
+ProjectManager.ProjectName=LaborRechnersysteme3
+PA13.GPIOParameters=GPIO_Label
+PH1-OSC_OUT.Mode=HSE-External-Oscillator
+RCC.MCO2PinFreq_Value=168000000
+PD13.GPIO_Label=LD3 [Orange Led]
+Mcu.Package=LQFP100
+PB9.Signal=I2C1_SDA
+PA6.Signal=SPI1_MISO
+PA7.Locked=true
+PA5.Locked=true
+PD12.Signal=GPIO_Output
+PA14.Locked=true
+PD5.GPIO_Label=OTG_FS_OverCurrent
+PD5.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_Mode
+NVIC.OTG_FS_IRQn=true\:0\:0\:false\:false\:true\:true\:true
+ProjectManager.ToolChainLocation=
+PD15.GPIO_PuPd=GPIO_NOPULL
+PD14.Locked=true
+RCC.LSI_VALUE=32000
+SH.GPXTI0.0=GPIO_EXTI0
+VP_SYS_VS_Systick.Signal=SYS_VS_Systick
+PA10.Signal=USB_OTG_FS_ID
+PB9.GPIO_PuPd=GPIO_NOPULL
+USB_OTG_FS.VirtualMode=Device_Only
+VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS
+PA5.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PA10.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+RCC.APB2CLKDivider=RCC_HCLK_DIV2
+PB9.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+RCC.APB1TimFreq_Value=84000000
+NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+PC14-OSC32_IN.GPIO_Label=PC14-OSC32_IN
+USB_OTG_FS.IPParameters=VirtualMode
+PB10.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PC12.GPIO_PuPd=GPIO_NOPULL
+PC15-OSC32_OUT.GPIOParameters=GPIO_Label
+PA6.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+PC0.GPIO_PuPd=GPIO_NOPULL
+PA12.GPIO_PuPd=GPIO_NOPULL
+PD5.Locked=true
+PA4.GPIO_Label=I2S3_WS [CS43L22_LRCK]
+PD15.Signal=GPIO_Output
+ProjectManager.CustomerFirmwarePackage=
+PC0.PinState=GPIO_PIN_SET
+PC14-OSC32_IN.Locked=true
+PA12.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+PB3.Locked=true
+PA5.Mode=Full_Duplex_Master
+PB3.GPIO_Label=SWO
+PA6.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PC15-OSC32_OUT.Mode=LSE-External-Oscillator
+I2S3.FullDuplexMode=I2S_FULLDUPLEXMODE_DISABLE
+ProjectManager.ProjectFileName=LaborRechnersysteme3.ioc
+PD12.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+PD15.GPIO_Label=LD6 [Blue Led]
+PA7.Mode=Full_Duplex_Master
+PB9.GPIO_Label=Audio_SDA [CS43L22_SDA]
+PC10.GPIO_Label=I2S3_SCK [CS43L22_SCLK]
+Mcu.PinsNb=35
+ProjectManager.NoMain=false
+SPI1.IPParameters=CalculateBaudRate-Full_Duplex_Master,BaudRatePrescaler-Full_Duplex_Master,Mode-Full_Duplex_Master,Mode,VirtualType,Direction
+USB_DEVICE.VirtualModeFS=Cdc_FS
+PA9.GPIO_Label=VBUS_FS
+PB6.GPIO_PuPd=GPIO_NOPULL
+PC10.Mode=Half_Duplex_Master
+PD13.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label
+SH.GPXTI0.ConfNb=1
+PA11.GPIO_Label=OTG_FS_DM
+ProjectManager.DefaultFWLocation=true
+PE1.GPIO_PuPd=GPIO_NOPULL
+PD5.Signal=GPIO_Input
+ProjectManager.DeletePrevious=true
+PC0.Signal=GPIO_Output
+PE1.GPIO_ModeDefaultEXTI=GPIO_MODE_EVT_RISING
+RCC.APB1CLKDivider=RCC_HCLK_DIV4
+PC14-OSC32_IN.Signal=RCC_OSC32_IN
+PB10.Locked=true
+boardIOC=true
+USB_DEVICE.IPParameters=VirtualMode-CDC_FS,VirtualModeFS,CLASS_NAME_FS,MANUFACTURER_STRING-CDC_FS
+PA9.GPIO_PuPd=GPIO_NOPULL
+PA0-WKUP.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING
+PA12.GPIO_Label=OTG_FS_DP
+RCC.FamilyName=M
+PA0-WKUP.GPIO_Label=B1 [Blue PushButton]
+PA0-WKUP.Signal=GPXTI0
+PA0-WKUP.Locked=true
+PA10.GPIO_Mode=GPIO_MODE_AF_PP
+PB9.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PD12.Locked=true
+PC3.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PC12.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PA13.Signal=SYS_JTMS-SWDIO
+PC10.GPIO_Mode=GPIO_MODE_AF_PP
+PD4.GPIO_PuPd=GPIO_NOPULL
+PA11.Locked=true
+PA9.Mode=Activate_VBUS
+PC0.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+PB10.GPIO_Mode=GPIO_MODE_AF_PP
+I2S3.RealAudioFreq-Half_Duplex_Master=96.774 KHz
+PC15-OSC32_OUT.Locked=true
+PD12.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label
+ProjectManager.TargetToolchain=STM32CubeIDE
+PB10.GPIO_Label=CLK_IN [MP45DT02_CLK]
+VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS
+PB9.Mode=I2C
+PB2.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_Mode
+PA9.Signal=USB_OTG_FS_VBUS
+PB9.Locked=true
+I2S3.VirtualMode=I2S_MODE_MASTER
+ProjectManager.RegisterCallBack=
+PC7.GPIO_PuPd=GPIO_NOPULL
+PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
+PA7.GPIO_PuPd=GPIO_NOPULL
+PB10.Signal=I2S2_CK
+RCC.VCOI2SOutputFreq_Value=192000000
+PA5.Signal=SPI1_SCK
+PC12.Mode=Half_Duplex_Master
+board=STM32F407G-DISC1
+PD13.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+PC7.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+RCC.VCOOutputFreq_Value=336000000
+PE1.GPIO_Label=MEMS_INT2 [LIS302DL_INT2]
+ProjectManager.LastFirmware=true
+PA7.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+PB9.GPIO_Mode=GPIO_MODE_AF_OD
+PA12.GPIO_Mode=GPIO_MODE_AF_PP
+PA4.GPIO_Mode=GPIO_MODE_AF_PP
+RCC.APB2Freq_Value=84000000
+PB2.GPIO_Mode=GPIO_MODE_INPUT
+MxCube.Version=6.2.1
+SPI1.Mode=SPI_MODE_MASTER
+PD4.GPIO_Label=Audio_RST [CS43L22_RESET]
+PD4.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+Mcu.Pin30=PB6
+PA10.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PD4.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label
+VP_SYS_VS_Systick.Mode=SysTick
+RCC.EthernetFreq_Value=168000000
+Mcu.Pin33=VP_SYS_VS_Systick
+PE3.GPIO_PuPd=GPIO_NOPULL
+PH1-OSC_OUT.Signal=RCC_OSC_OUT
+Mcu.Pin34=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
+Mcu.Pin31=PB9
+PD13.GPIO_PuPd=GPIO_NOPULL
+Mcu.Pin32=PE1
+PA9.Locked=true
+PD5.GPIO_PuPd=GPIO_NOPULL
+NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+PD14.GPIO_Label=LD5 [Red Led]
+PA4.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PC10.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PH1-OSC_OUT.GPIO_Label=PH1-OSC_OUT
+PA13.Mode=Serial_Wire
+ProjectManager.FreePins=false
+RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
+ProjectManager.AskForMigrate=true
+Mcu.Name=STM32F407V(E-G)Tx
+Mcu.Pin26=PC12
+Mcu.Pin27=PD4
+RCC.RTCHSEDivFreq_Value=4000000
+PA13.GPIO_Label=SWDIO
+Mcu.Pin24=PA14
+ProjectManager.UnderRoot=true
+Mcu.Pin25=PC10
+PB2.Locked=true
+PC7.GPIO_Label=I2S3_MCK [CS43L22_MCLK]
+PD14.Signal=GPIO_Output
+Mcu.Pin28=PD5
+Mcu.IP6=USB_DEVICE
+Mcu.Pin29=PB3
+Mcu.IP7=USB_OTG_FS
+ProjectManager.CoupleFile=false
+RCC.48MHZClocksFreq_Value=48000000
+PB3.Signal=SYS_JTDO-SWO
+NVIC.EXTI0_IRQn=true\:0\:0\:false\:false\:true\:true\:true
+PA4.Signal=I2S3_WS
+PD14.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label
+RCC.SYSCLKFreq_VALUE=168000000
+Mcu.Pin22=PA12
+PC12.GPIO_Mode=GPIO_MODE_AF_PP
+Mcu.Pin23=PA13
+PA7.GPIO_Label=SPI1_MOSI [LIS302DL_SDA/SDI/SDO]
+Mcu.Pin20=PA10
+Mcu.Pin21=PA11
+PA12.Mode=Device_Only
+PA5.GPIO_Label=SPI1_SCK [LIS302DL_SCL/SPC]
+PA10.Locked=true
+NVIC.ForceEnableDMAVector=true
+KeepUserPlacement=false
+PE3.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+PA14.GPIOParameters=GPIO_Label
+NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+PH1-OSC_OUT.GPIOParameters=GPIO_Label
+PA13.Locked=true
+PC12.GPIO_Label=I2S3_SD [CS43L22_SDIN]
+ProjectManager.CompilerOptimize=6
+PD15.Locked=true
+PA11.Signal=USB_OTG_FS_DM
+PA14.Signal=SYS_JTCK-SWCLK
+PB2.GPIO_Label=BOOT1
+ProjectManager.HeapSize=0x200
+Mcu.Pin15=PD13
+NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+Mcu.Pin16=PD14
+Mcu.Pin13=PB10
+Mcu.Pin14=PD12
+Mcu.Pin19=PA9
+ProjectManager.ComputerToolchain=false
+Mcu.Pin17=PD15
+RCC.HSI_VALUE=16000000
+Mcu.Pin18=PC7
+PA5.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+RCC.PLLQ=7
+NVIC.PriorityGroup=NVIC_PRIORITYGROUP_0
+Mcu.Pin11=PA7
+I2S3.RealAudioFreq=93.75 KHz
+Mcu.Pin12=PB2
+RCC.PLLM=8
+RCC.PLLN=336
+Mcu.Pin10=PA6
+PE3.Signal=GPIO_Output
+PE3.GPIO_Label=CS_I2C/SPI [LIS302DL_CS_I2C/SPI]
+PC3.GPIO_Label=PDM_OUT [MP45DT02_DOUT]
+PA0-WKUP.GPIO_PuPd=GPIO_NOPULL
+I2S3.Instance=SPI$Index
+PC7.Mode=Master_Clock_Activated
+PA11.GPIO_Mode=GPIO_MODE_AF_PP
+PB6.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+SH.GPXTI1.ConfNb=1
+RCC.APB1Freq_Value=42000000
+PA5.GPIO_Mode=GPIO_MODE_AF_PP
+PC12.GPIO_Speed=GPIO_SPEED_FREQ_LOW
+SPI1.BaudRatePrescaler-Full_Duplex_Master=SPI_BAUDRATEPRESCALER_2
+PA7.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
+PC0.Locked=true
+ProjectManager.DeviceId=STM32F407VGTx
+ProjectManager.LibraryCopy=1
+PC3.GPIO_PuPd=GPIO_NOPULL
+PD12.GPIO_PuPd=GPIO_NOPULL
+PE1.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI
+PA7.Signal=SPI1_MOSI
+PA6.Locked=true
+isbadioc=false
diff --git a/termin3/aufgabe2/main.c b/termin3/aufgabe2/main.c
new file mode 100644
index 0000000..d1af084
--- /dev/null
+++ b/termin3/aufgabe2/main.c
@@ -0,0 +1,407 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ ******************************************************************************
+ * @attention
+ *
+ *
© Copyright (c) 2024 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "usb_device.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "usbd_cdc_if.h"
+/* 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 ---------------------------------------------------------*/
+I2C_HandleTypeDef hi2c1;
+
+I2S_HandleTypeDef hi2s3;
+
+SPI_HandleTypeDef hspi1;
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_I2C1_Init(void);
+static void MX_I2S3_Init(void);
+static void MX_SPI1_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_I2C1_Init();
+ MX_I2S3_Init();
+ MX_SPI1_Init();
+ MX_USB_DEVICE_Init();
+ /* USER CODE BEGIN 2 */
+
+ /* USER CODE END 2 */
+
+ /* Infinite loop */
+ /* USER CODE BEGIN WHILE */
+ while (1)
+ {
+ // Verzögerungsschleife
+ for (volatile uint32_t i = 0; i < 10000000; i++);
+ /* 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};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_RCC_PWR_CLK_ENABLE();
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the RCC Oscillators according to the specified parameters
+ * in the RCC_OscInitTypeDef structure.
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ RCC_OscInitStruct.PLL.PLLM = 8;
+ RCC_OscInitStruct.PLL.PLLN = 336;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
+ RCC_OscInitStruct.PLL.PLLQ = 7;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the CPU, AHB and APB buses clocks
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S;
+ PeriphClkInitStruct.PLLI2S.PLLI2SN = 192;
+ PeriphClkInitStruct.PLLI2S.PLLI2SR = 2;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief I2C1 Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_I2C1_Init(void)
+{
+
+ /* USER CODE BEGIN I2C1_Init 0 */
+
+ /* USER CODE END I2C1_Init 0 */
+
+ /* USER CODE BEGIN I2C1_Init 1 */
+
+ /* USER CODE END I2C1_Init 1 */
+ 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)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN I2C1_Init 2 */
+
+ /* USER CODE END I2C1_Init 2 */
+
+}
+
+/**
+ * @brief I2S3 Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_I2S3_Init(void)
+{
+
+ /* USER CODE BEGIN I2S3_Init 0 */
+
+ /* USER CODE END I2S3_Init 0 */
+
+ /* USER CODE BEGIN I2S3_Init 1 */
+
+ /* USER CODE END I2S3_Init 1 */
+ hi2s3.Instance = SPI3;
+ hi2s3.Init.Mode = I2S_MODE_MASTER_TX;
+ hi2s3.Init.Standard = I2S_STANDARD_PHILIPS;
+ hi2s3.Init.DataFormat = I2S_DATAFORMAT_16B;
+ hi2s3.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
+ hi2s3.Init.AudioFreq = I2S_AUDIOFREQ_96K;
+ hi2s3.Init.CPOL = I2S_CPOL_LOW;
+ hi2s3.Init.ClockSource = I2S_CLOCK_PLL;
+ hi2s3.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE;
+ if (HAL_I2S_Init(&hi2s3) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN I2S3_Init 2 */
+
+ /* USER CODE END I2S3_Init 2 */
+
+}
+
+/**
+ * @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_2LINES;
+ hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
+ hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
+ hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
+ hspi1.Init.NSS = SPI_NSS_SOFT;
+ hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
+ hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
+ hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
+ hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
+ hspi1.Init.CRCPolynomial = 10;
+ if (HAL_SPI_Init(&hspi1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN SPI1_Init 2 */
+
+ /* USER CODE END SPI1_Init 2 */
+
+}
+
+/**
+ * @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_GPIOE_CLK_ENABLE();
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOH_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(CS_I2C_SPI_GPIO_Port, CS_I2C_SPI_Pin, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(OTG_FS_PowerSwitchOn_GPIO_Port, OTG_FS_PowerSwitchOn_Pin, GPIO_PIN_SET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOD, LD4_Pin|LD3_Pin|LD5_Pin|LD6_Pin
+ |Audio_RST_Pin, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin : CS_I2C_SPI_Pin */
+ GPIO_InitStruct.Pin = CS_I2C_SPI_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(CS_I2C_SPI_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : OTG_FS_PowerSwitchOn_Pin */
+ GPIO_InitStruct.Pin = OTG_FS_PowerSwitchOn_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(OTG_FS_PowerSwitchOn_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : PDM_OUT_Pin */
+ GPIO_InitStruct.Pin = PDM_OUT_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
+ HAL_GPIO_Init(PDM_OUT_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : B1_Pin */
+ GPIO_InitStruct.Pin = B1_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : BOOT1_Pin */
+ GPIO_InitStruct.Pin = BOOT1_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(BOOT1_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : CLK_IN_Pin */
+ GPIO_InitStruct.Pin = CLK_IN_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
+ HAL_GPIO_Init(CLK_IN_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : LD4_Pin LD3_Pin LD5_Pin LD6_Pin
+ Audio_RST_Pin */
+ GPIO_InitStruct.Pin = LD4_Pin|LD3_Pin|LD5_Pin|LD6_Pin
+ |Audio_RST_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : OTG_FS_OverCurrent_Pin */
+ GPIO_InitStruct.Pin = OTG_FS_OverCurrent_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(OTG_FS_OverCurrent_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : MEMS_INT2_Pin */
+ GPIO_InitStruct.Pin = MEMS_INT2_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(MEMS_INT2_GPIO_Port, &GPIO_InitStruct);
+
+ /* EXTI interrupt init*/
+ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(EXTI0_IRQn);
+
+}
+
+/* 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 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/termin3/aufgabe2/stm32f4xx_it.c b/termin3/aufgabe2/stm32f4xx_it.c
new file mode 100644
index 0000000..5c34fc5
--- /dev/null
+++ b/termin3/aufgabe2/stm32f4xx_it.c
@@ -0,0 +1,233 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32f4xx_it.c
+ * @brief Interrupt Service Routines.
+ ******************************************************************************
+ * @attention
+ *
+ * © Copyright (c) 2024 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32f4xx_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 --------------------------------------------------------*/
+extern PCD_HandleTypeDef hpcd_USB_OTG_FS;
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex-M4 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 Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Pre-fetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_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 */
+}
+
+/******************************************************************************/
+/* STM32F4xx 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_stm32f4xx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles EXTI line0 interrupt.
+ */
+void EXTI0_IRQHandler(void)
+{
+ /* USER CODE BEGIN EXTI0_IRQn 0 */
+
+ /* USER CODE END EXTI0_IRQn 0 */
+ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
+ /* USER CODE BEGIN EXTI0_IRQn 1 */
+
+ /* USER CODE END EXTI0_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USB On The Go FS global interrupt.
+ */
+void OTG_FS_IRQHandler(void)
+{
+ /* USER CODE BEGIN OTG_FS_IRQn 0 */
+
+ /* USER CODE END OTG_FS_IRQn 0 */
+ HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
+ /* USER CODE BEGIN OTG_FS_IRQn 1 */
+
+ /* USER CODE END OTG_FS_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/termin3/aufgabe2/usbd_cdc_if.c b/termin3/aufgabe2/usbd_cdc_if.c
new file mode 100644
index 0000000..62af46c
--- /dev/null
+++ b/termin3/aufgabe2/usbd_cdc_if.c
@@ -0,0 +1,335 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : usbd_cdc_if.c
+ * @version : v1.0_Cube
+ * @brief : Usb device for Virtual Com Port.
+ ******************************************************************************
+ * @attention
+ *
+ * © Copyright (c) 2024 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "usbd_cdc_if.h"
+
+/* USER CODE BEGIN INCLUDE */
+#include "main.h"
+/* USER CODE END INCLUDE */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+
+/* USER CODE BEGIN PV */
+/* Private variables ---------------------------------------------------------*/
+
+/* USER CODE END PV */
+
+/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
+ * @brief Usb device library.
+ * @{
+ */
+
+/** @addtogroup USBD_CDC_IF
+ * @{
+ */
+
+/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
+ * @brief Private types.
+ * @{
+ */
+
+/* USER CODE BEGIN PRIVATE_TYPES */
+
+/* USER CODE END PRIVATE_TYPES */
+
+/**
+ * @}
+ */
+
+/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
+ * @brief Private defines.
+ * @{
+ */
+
+/* USER CODE BEGIN PRIVATE_DEFINES */
+/* USER CODE END PRIVATE_DEFINES */
+
+/**
+ * @}
+ */
+
+/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
+ * @brief Private macros.
+ * @{
+ */
+
+/* USER CODE BEGIN PRIVATE_MACRO */
+
+/* USER CODE END PRIVATE_MACRO */
+
+/**
+ * @}
+ */
+
+/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
+ * @brief Private variables.
+ * @{
+ */
+/* Create buffer for reception and transmission */
+/* It's up to user to redefine and/or remove those define */
+/** Received data over USB are stored in this buffer */
+uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
+
+/** Data to send over USB CDC are stored in this buffer */
+uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
+
+/* USER CODE BEGIN PRIVATE_VARIABLES */
+
+/* USER CODE END PRIVATE_VARIABLES */
+
+/**
+ * @}
+ */
+
+/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
+ * @brief Public variables.
+ * @{
+ */
+
+extern USBD_HandleTypeDef hUsbDeviceFS;
+
+/* USER CODE BEGIN EXPORTED_VARIABLES */
+
+/* USER CODE END EXPORTED_VARIABLES */
+
+/**
+ * @}
+ */
+
+/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
+ * @brief Private functions declaration.
+ * @{
+ */
+
+static int8_t CDC_Init_FS(void);
+static int8_t CDC_DeInit_FS(void);
+static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
+static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);
+static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum);
+
+/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
+
+/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
+
+/**
+ * @}
+ */
+
+USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
+{
+ CDC_Init_FS,
+ CDC_DeInit_FS,
+ CDC_Control_FS,
+ CDC_Receive_FS,
+ CDC_TransmitCplt_FS
+};
+
+/* Private functions ---------------------------------------------------------*/
+/**
+ * @brief Initializes the CDC media low layer over the FS USB IP
+ * @retval USBD_OK if all operations are OK else USBD_FAIL
+ */
+static int8_t CDC_Init_FS(void)
+{
+ /* USER CODE BEGIN 3 */
+ /* Set Application Buffers */
+ USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
+ USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
+ return (USBD_OK);
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief DeInitializes the CDC media low layer
+ * @retval USBD_OK if all operations are OK else USBD_FAIL
+ */
+static int8_t CDC_DeInit_FS(void)
+{
+ /* USER CODE BEGIN 4 */
+ return (USBD_OK);
+ /* USER CODE END 4 */
+}
+
+/**
+ * @brief Manage the CDC class requests
+ * @param cmd: Command code
+ * @param pbuf: Buffer containing command data (request parameters)
+ * @param length: Number of data to be sent (in bytes)
+ * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
+ */
+static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
+{
+ /* USER CODE BEGIN 5 */
+ switch(cmd)
+ {
+ case CDC_SEND_ENCAPSULATED_COMMAND:
+
+ break;
+
+ case CDC_GET_ENCAPSULATED_RESPONSE:
+
+ break;
+
+ case CDC_SET_COMM_FEATURE:
+
+ break;
+
+ case CDC_GET_COMM_FEATURE:
+
+ break;
+
+ case CDC_CLEAR_COMM_FEATURE:
+
+ break;
+
+ /*******************************************************************************/
+ /* Line Coding Structure */
+ /*-----------------------------------------------------------------------------*/
+ /* Offset | Field | Size | Value | Description */
+ /* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/
+ /* 4 | bCharFormat | 1 | Number | Stop bits */
+ /* 0 - 1 Stop bit */
+ /* 1 - 1.5 Stop bits */
+ /* 2 - 2 Stop bits */
+ /* 5 | bParityType | 1 | Number | Parity */
+ /* 0 - None */
+ /* 1 - Odd */
+ /* 2 - Even */
+ /* 3 - Mark */
+ /* 4 - Space */
+ /* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */
+ /*******************************************************************************/
+ case CDC_SET_LINE_CODING:
+
+ break;
+
+ case CDC_GET_LINE_CODING:
+
+ break;
+
+ case CDC_SET_CONTROL_LINE_STATE:
+
+ break;
+
+ case CDC_SEND_BREAK:
+
+ break;
+
+ default:
+ break;
+ }
+
+ return (USBD_OK);
+ /* USER CODE END 5 */
+}
+
+/**
+ * @brief Data received over USB OUT endpoint are sent over CDC interface
+ * through this function.
+ *
+ * @note
+ * This function will issue a NAK packet on any OUT packet received on
+ * USB endpoint until exiting this function. If you exit this function
+ * before transfer is complete on CDC interface (ie. using DMA controller)
+ * it will result in receiving more data while previous ones are still
+ * not sent.
+ *
+ * @param Buf: Buffer of data to be received
+ * @param Len: Number of data received (in bytes)
+ * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
+ */
+static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
+{
+ /* USER CODE BEGIN 6 */
+ USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
+ USBD_CDC_ReceivePacket(&hUsbDeviceFS);
+ // Schaltet LED4 bei jedem empfangenen Paket um
+ HAL_GPIO_TogglePin(LD4_GPIO_Port, LD4_Pin);
+ // Sendet die empfangenen Daten zurück
+ CDC_Transmit_FS(Buf, *Len);
+ return (USBD_OK);
+ /* USER CODE END 6 */
+}
+
+/**
+ * @brief CDC_Transmit_FS
+ * Data to send over USB IN endpoint are sent over CDC interface
+ * through this function.
+ * @note
+ *
+ *
+ * @param Buf: Buffer of data to be sent
+ * @param Len: Number of data to be sent (in bytes)
+ * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
+ */
+uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
+{
+ uint8_t result = USBD_OK;
+ /* USER CODE BEGIN 7 */
+ USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
+ if (hcdc->TxState != 0){
+ return USBD_BUSY;
+ }
+ USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
+ result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
+ /* USER CODE END 7 */
+ return result;
+}
+
+/**
+ * @brief CDC_TransmitCplt_FS
+ * Data transmited callback
+ *
+ * @note
+ * This function is IN transfer complete callback used to inform user that
+ * the submitted Data is successfully sent over USB.
+ *
+ * @param Buf: Buffer of data to be received
+ * @param Len: Number of data received (in bytes)
+ * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
+ */
+static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
+{
+ uint8_t result = USBD_OK;
+ /* USER CODE BEGIN 13 */
+ UNUSED(Buf);
+ UNUSED(Len);
+ UNUSED(epnum);
+ /* USER CODE END 13 */
+ return result;
+}
+
+/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
+
+/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/