diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 5bc2f65..97a727e 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -6,7 +6,7 @@ - + @@ -18,7 +18,7 @@ - + diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 640d96f..b7b2c64 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -49,6 +49,8 @@ extern "C" { /* USER CODE END EM */ +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /* Exported functions prototypes ---------------------------------------------*/ void Error_Handler(void); diff --git a/Core/Inc/stm32f4xx_hal_conf.h b/Core/Inc/stm32f4xx_hal_conf.h index 5f28925..ef7554a 100644 --- a/Core/Inc/stm32f4xx_hal_conf.h +++ b/Core/Inc/stm32f4xx_hal_conf.h @@ -63,7 +63,7 @@ #define HAL_SD_MODULE_ENABLED /* #define HAL_MMC_MODULE_ENABLED */ #define HAL_SPI_MODULE_ENABLED -/* #define HAL_TIM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED /* #define HAL_UART_MODULE_ENABLED */ /* #define HAL_USART_MODULE_ENABLED */ /* #define HAL_IRDA_MODULE_ENABLED */ diff --git a/Core/Src/Components/Start.cpp b/Core/Src/Components/Start.cpp index 6eff501..56d55cf 100644 --- a/Core/Src/Components/Start.cpp +++ b/Core/Src/Components/Start.cpp @@ -11,7 +11,7 @@ #include "AUDIO.h" void Start(){ - AUDIO_OUT_Init(2, 100, 48000); + AUDIO_OUT_Init(2, 90, 48000); while(1){ } diff --git a/Core/Src/main.c b/Core/Src/main.c index b943b31..d23156c 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -52,6 +52,8 @@ SD_HandleTypeDef hsd; SPI_HandleTypeDef hspi1; +TIM_HandleTypeDef htim1; + /* USER CODE BEGIN PV */ /* USER CODE END PV */ @@ -66,6 +68,7 @@ static void MX_I2S3_Init(void); static void MX_SPI1_Init(void); static void MX_SDIO_SD_Init(void); static void MX_DMA_Init(void); +static void MX_TIM1_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -101,7 +104,6 @@ int main(void) PeriphCommonClock_Config(); /* USER CODE BEGIN SysInit */ - /* USER CODE END SysInit */ /* Initialize all configured peripherals */ @@ -114,6 +116,7 @@ int main(void) MX_DMA_Init(); MX_USB_DEVICE_Init(); MX_FATFS_Init(); + MX_TIM1_Init(); /* USER CODE BEGIN 2 */ Start(); /* USER CODE END 2 */ @@ -362,6 +365,75 @@ static void MX_SPI1_Init(void) } +/** + * @brief TIM1 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM1_Init(void) +{ + + /* USER CODE BEGIN TIM1_Init 0 */ + + /* USER CODE END TIM1_Init 0 */ + + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; + + /* USER CODE BEGIN TIM1_Init 1 */ + + /* USER CODE END TIM1_Init 1 */ + htim1.Instance = TIM1; + htim1.Init.Prescaler = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + htim1.Init.Period = 65535; + htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim1.Init.RepetitionCounter = 0; + htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; + sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; + sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; + sBreakDeadTimeConfig.DeadTime = 0; + sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; + sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; + sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM1_Init 2 */ + + /* USER CODE END TIM1_Init 2 */ + HAL_TIM_MspPostInit(&htim1); + +} + /** * Enable DMA controller clock */ diff --git a/Core/Src/stm32f4xx_hal_msp.c b/Core/Src/stm32f4xx_hal_msp.c index 6614842..e7ef4c7 100644 --- a/Core/Src/stm32f4xx_hal_msp.c +++ b/Core/Src/stm32f4xx_hal_msp.c @@ -58,7 +58,9 @@ extern DMA_HandleTypeDef hdma_spi3_tx; /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ -/** + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /** * Initializes the Global MSP. */ void HAL_MspInit(void) @@ -466,6 +468,79 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) } +/** +* @brief TIM_PWM MSP Initialization +* This function configures the hardware resources used in this example +* @param htim_pwm: TIM_PWM handle pointer +* @retval None +*/ +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm) +{ + if(htim_pwm->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspInit 0 */ + + /* USER CODE END TIM1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM1_CLK_ENABLE(); + /* USER CODE BEGIN TIM1_MspInit 1 */ + + /* USER CODE END TIM1_MspInit 1 */ + } + +} + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(htim->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspPostInit 0 */ + + /* USER CODE END TIM1_MspPostInit 0 */ + + __HAL_RCC_GPIOE_CLK_ENABLE(); + /**TIM1 GPIO Configuration + PE8 ------> TIM1_CH1N + PE9 ------> TIM1_CH1 + PE10 ------> TIM1_CH2N + PE11 ------> TIM1_CH2 + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM1_MspPostInit 1 */ + + /* USER CODE END TIM1_MspPostInit 1 */ + } + +} +/** +* @brief TIM_PWM MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param htim_pwm: TIM_PWM handle pointer +* @retval None +*/ +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm) +{ + if(htim_pwm->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspDeInit 0 */ + + /* USER CODE END TIM1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM1_CLK_DISABLE(); + /* USER CODE BEGIN TIM1_MspDeInit 1 */ + + /* USER CODE END TIM1_MspDeInit 1 */ + } + +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/F411-DMA-Audio.ioc b/F411-DMA-Audio.ioc index e03d675..f2a581e 100644 --- a/F411-DMA-Audio.ioc +++ b/F411-DMA-Audio.ioc @@ -48,8 +48,9 @@ Mcu.CPN=STM32F411VET6 Mcu.Family=STM32F4 Mcu.IP0=DMA Mcu.IP1=FATFS -Mcu.IP10=USB_DEVICE -Mcu.IP11=USB_OTG_FS +Mcu.IP10=TIM1 +Mcu.IP11=USB_DEVICE +Mcu.IP12=USB_OTG_FS Mcu.IP2=I2C1 Mcu.IP3=I2S2 Mcu.IP4=I2S3 @@ -58,7 +59,7 @@ Mcu.IP6=RCC Mcu.IP7=SDIO Mcu.IP8=SPI1 Mcu.IP9=SYS -Mcu.IPNb=12 +Mcu.IPNb=13 Mcu.Name=STM32F411V(C-E)Tx Mcu.Package=LQFP100 Mcu.Pin0=PE2 @@ -69,41 +70,45 @@ Mcu.Pin12=PA4 Mcu.Pin13=PA5 Mcu.Pin14=PA6 Mcu.Pin15=PA7 -Mcu.Pin16=PB10 -Mcu.Pin17=PB12 -Mcu.Pin18=PB15 -Mcu.Pin19=PD12 +Mcu.Pin16=PE8 +Mcu.Pin17=PE9 +Mcu.Pin18=PE10 +Mcu.Pin19=PE11 Mcu.Pin2=PE4 -Mcu.Pin20=PD13 -Mcu.Pin21=PD14 -Mcu.Pin22=PD15 -Mcu.Pin23=PC7 -Mcu.Pin24=PC8 -Mcu.Pin25=PA9 -Mcu.Pin26=PA10 -Mcu.Pin27=PA11 -Mcu.Pin28=PA12 -Mcu.Pin29=PA13 +Mcu.Pin20=PB10 +Mcu.Pin21=PB12 +Mcu.Pin22=PB15 +Mcu.Pin23=PD12 +Mcu.Pin24=PD13 +Mcu.Pin25=PD14 +Mcu.Pin26=PD15 +Mcu.Pin27=PC7 +Mcu.Pin28=PC8 +Mcu.Pin29=PA9 Mcu.Pin3=PE5 -Mcu.Pin30=PA14 -Mcu.Pin31=PC10 -Mcu.Pin32=PC12 -Mcu.Pin33=PD2 -Mcu.Pin34=PD4 -Mcu.Pin35=PB3 -Mcu.Pin36=PB6 -Mcu.Pin37=PB9 -Mcu.Pin38=PE1 -Mcu.Pin39=VP_FATFS_VS_SDIO +Mcu.Pin30=PA10 +Mcu.Pin31=PA11 +Mcu.Pin32=PA12 +Mcu.Pin33=PA13 +Mcu.Pin34=PA14 +Mcu.Pin35=PC10 +Mcu.Pin36=PC12 +Mcu.Pin37=PD2 +Mcu.Pin38=PD4 +Mcu.Pin39=PB3 Mcu.Pin4=PC14-OSC32_IN -Mcu.Pin40=VP_SYS_VS_Systick -Mcu.Pin41=VP_USB_DEVICE_VS_USB_DEVICE_AUDIO_FS +Mcu.Pin40=PB6 +Mcu.Pin41=PB9 +Mcu.Pin42=PE1 +Mcu.Pin43=VP_FATFS_VS_SDIO +Mcu.Pin44=VP_SYS_VS_Systick +Mcu.Pin45=VP_USB_DEVICE_VS_USB_DEVICE_AUDIO_FS Mcu.Pin5=PC15-OSC32_OUT Mcu.Pin6=PH0 - OSC_IN Mcu.Pin7=PH1 - OSC_OUT Mcu.Pin8=PC1 Mcu.Pin9=PC2 -Mcu.PinsNb=42 +Mcu.PinsNb=46 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F411VETx @@ -289,6 +294,10 @@ PE1.GPIO_Label=MEMS_INT2 [L3GD20_INT2] PE1.GPIO_ModeDefaultEXTI=GPIO_MODE_EVT_RISING PE1.Locked=true PE1.Signal=GPXTI1 +PE10.Locked=true +PE10.Mode=PWM Generation2 CH2 CH2N +PE10.Signal=TIM1_CH2N +PE11.Signal=S_TIM1_CH2 PE2.GPIOParameters=GPIO_Label PE2.GPIO_Label=DATA_Ready [LSM303DLHC_DRDY] PE2.Locked=true @@ -307,6 +316,9 @@ PE5.GPIO_Label=INT2 [LSM303DLHC_INT2] PE5.GPIO_ModeDefaultEXTI=GPIO_MODE_EVT_RISING PE5.Locked=true PE5.Signal=GPXTI5 +PE8.Mode=PWM Generation1 CH1 CH1N +PE8.Signal=TIM1_CH1N +PE9.Signal=S_TIM1_CH1 PH0\ -\ OSC_IN.GPIOParameters=GPIO_Label PH0\ -\ OSC_IN.GPIO_Label=PH0-OSC_IN PH0\ -\ OSC_IN.Locked=true @@ -361,7 +373,8 @@ RCC.HCLKFreq_Value=96000000 RCC.HSE_VALUE=8000000 RCC.HSI_VALUE=16000000 RCC.I2SClocksFreq_Value=160000000 -RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,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,PLLI2SM,PLLI2SN,PLLM,PLLP,PLLQ,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOInputMFreq_Value,VCOOutputFreq_Value,VcooutputI2S +RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLI2SM,PLLI2SN,PLLM,PLLP,PLLQ,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOInputMFreq_Value,VCOOutputFreq_Value,VcooutputI2S +RCC.LSE_VALUE=32768 RCC.LSI_VALUE=32000 RCC.MCO2PinFreq_Value=96000000 RCC.PLLCLKFreq_Value=96000000 @@ -388,12 +401,22 @@ SH.GPXTI4.0=GPIO_EXTI4 SH.GPXTI4.ConfNb=1 SH.GPXTI5.0=GPIO_EXTI5 SH.GPXTI5.ConfNb=1 +SH.S_TIM1_CH1.0=TIM1_CH1,PWM Generation1 CH1 CH1N +SH.S_TIM1_CH1.ConfNb=1 +SH.S_TIM1_CH2.0=TIM1_CH2,PWM Generation2 CH2 CH2N +SH.S_TIM1_CH2.ConfNb=1 SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2 SPI1.CalculateBaudRate=48.0 MBits/s SPI1.Direction=SPI_DIRECTION_2LINES SPI1.IPParameters=CalculateBaudRate,BaudRatePrescaler,Mode,VirtualType,Direction SPI1.Mode=SPI_MODE_MASTER SPI1.VirtualType=VM_MASTER +TIM1.Channel-PWM\ Generation1\ CH1\ CH1N=TIM_CHANNEL_1 +TIM1.Channel-PWM\ Generation2\ CH2\ CH2N=TIM_CHANNEL_2 +TIM1.IPParameters=Channel-PWM Generation1 CH1 CH1N,OCMode_PWM-PWM Generation1 CH1 CH1N,OffStateRunMode,OffStateIDLEMode,Channel-PWM Generation2 CH2 CH2N +TIM1.OCMode_PWM-PWM\ Generation1\ CH1\ CH1N=TIM_OCMODE_PWM1 +TIM1.OffStateIDLEMode=TIM_OSSI_DISABLE +TIM1.OffStateRunMode=TIM_OSSR_DISABLE USB_DEVICE.CLASS_NAME_FS=AUDIO USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS,USBD_AUDIO_FREQ USB_DEVICE.USBD_AUDIO_FREQ=48000 diff --git a/USB_DEVICE/App/usbd_audio_if.c b/USB_DEVICE/App/usbd_audio_if.c index c92a861..45b0402 100644 --- a/USB_DEVICE/App/usbd_audio_if.c +++ b/USB_DEVICE/App/usbd_audio_if.c @@ -189,7 +189,11 @@ static int8_t AUDIO_AudioCmd_FS(uint8_t* pbuf, uint32_t size, uint8_t cmd) break; case AUDIO_CMD_PLAY: + AUDIO_OUT_Play(pbuf, 2*size); + break; + case AUDIO_CMD_STOP: + //AUDIO_OUT_Pause(); break; } UNUSED(pbuf); @@ -207,6 +211,7 @@ static int8_t AUDIO_AudioCmd_FS(uint8_t* pbuf, uint32_t size, uint8_t cmd) static int8_t AUDIO_VolumeCtl_FS(uint8_t vol) { /* USER CODE BEGIN 3 */ + AUDIO_OUT_SetVolume(vol); UNUSED(vol); return (USBD_OK); /* USER CODE END 3 */