天南地北客
发表于: 2017-1-10 14:05:05 | 显示全部楼层

现代音频设备中有很多知识产权。 我想研究创建一个与手机交互的算法设备(运行non-trivial算法的嵌入式设备)。 我发现创建一个Lightning设备比创建一个连接到Android手机的的USB设备要复杂的多,所以本文将采用USB设备的方式。


像ST这样的大型微控制器厂商都有带USB功能的产品线,并且提供一些例子和库来降低学习USB的难度。 自加入Jawbone以来,我一直在学习STM32微控制器,所以我会坚持使用STM32产品的ARM Cortex M4线。 我相信所有新的算法项目应该从一个具有浮点能力的平台开始。我特别喜欢STM32L4,因为它还是一个低功耗的微控制器。 我下载了L4产品线的STM32Cube FW示例和SDK,并且找到了一些STM32L476G评估板的USB设备应用程序FW示例 - 如HID_Standalone项目。


我已经有一个NUCLEO-L476RG开发板,控制器采用STM32L476RG,支持USB FS(全速:12 Mbps)。 我将要把这个开发板变成一个USB立体声输入和输出音频设备。 USB FS带宽限制将采样率限制为48 kHz(作为比较,CD采样率为44.1 kHz,高质量音频采样率为96 kHz或192 kHz)。 USB FS带宽远远大于低功率无线射频带宽(例如,对于BLE为〜1Mbps,对于NFMI为596Kbps)。


如何将NUCLEO-L476开发板变成USB设备

和昂贵的STM32L476G-EVAL评估板不同的是,NUCLEO开发板没有USB插座,以及分布在STM32L476G-EVAL板的DP / DM线上的漂亮的EMI / ESD滤波器。 不过至少所有的USB功能都被引出了,如下图所示。

NUCLEO-L476RG pin overview.PNG

●    D +和D-位于PA12和PA11。

●    在设备模式下,VBUS(PA9)可以连接到Vbus(5V)以检测Vbus(和片上电压比较器一起)或者连接到电池充电检测器。 这对于使用USB充电的电池供电的设备可能是有用的,但是我只是尝试制作一个完全由手机USB供电的USB设备。 当收发器处于活动状态时,PA9将被置为无效,因此可能能够驱动USB活动的某些指示。

●    微控制器可以在帧的开始处拉低SOF引脚(PA8) - 用于与外部芯片同步(在高性能应用中,如音频)。

●    U5V引脚是5V USB总线电压,当它连接到USB主机时为整个开发板提供电源,如在STM32L476G-eval板的原理图中所示,显示了USB总线VCC直接连接到U5V引脚。

    UV5.PNG

USB收发器由单独的VDDUSB引脚(以下也称为VUSB)供电。 根据STM32L476数据手册:

VDDUSB = 3.0-3.6 V:USB收发器的外部独立电源。 VDDUSB电压电平与VDD电压无关。 复位后,VDDUSB提供的USB功能在逻辑和电气上隔离,因此不可用。 在使用USB OTG外设之前,一旦VDDUSB电源存在,必须通过设置PWR_CR2寄存器中的USV位以去除隔离。

重复一遍,VDDUSB是微控制器的专用引脚,大概为3.3V(不是直接连接USB端口的5V VBUS!)。 在Nucleo64开发板(LQFN64封装的NUCLEO开发板)上,VDDUSB通过焊接桥SB31与VDD短路,如下所示:

SB31.png

因此,如果我有一个电池供电的USB设备,我可以切断SB31并将VDDUSB连接到自己的USB接头。

但是如果想从USB为设备供电,我必须从VBUS产生VDD,就如在STM32L4参考手册USB on-the-go全速(OTG_FS)章的Synopsys推荐的一样。

Synopsis .PNG

现在,我将从开发电脑的USB总线通过板上的5 V至3V3 LDO向L476RG开发板供电,如下所示:

L476.PNG

跳转到指定楼层
天南地北客
发表于: 2017-1-10 15:03:16 | 显示全部楼层

STM32CubeMX生成USB音频示例

ST的CubeMX是一个用于ST微控制器的图形化代码生成器。 在软件里面,我分配了引脚功能,并且自动配置了所需功能集的时钟。

stm32Cubemx.PNG

除了低级代码(HAL、CMSIS)外,STM32CubeMX还可以(因为我为引脚PA11 / 12选择了USB功能)为几个USB类设备生成桩代码,您可以在CubMX的 配置选项卡视图的下拉列表中看到,如下所示:

usb class.PNG

我选择了音频设备类,并像这样配置项目设置:

project setting.PNG

为了了解生成了哪些文件,我在“Code Generator”选项卡中选择了“Copy only the necessary library files”、生成代码(menu --> Project --> Generate Code)以及生成代码的报告(在生成代码选项的正下方)。 CubeMX在与CubeMX项目相同的文件夹中输出文件,如下所示。

output files.PNG


在审查报告时,我注意到一些明显的错误:

●     UART2

    ●     字长应为8,但目前设置为7。

    ●     波特率在CubeMX中不可选,如您所见:

usart2.PNG

●     USB

    ●     端点0最大数据包大小:64 B,但CubeMX没有提供此选项,您可以在这里看到。

usb otg fs.PNG

    ●     VBUS感测:我已经禁用了(见上文),但报告说“启用”

    ●     “Enable internal IP DMA”已关闭,但CubeMX未提供此选项

    ●     低功耗、链路层电源管理:禁用

●     USB音频设备类中间件

    ●     USBD_LPM_ENABLED:true,与设备的上述选择冲突

    ●     USBD_AUDIO_FREQ:22100,我需要它至少为44100 Hz!

    ●     VID为1155

    ●     PID为22336

    ●     PRODUCT_STRING为STM32_Audio_Class

    ●     CONFIGURATION_STRING:AUDIO配置

    ●     INTERFACE_STRING:AUDIO接口

●     NVIC

    ●     用于USART2的中断被禁用

    ●     USB OTG FS全局中断的优先级与系统相同,因为我在Configuration --> NVIC中未分配优先级,如下所示:

nvic.PNG

回复

使用道具 举报

天南地北客
发表于: 2017-1-11 10:31:08 | 显示全部楼层

将生成的源代码导入GNU ARM Eclipse插件

该示例使用ST HAL库,这可能比我通常想要的能提供更多的帮助,但我现在只需要按照原来的样子。 这个例子有几个项目风格:IAR EWARM、Keil uVision、Atollic TrueStudio和SW4STM3。 我有一个uVision的免费版本,工程生成的很干净; 此外,由于.text + .data只有大约20 KB(<32 KB),我可以使用它进行调试! 唯一的问题是uVision的代码浏览功能很不友好(与Eclipse CDT相比)。 我比较喜欢Eclipse CDT和GNU工具链,所以我决定在另一个文件夹中创建一个新的gnuarm Eclipse C项目,只导入生成的文件。 GNU ARM Eclipse插件不支持STM32L4,因此选择Cortex-M项目模板,如下图所示:

cortex-m project.PNG


在下一个窗口中,C项目生成器向导将询问芯片/项目的具体设置,如下所示:

setting.PNG


ROM和RAM大小被固定在芯片里,但系统时钟频率可以进行配置(甚至可以在CubeMX中以图形的方式),如下所示:

clock.PNG


在项目文件夹对话框中,我选择默认值,包括“newlib”C运行库。 CMSIS名称应该与所选芯片系列匹配,如下所示:

project.PNG


在最后的窗口中,Eclipse CDT检测之前安装的GNU arm工具链(arm-none-eabi-gcc):

toolchain.PNG


然后GNU ARM Eclipse插件在选择的默认文件夹中生成代码,但是这些文件(下面突出显示)与CubeMX生成的源文件冲突,必须删除。

folder.PNG


ldscripts / mem.ld的片内闪存地址的开始地址也有错误,所以我将其修改为正确的值(所有STM32Lxxx产品线都一样),如下所示:

  1. MEMORY
  2. {
  3.   FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
  4.   RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K
  5. }
复制代码

到目前为止,Eclipse项目缺少针对在CubeMX中选择的引脚的文件。 要在我的Eclipse项目上覆盖CubeMX生成的项目,从<CubeMX gen>/ Inc/文件夹复制头文件到include /文件夹。 当在Eclipse项目浏览器中拖放时,显示一个链接文件的选项,而不是复制,你可以在这里看到:

file operation.PNG

由于我可能会修改文件,我选择“Copy”,但如果我稍后更改开发板的配置,“Link”是一个很不错的选择。 总的来说,以下是从<CubeMX gen>复制到Eclipse项目文件夹的文件:

●    Inc/* --> include/

●    Src/* --> src/

●    Drivers/STM32L4xx_HAL_Driver/Inc/* --> system/include/stm32l4xx/

●    Drivers/STM32L4xx_HAL_Driver/Src/* --> system/src/stm32l4xx/

●    Drivers/CMSIS/Device/ST/STM32L4xx/Include/* --> system/include/cmsis/。 即使其中有相同命名的文件,我选择使用ST已经测试的CMSIS文件。

●    Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c --> system/src/cmsis/

●    Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/gcc/startup_stm32l4xx.s --> system/src/cmsis/startup_stm32l4xx.S.  更改扩展名是必需的,因为Eclipse CDT支持的汇编文件扩展名为“.S”。

●    Middlewares/ST/STM32_USB_Device_Library/Core/Inc/* --> include

●    Middlewares/ST/STM32_USB_Device_Library/Core/Src/* --> src

●    Middlewares/ST/STM32_USB_Device_Library/Class/AUDIO/Inc/* --> include

●    Middlewares/ST/STM32_USB_Device_Library/Class/AUDIO/Src/* --> src


USB中间件文件是必需的,因为我想使用ST的USB中间件。 最初,我试图将文件夹Middlewares / ST / STM32_USB_Device_Library /复制到项目的根目录,但是GNU ARM Eclipse“Hello world”模板不会为我复制的STM32_USB_Device_Library文件夹生成构建规则。 最后我使用的是Makefile文件,通过将源代码单独复制到现有的include /和src /文件夹。

在项目属性 - > C / C ++ Build - > Settings,项目需要定义芯片定义以生成源代码,如下面所示。 在gcc预处理器提供了STM32L476xx(用于Debug和Release配置),但是没有为C ++预处理器提供(因为我在这个项目中不使用C ++)。

preprocessor.PNG

通过这些更改,项目构建完成(但有一些警告)。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 49 | 回复: 80



手机版|

GMT+8, 2024-11-21 17:02 , Processed in 0.043511 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表