====== 在STM32F103RC上验证USB库的USB_Audio例子 ======
----
ST官方提供的 [[https://my.st.com/content/my_st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32121.license=1551973130209.product=STSW-STM32121.version=4.1.0.html|STM32F10x, STM32L1xx and STM32F3xx USB full speed device library (UM0424)]],便于使用 STM32 MCU开发USB设备。
本例程使用STM32F103RC MINI 板子验证,需要修改相应的GPIO配置。
===== 建立工程及环境 =====
----
- 在官网[[https://my.st.com/content/my_st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32121.license=1551973130209.product=STSW-STM32121.version=4.1.0.html|下载]]开发包,或从网盘下载 https://pan.baidu.com/s/1E7kyjm_BeFeMLvMiJvYu1w 提取码:b9nv
- 解压开发包,保留原路径结构,复制开发包中的项目 Audio_Speaker目录(位于目录 STM32 USB-FS-Device development kit\en.stsw-stm32121.zip\STM32_USB-FS-Device_Lib_V4.1.0\Projects)
- 打开新项目目录中包括多个工具链的工程文件,选择合适的工程打开(STM32F103RC的器件可以使用 STM3210E-EVAL 配置,其他配置可以删除)
- 编译工程前,重新选择器件,注意如果选择STM32F103RC6的芯片,Keil5会自动定义宏STM32F10X_HD。如果原例子工程使用的是STM32F10RB,C/C++选项里预定义了STM32F10X_MD,这个预定义要去掉,否则冲突。选好器件后编译
- 编译成功加载到板上运行(STM32F103RC MINI),会遇到STLINK连接不通等问题,后续解决
==== 基本功能修改 ====
* 编译运行,连接USB到PC,可以正确安装设备驱动,系统中多了一个STM32 Speaker的设备
* 在音量控制栏选择合成器,扬声器指定使用STM32 Speaker,打开属性,可以测试Mute,播放等功能,播放会出现“无法播放测试音频”的错误
* 修改设备的音频采样率(22k改为48k),重新编译;卸载设备,重新插拔设备,设备的采样率变为48kHz,可以正常播放测试音(windows界面上显示正常)
//usb_desc.c
// 0xF0,0x55,0x00, /* tSamFreq 22000 = 0x0055F0 */
0x80,0xBB,0x00, /* tSamFreq 48000 = 0x00BB80 */
* 修改采样位宽((要同时修改bSubFrameSize和bBitResolution))(8位改为16位),重新编译,卸载设备,重新插拔设备,设备的采样参数变为 [16位 48000Hz]
//usb_desc.c
// 0x01, /* bSubFrameSize */
0x02, /* bSubFrameSize */
// 8, /* bBitResolution */
16, /* bBitResolution */
===== 评估板硬件资源修改 =====
----
- 资源定义的修改
// stm3210e_eval.h
typedef enum
{
LED0 = 0,
LED1 = 1
} Led_TypeDef;
typedef enum
{
KEY0 = 0,
KEY1 = 1
} Button_TypeDef;
...
#define LEDn 2
#define LED0_PIN GPIO_Pin_8
#define LED0_GPIO_PORT GPIOA
#define LED0_GPIO_CLK RCC_APB2Periph_GPIOA
#define LED1_PIN GPIO_Pin_2
#define LED1_GPIO_PORT GPIOD
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOD
...
#define BUTTONn 2
#define KEY0_PIN GPIO_Pin_1
#define KEY0_GPIO_PORT GPIOC
#define KEY0_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY1_PIN GPIO_Pin_13
#define KEY1_GPIO_PORT GPIOC
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOC
// stm3210e_eval.c
GPIO_TypeDef* LED_PORT[LEDn] = {LED0_GPIO_PORT, LED1_GPIO_PORT};
const uint16_t LED_PIN[LEDn] = {LED0_PIN, LED1_PIN};
const uint32_t LED_CLK[LEDn] = {LED0_GPIO_CLK, LED1_GPIO_CLK};
GPIO_TypeDef* KEY_PORT[BUTTONn] = {KEY0_GPIO_PORT, KEY1_GPIO_PORT};
const uint16_t KEY_PIN[BUTTONn] = {KEY0_PIN, KEY1_PIN};
const uint32_t KEY_CLK[BUTTONn] = {KEY0_GPIO_CLK, KEY1_GPIO_CLK};
...