====== 在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}; ...