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 */