Target description
- This tutorial enables you to:
- Use the X-NUCLEO-USBPDM1 shield used includes a TCPP01M12 protection circuit and provides a USB Type-C® connector
- Create a USB-PD Sink Device with the NUCLEO-G071RB board and the X-NUCLEO-USBPDM1 shield
- Create a USB-PD Sink device using our STM32CubeIDE software
Prerequisites
- Computer with Windows 7 (or higher)
Hardware
- NUCLEO-G071RB[1]
- X-NUCLEO-USBPDM1[2]
- USB cable Type-A to Micro-B
- USB Type-C cable
- A USB-PD source device to test our USB-PD device
Software
Literature
- NUCLEO-G071RB User Manual[5]
- X-NUCLEO-USBPDM1 User Manual[6]
- AN5418[7]
- How to Create a STM32G0 USB-PD Device with STM32CubeIDE.
1. Steps
1.1. Installation of the software tools
In this part, the software we will be working on are STM32CubeIDE
To follow the installation instructions, please refer to this wiki page Tools installation.
1.2. Launching the Project
Open STM32CubeIDE and create a New Project, then select the STM32G071RBT6 from the "MCU/MPU Selector Tab"
File:STM32StepByStep:Picture1.png
1.3. Configuring the Project
- Enter a name for the project and click Finish:
File:STM32StepByStep:Picture2.png
- Enable UCPD:
In this step we will enable and configure the UCPD peripheral, we will configure it as a sink.
- Activate UCPD1 in Sink mode
- No need to include “Dead Battery Signals” in the mode configuration as this is managed by the TCPP01 protection device on the X-NUCLEO-USBPDM1 shield.
File:STM32StepByStep:Picture3.png
- BlahBlahBlah:
File:STM32StepByStep:Picture4.png
- BlahBlahBlah:
File:STM32StepByStep:Picture5.png
- BlahBlahBlah:
File:STM32StepByStep:Picture6.png
- BlahBlahBlah:
File:STM32StepByStep:Picture7.png
- BlahBlahBlah:
File:STM32StepByStep:Picture8.png
- BlahBlahBlah:
File:STM32StepByStep:Picture9.png
- BlahBlahBlah:
File:STM32StepByStep:Picture10.png
- BlahBlahBlah:
File:STM32StepByStep:Picture4.png
- BlahBlahBlah:
File:STM32StepByStep:Picture5.png
- BlahBlahBlah:
File:STM32StepByStep:Picture6.png
- BlahBlahBlah:
File:STM32StepByStep:Picture7.png
- BlahBlahBlah:
File:STM32StepByStep:Picture8.png
- BlahBlahBlah:
File:STM32StepByStep:Picture9.png
- BlahBlahBlah:
File:STM32StepByStep:Picture10.png
- BlahBlahBlah:
File:STM32StepByStep:Picture11.png
- BlahBlahBlah:
File:STM32StepByStep:Picture12.png
- BlahBlahBlah:
File:STM32StepByStep:Picture13.png
- BlahBlahBlah:
File:STM32StepByStep:Picture14.png
- BlahBlahBlah:
File:STM32StepByStep:Picture15.png
- BlahBlahBlah:
File:STM32StepByStep:Picture16.png
- BlahBlahBlah:
File:STM32StepByStep:Picture17.png
- BlahBlahBlah:
File:STM32StepByStep:Picture18.png
- BlahBlahBlah:
File:STM32StepByStep:Picture19.png
- BlahBlahBlah:
File:STM32StepByStep:Picture20.png
- BlahBlahBlah:
File:STM32StepByStep:Picture21.png
- BlahBlahBlah:
File:STM32StepByStep:Picture22.png
- BlahBlahBlah:
File:STM32StepByStep:Picture23.png
- BlahBlahBlah:
File:STM32StepByStep:Picture24.png
- BlahBlahBlah:
File:STM32StepByStep:Picture25.png
- BlahBlahBlah:
File:STM32StepByStep:Picture26.png
- BlahBlahBlah:
File:STM32StepByStep:Picture27.png
- BlahBlahBlah:
File:STM32StepByStep:Picture28.png
From the Project Manager view, configure the project settings: rename the application, choose STM32CubeIDE as toolchain and click on Generate code.
Once launching the project, follow these steps to create the application:
- Create a new folder in the project's directory in the Drivers folder and name it BSP.
- From the STM32CubeF7 MCU package downloaded from STM32CubeMX, copy the Components folder placed in the directory: C:\Users\UserName\STM32Cube\Repository\STM32Cube_FW_F7_V1.16.0\Drivers\BSP and paste it in the BSP folder in the project's directory.
- Create a new folder in the BSP one named STM32F769I-Discovery and copy the two files : stm32f769i_discovery.c and its header file stm32f769i_discovery.h from the directory: C:\Users\UserName\STM32Cube\Repository\STM32Cube_FW_F7_V1.16.0\Drivers\BSP\STM32F769I-Discovery and place them in the STM32F769I-Discovery folder.
- From Project menu or File menu, go to Properties > C/C++ Build > Settings > Tool Settings > MCU GCC Compiler > Include paths
- Add the following includes as presented in the following photo :
- In the main.h file add the following includes:
#include "stm32f7xx_hal.h"
#include "stm32f769i_discovery.h"
#include "../Components/Common/audio.h"
#include "../Components/wm8994/wm8994.h"
In the main.c file add the following declarations:
#define SaturaLH(N, L, H) (((N)<(L))?(L):(((N)>(H))?(H):(N)))
int32_t LeftRecBuff[2048];
int32_t RightRecBuff[2048];
int16_t PlayBuff[4096];
uint32_t DmaLeftRecHalfBuffCplt = 0;
uint32_t DmaLeftRecBuffCplt = 0;
uint32_t DmaRightRecHalfBuffCplt = 0;
uint32_t DmaRightRecBuffCplt = 0;
uint32_t PlaybackStarted = 0;
AUDIO_DrvTypeDef *audio_drv;
- Add the following function code:
void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
{
if(hdfsdm_filter == &hdfsdm1_filter0)
{
DmaLeftRecHalfBuffCplt = 1;
}
else
{
DmaRightRecHalfBuffCplt = 1;
}
}
In the initialization function of the SAI, add the following code that reads the signal from the microphone device: WM899, initialize audio driver */
if(WM8994_ID != wm8994_drv.ReadID(AUDIO_I2C_ADDRESS))
{
Error_Handler();
}
audio_drv = &wm8994_drv;
audio_drv->Reset(AUDIO_I2C_ADDRESS);
if(0 != audio_drv->Init(AUDIO_I2C_ADDRESS, OUTPUT_DEVICE_HEADPHONE, 100, AUDIO_FREQUENCY_22K))
{
Error_Handler();
}
- After declaring i as uint32_t, in the While loop, add the following code:
if((DmaLeftRecHalfBuffCplt == 1) && (DmaRightRecHalfBuffCplt == 1))
{
for(i = 0; i < 1024; i++)
{
PlayBuff[2*i] = SaturaLH((LeftRecBuff[i] >> 8), -32768, 32767);
PlayBuff[(2*i)+1] = SaturaLH((RightRecBuff[i] >> 8), -32768, 32767);
}
if(PlaybackStarted == 0)
{
if(0 != audio_drv->Play(AUDIO_I2C_ADDRESS, (uint16_t *) &PlayBuff[0], 4096))
{
Error_Handler();
}
if(HAL_OK != HAL_SAI_Transmit_DMA(&hsai_BlockA1, (uint8_t *) &PlayBuff[0], 4096))
{
Error_Handler();
}
PlaybackStarted = 1;
}
DmaLeftRecHalfBuffCplt = 0;
DmaRightRecHalfBuffCplt = 0;
}
if((DmaLeftRecBuffCplt == 1) && (DmaRightRecBuffCplt == 1))
{
for(i = 1024; i < 2048; i++)
{
PlayBuff[2*i] = SaturaLH((LeftRecBuff[i] >> 8), -32768, 32767);
PlayBuff[(2*i)+1] = SaturaLH((RightRecBuff[i] >> 8), -32768, 32767);
}
DmaLeftRecBuffCplt = 0;
DmaRightRecBuffCplt = 0;
}
After finishing the code part, click on Build and later Debug the program.
Put your earphones in the Output audio line jack and enjoy!
1.4. References