STM32CubeMX

本文档介绍如何使用STM32CubeMX创建LoRa节点的应用。

详阅请点击下载《STM32WL使用STM32CubeMX创建LoRa节点应用》

相关阅读:
【资料下载】STM32G4市场和特性篇
【资料下载】STM32WL硬件简介
【资料下载】STM32WL软件简介
【资料下载】LoRa与LoRaWAN介绍
【资料下载】STM32WL LoRa例程介绍

来源:意法半导体STM
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 48

【编者按】B-U585I-IOT02A开发板是基于 STM32U585AI 微控制器的功能强大的开发平台,内置 Arm® Cortex®-M33 内核、具备Arm® TrustZone® 安全架构,以及多种智能外设资源。该套件包括 Wi-Fi® 和蓝牙® 模块,麦克风、温度和湿度、磁力计、加速度计和陀螺仪、压力、飞行时间和手势检测等丰富的传感器。B-U585I-IOT02A 套件可基于图形化软件配置工具STM32CubeMX进行配置,简单易用,能够生成包含EWARM、 MDK-ARM、 TrueSTUDIO、 SW4STM32 等初始化代码工程。通过项目管理界面进行初始化配置并生成代码。自动生成的工程就是一个可以正常编译的完整工程,使用的时候只需要添加上用户代码即可。

本文为5篇 B-U585I-IOT02A 开发板网友评测文章的第三篇,与大家分享该板的CubeMX环境搭建。

首先感谢申请到ST的最新最潮的开发板,本次把玩的开发板是B-U585I-IOT02A,这款开发板的特色之处就是低功耗与M33内核,低功耗参数如下:

“基于STM32U5

M33内核是基于M4内核基础上进行的功能拓展,主要具有TrustZone安全优势,针对物联网产品的一颗MCU。而且B-U585I-IOT02A的主频高达160MHz,闪存的2兆字节和SRAM的786千字节的大小,完全可以装下应用代码。

接下来介绍一下B-U585I-IOT02A的硬件部分。

“基于STM32U5

包装还算是中规中矩,使用静电袋防止硬件受损,还是很不错的。

“基于STM32U5

开发板的正面。正面可以看到外设很多,有WiFi,蓝牙,存储也有,而且一般接口都引出了,十分方便,用户到手即用。

“基于STM32U5

开发板背面,有一颗F723,这颗料是ST-LINK V3,速度比V2可好太多,而且价格还不贵,嘿嘿。

“基于STM32U5

B-U585I-IOT02A的蓝牙模块特写,有时间一定要玩玩这部分。

接下来讲讲如何使用CubeMX进行对B-U585I-IOT02A进行硬件配置,CubeMX我之前安装过,但是没用过,知道这个软件很奈斯,可以可视化配置ST的MCU,然后还可以生成代码,但是之前都是使用STM32的标准库习惯了,突然使用HAL还有些不适应。这次就打破这个隔阂,学习一下新东西。

首先说一下,我电脑创建用户的时候,用了中文名字,而且安装CubeMX的时候选择了默认,所以在使用CubeMX的时候出现了一些问题,所以,如果你的电脑用户也是中文名称的时候,建议把CubeMX改一下位置,如下图所示。

“基于STM32U5

首先,选择Updater Settings,然后选择Repository Folder 储存库文件夹,如下图所示,选择一个非中文路径即可。

“基于STM32U5

通过以上操作,就可以解决中文路径下固件包安装不上的问题了。

接下来就可以愉快的使用CubeMX了,CubeMX开发之前需要下载固件包也就是从Manage embedded software packages中进行选择我们要开发的主控芯片型号。

“基于STM32U5

由于本次是开发B-U585I-IOT02A,所以选择STM32U5。(Ps:我之前安装过,所以会是绿色方块,如果没安装过应该是白色方块)

“基于STM32U5

安装完成之后选择新建工程,选择好芯片,就可以进行管脚配置了,如下图所示。

“基于STM32U5

管脚配置要知道外设都接了哪个IO,本次先点个灯,发现开发板的LED是PH6和PH7,设置好这俩IO为输出模式即可,也可以设置其名称,这个名称会在程序中体现出来。时钟方面先默认即可,接下来配置代码输出部分,设置一下工程名字,工程存储路径还有工具链,本次我使用的是MDK开发,所以工具链这块选择MDK-ARM。

“基于STM32U5

都配置好之后,选择generate code,创建代码即可。

“基于STM32U5

创建好的代码,找到其路径,就可以看到有MDK的工程,直接打开。

“基于STM32U5

值得注意的是,自己写的用户代码,需要加载到/* USER CODE BEGIN 3 */这种注释下面,否则当更新CubeMX之后,自己写的应用代码可能被优化没了。

最后,点灯成功,也算是把CubeMX用了起来,奈斯!!!下面是点灯的照片,每500ms闪烁一次。

“基于STM32U5

“基于STM32U5

最后附上工程,有兴趣的可以玩一玩。点击下载:https://doc.weixin.qq.com/txdoc/word?docid=w2_AKcAPgZcANg8qr68HFRSkORsleAfC&scode=AOgA3QdlAAcdlmZjl0AKcAPgZcANg&type=0

来源:STM32论坛网友yangjiaxu 版权归原作者所有
直接转载来源:STM32
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 146

针对STM8同样也有一款工具STM8CubeMX,看到一个技术交流群问了这一个问题:STM8CubeMX 和 STM32CubeMX 功能一样吗?

前几年没有出现“缺芯”的时候,STM8的出货(需求)量其实很大,在2017年的时候,ST官方针对STM8推出STM8CubeMX。

STM8CubeMX介绍

先看一下STM8CubeMX界面:

“STM8CubeMX和STM32CubeMX功能一样吗?"

STM8CubeMX是在2017年推出来,方便STM8开发者使用的一套图形化工具,看到以上STM8CubeMX界面,相信关注我的朋友中,学习STM32的朋友都非常熟悉。

简单来说:STM8CubeMX是一个图形工具,它可以非常容易地配置STM8微控制器并生成相应的配置报告,方便软件、硬件工程师查阅配置信息。

比如:简单的配置STM8S103

“STM8CubeMX和STM32CubeMX功能一样吗?"

生成一份相应的报告,比如:引脚配置报告:

“STM8CubeMX和STM32CubeMX功能一样吗?"

还有芯片信息,时钟树配置、功耗计算等,如果你还在使用STM8,又没了解过,不妨下载来体验一番。

更多关于STM8CubeMX的描述,请参考官网:
https://www.st.com/en/development-tools/stm8cubemx.html

STM8CubeMX 和 STM32CubeMX异同

STM8CubeMX 相比 STM32CubeMX 功能要弱很多,可以理解为STM8CubeMX 是 STM32CubeMX 的简化版。

相同点:

  • 支持MCU选型

  • 引脚、时钟树等配置

不同点:

  • STM8CubeMX不支持代码自动生成

STM8因为资源,特别是Flash和RAM相对不多,所以很难支持类似STM32中的HAL库(代码量相对较大),因而不支持代码自动生成。

那你肯定会问:STM8CubeMX的功能是什么?

主要功能是:图形化引脚配置,方便开发人员知道引脚配置信息,以及软件和硬件对接。

“STM8CubeMX和STM32CubeMX功能一样吗?"

你如果开发过相对大一点的项目,特别是使用引脚比较多的时候,很容易搞混引脚是否被使用、引脚功能是否被重定义等。

有了这个图形化工具(且能生成引脚报告),就能一目了然引脚资源使用情况。

下载安装

STM8CubeMX 和 STM32CubeMX下载安装方法类似,需要提前JRE环境的支持。

STM8CubeMX地址:
https://www.st.com/en/development-tools/stm8cubemx.html

JRE地址:
https://www.java.com/zh-CN/download/

来源:嵌入式专栏
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 117

一、配置定时器为PWM产生


二、配置时钟树


三、定时器配置


四、配置完生成程序后,主程序里还要进行启动PWM就可以了

  MX_TIM3_Init();
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//启动。置1  CCER的输出使能位bit4
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//CCER的bit0

然后可以改变占空比了。
**特别注意:**占空比不能大于自动重载寄存器ARR的值,不然输出的都是高电平。这个问题整了一天。

五、程序分析


/* TIM3 init function */
static void MX_TIM3_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;
//------------------实际是调用TIM_Base_SetConfig配置定时器,上一篇分析过--
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 71;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 99;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
//---------------------这个是默认的,不管-------------------------------
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
//----------------配置输出比较部分-- 上图5部分-------------------------------
  sConfigOC.OCMode = TIM_OCMODE_PWM1;//输出模式PWM1
  sConfigOC.Pulse = 80;//占空比
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;//高电平极性
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
//----------------------------------------------------------------------------------
  sConfigOC.Pulse = 50;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
  HAL_TIM_MspPostInit(&htim3);//初始化引脚IO
}

初始化PWM通道HAL_TIM_PWM_ConfigChannel------>调用

case TIM_CHANNEL_1:
{
  assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
  /* Configure the Channel 1 in PWM mode */
  TIM_OC1_SetConfig(htim->Instance, sConfig);

  /* Set the Preload enable bit for channel1 */
  htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE;//比较模式寄存器CCMR1的bit3位OC1PE置1,写入到CCR1的值在事件更新时,才会传到影子寄存器。清0则写入CCR1的值会马上起作用
  
  /* Configure the Output Fast mode */
  htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE;//配置CCMR1的bit2位,输出比较快速使能
  htim->Instance->CCMR1 |= sConfig->OCFastMode;
}
break;
//--------------------------------------------------------------------------------

 void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config)
   {
  uint32_t tmpccmrx = 0U;
  uint32_t tmpccer = 0U;
  uint32_t tmpcr2 = 0U;

   /* Disable the Channel 1: Reset the CC1E Bit */
  TIMx->CCER &= ~TIM_CCER_CC1E;//关通道 CCER  bit0清0

  /* 读出三个寄存器的值 */
  tmpccer = TIMx->CCER;
  tmpcr2 =  TIMx->CR2;
  tmpccmrx = TIMx->CCMR1;

  /* Reset the Output Compare Mode Bits */
  tmpccmrx &= ~TIM_CCMR1_OC1M;//复位CCMR1的bit6:4
  tmpccmrx &= ~TIM_CCMR1_CC1S;//复制CCMR1的bit1:0
  /* Select the Output Compare Mode */
  tmpccmrx |= OC_Config->OCMode;//配置OC1M为 110  PWM1模式

  /* Reset the Output Polarity level */
  tmpccer &= ~TIM_CCER_CC1P;//配置输出极性 CCER的 CC1P位
  tmpccer |= OC_Config->OCPolarity;

  if(IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1))//如果是定时器1的123通道,还要设置互补输出
  {
    assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));
    /* Reset the Output N Polarity level */
    tmpccer &= ~TIM_CCER_CC1NP;
    /* Set the Output N Polarity */
    tmpccer |= OC_Config->OCNPolarity;
    /* Reset the Output N State */
    tmpccer &= ~TIM_CCER_CC1NE;
  }

  if(IS_TIM_BREAK_INSTANCE(TIMx))//如果是定时器1,还要设置CR2的bit8  bit9 死区控制
  {
    /* Check parameters */
    assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));
    assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));

    /* Reset the Output Compare and Output Compare N IDLE State */
    tmpcr2 &= ~TIM_CR2_OIS1;
    tmpcr2 &= ~TIM_CR2_OIS1N;
    /* Set the Output Idle state */
    tmpcr2 |= OC_Config->OCIdleState;
    /* Set the Output N Idle state */
    tmpcr2 |= OC_Config->OCNIdleState;
  }
  /* 把设置好的值写入这4个寄存器 */
  TIMx->CR2 = tmpcr2;
  TIMx->CCMR1 = tmpccmrx;
  TIMx->CCR1 = OC_Config->Pulse;//占空比
  TIMx->CCER = tmpccer;
}

流程图如下:


需要改变占空比的,直接调用
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutycycle);
改变寄存器CCR1,改变的值是立即生效还是下一个周期生效取决于CCMR1的OC1PE位

 while (1)
  {
		while(dutycycle<100)
		{
			dutycycle+=10;
			__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutycycle);
			HAL_Delay(1);
		}
		while(dutycycle)
		{
			dutycycle-=10;
			__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutycycle);
			HAL_Delay(1);
		}
}

版权声明:本文为CSDN博主 - D.luffy 的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:
https://blog.csdn.net/liangbin414/article/details/88707340

围观 479

使用意法半导体最新版的STM32CubeMX配置工具创建STM32 微控制器(MCU)项目,将会更直观,更高效。STM32CubeMX v.5.0的最新设计的多面板GUI界面在不改变屏幕视图的情况下,能够让用户查看更多参数,完成更多任务,从而让优化MCU配置参数变得更加轻松自如,得心应手。

STM32CubeMX帮助用户从800多款STM32产品中选择最适合的产品,配置基本硬件功能,自动生成MCU初始化代码,开启嵌入式项目开发之旅。

用户可以利用功能强大的器件配置实用工具配置微控制器参数,包括可解决冲突的引脚选择器和时钟树设置的辅助,以及能够在早期准确评估能耗需求和节能机会的功耗计算器,还有用于配置外围设备和中间件堆栈的工具,例如,TCP / IP或USB协议栈,并支持参数约束动态验证。

配置完成后,STM32CubeMX会自动生成初始化代码,支持许多常用开发环境,包括适用于IAR-EWARMKeil MDK-ARMAC6-SystemWorkbench STM32系列或独立的GCC(GNU编译器集合)工具链项目。

STM32CubeMX是既可在主要PC操作系统上运行,也可通过Eclipse插件运行的独立软件。用户可以从 www.st.com/stm32cubemx 页面免费下载,还可以一起下载STM32Cube其它软件,包括专用硬件抽象层(HAL)中间件和代码示例。

围观 379

在16年ST就推出了STM32F769I-DISCO开发板,功能搭配可算得上眼前为之一亮,无论是POE、SPDIF输入输出、MEMS麦克风、音频编解码器、还是TFT电容触摸LCD显示屏,各种器件与STM32F769NI这块芯片恰到好处搭配。这块开发板的厚重底蕴难以形容,搭配恰如其分,相得益彰,完美地与STM32F769NI这可主控芯片融合。

本章介绍STM32CubeMX的相关配置,实现使用STM32CubeMX建立基于STM32F769I-DISCO的工程。

1)选择Graphic Choice:

你会不会使用STM32CubeMX建立STM32F769I-DISCO的工程?

2)选择Graphic Choice对应参数
显示分辨率:800x480;
显示接口:DSI Command;
帧缓冲格式:24bpp-RGB888;
GFX RAM:External SDRAM32-Bit
GFX FLASH: External QuadSPI DDR FCPU/3

3)选择产品系列、产品线、封装
系列:SIM32F7
产品线:STM32F7x9
封装:TFBGA216

4)在MCU List中选择STM32F769NI
选择芯片后,点击上方的"Start Project"开始工程,在等待系统初始化后进入后边的步骤

5)在Pinout\SYS中配置Debug方式:
Debug:配置Serial Wire,分别接PA13、PA14

6)在Pinout\RTC中配置时钟源:激活RTC时钟源

7)在Pinout\RCC中配置HSE、LSE:

你会不会使用STM32CubeMX建立STM32F769I-DISCO的工程?

参考原理图,HSE:配置外部晶振;LSE:配置外部晶振。

8)在Clock Configuration配置系统时钟
时钟树上分别选择HSE、LSE,在HCLK处输入216MHz(最大频率)

你会不会使用STM32CubeMX建立STM32F769I-DISCO的工程?

9)配置LCD-TFT控制器、DSI主机及对应时钟树
LTDC显示模式配置最高的RTB888–DSI模式。根据原理图所示DSIHOST模式选择带TEPin的适配器模式:

你会不会使用STM32CubeMX建立STM32F769I-DISCO的工程?

并设置DSI_RESET所占用的PJ15

你会不会使用STM32CubeMX建立STM32F769I-DISCO的工程?

DSI的时钟树频率:TFT的最大频率值为62.5MHz。

你会不会使用STM32CubeMX建立STM32F769I-DISCO的工程?

LCD=TFT时钟树频率:计算方式 DSI通道速率*通道数/位每像素,
500Mbs*2/24=41.6666,约等于41.7MHz。

10)配置GUI所需的扩展内存(FMC方式,STemWin需要)

你会不会使用STM32CubeMX建立STM32F769I-DISCO的工程?

根据SDRAM选型和原图引脚配置,配置FMC的相关参数为如下:
SDCKE0+SDNE0(SDCKE1+SDNE1被其他功能占用,这里只能选KE0、NE0);
4M = 12bit 地址线;
BA0、BA1 均连接到SDRAM上,共4 *BANKS
32bits 数据位宽寻址;
启用32位访问方式。

你会不会使用STM32CubeMX建立STM32F769I-DISCO的工程?

11)配置GRAPHICS
第三方插件STemWin要用到CRC,先使能CRC;
使能STemWin,并选择显示接口方式LTDC-DSIHOST

12)工程小结及项目预览
完成以上配置后,一个基本图形环境搭建完成,TFBGA216引脚占用图如下,还是有很大的功能扩展空间;

你会不会使用STM32CubeMX建立STM32F769I-DISCO的工程?

功能参数配置,只选用了最基础的LTDC、DSI-Host、FMC、GPIO、NVIC功能,配置界面如下图:

你会不会使用STM32CubeMX建立STM32F769I-DISCO的工程?

经过简单的配置后,几乎不修改代码即可生成STemWin开发环境,以下为Hello World验证图,要到下图的效果还需要在STM32CubeMX上配置一些TFT屏幕控制器、DIS、内存、STemWin等设备相关参数。

你会不会使用STM32CubeMX建立STM32F769I-DISCO的工程?

原文作者是STM32中文社区用户:wolfgang2015

转自:STM32单片机

围观 1209

前言

STM32 提供了丰富的音频应用外设,并得益于灵活高效的内部架构,可以支持广泛的音频应用。本文中,在简单介绍音频采集的背景知识后,从应用需求出发,确定麦克风的选用。然后,描述了 STM32 内部 DFSDM (Digital Filter for SigmaDelta Modulator)在 PDM 麦克风采集中应用。最后逐步介绍如何利用 STM32CubeMX 进行 DFSDM 设计开发,实现 PDM麦克风声音采集。

一 背景知识

声音通过声学传感器获取模拟信号,经过模数转换器,转换成二进制码 0 和 1,这些 0 和 1 便构成了音频数字信号。

PDM 麦克风能够实现上述的模拟信号获取,并输出 PDM 信号。PDM(Pulse Density Modulation)脉冲密度调制,利用脉冲密度表示模拟信号强度。

从 PDM 位流中获取数据,还需要经过如下图环节才能获得模拟信号幅度对应的数字量。

利用 DFSDM 开发 PDM 麦克风应用介绍

二 应用需求及 DFSDM 支持分析

在音频应用开发前,需要根据应用需求,对麦克风个数、支持编码类型、采样率及分辨率等进行确定。下面围绕 DFSDM在这些需求方面的支持情况进行分析。

2.1 麦克风数量

同时运行的最大麦克风数量,对于 DFSDM,由 DFSDM 中滤波器数量决定。简单理解,就是一个滤波器对应一个麦克风。注意这种简单等同并不适用于非同时采样的应用场景。

麦克风的数量不直接对应通道数量,如下图。

利用 DFSDM 开发 PDM 麦克风应用介绍

可映射任一 DFSDM 通道单元至滤波器单元。对于通道 CH(y-1),数据线可来源于 DATIN(y-1)引脚,也可来自于DATIN(y),在通道单元中可以选择获取数据的时刻(上升沿或者下降沿)。这样带来的益处是,可利用内部两个通道单元对同一个数据线上数据进行分离并处理获得采样数据。而这个应用,直接满足了双通道数据在同一条数据线上的数据采集场景。

上述描述的应用场景中,数据处理流向如下图所示:

利用 DFSDM 开发 PDM 麦克风应用介绍

注 1:图中 CLK 线硬件设计上不一定需要连接,DFSDM 可在内部关联,实现利用输出时钟作为时钟输入,具体可通过参考手册了解。

2.2 编码类型

DFSDM 支持 PDM、曼彻斯特编码,支持具有类似编码的麦克风器件,具体可通过参考手册了解。

2.3 采样率

DFSDM 通过时钟源、滤波模式、快速模式选择、过采样配置,实现不同采样率的支持。能够支持常见的8k,16k,22k,44k,48k 的采样率,也能够支持特殊应用场合所需的更高采样率,例如 192k, 384k 等。
更多关于 DFSDM 采样率介绍,以及具体计算公式可通过参考手册了解。

2.4 分辨率

DFSDM 具有 24 位数据寄存器,可通过配置实现不同分辨率的支持,有效数据最高支持到 24 位。同时,新的 HAL 库支持全硬件获取 16 位采样数据,不增加 CPU 负载。

DFSDM 分辨率由过采样率,滤波器类型和右移位器决定,更多内容可通过参考手册了解。

利用 DFSDM 开发 PDM 麦克风应用介绍

在不同处理环节数据分辨率情况如下图所示。

利用 DFSDM 开发 PDM 麦克风应用介绍

积分器最大数据输出范围如下表。例如当 FOSR 为 64,IOSR 为 1,采用 Sinc3滤波,在不考虑后续处理环节时,输出范围为±262144,分辨率能够达到 19 位。并可通过右移位器灵活获得需要的有效数据位数。

利用 DFSDM 开发 PDM 麦克风应用介绍

三 前期准备

出于将重心放在 DFSDM 应用介绍,简化其他环节考虑。本文中实现例在 ST 提供的 NUCLEO-L476RG 和 X-NUCLEOCCA02M1板展开。

考虑到利用 DFSDM 实现 PDM 麦克风采集,首先根据 UM1900 对麦克风板 X-NUCLEO-CCA02M1 进行处理,使其支持基于 DFSDM 采集的两路 PDM 麦克风。需要准备软硬件资源如下表。

利用 DFSDM 开发 PDM 麦克风应用介绍

四 实现过程

4.1 应用实现

利用 X-NUCLEO-CCA02M1 板上已有的两路 PDM 麦克风,可实现最多两路麦克风数据采集。

在本例中,先将应用需求定为两路麦克风采集,采样率为 8KHz,分辨率为 16-bit。后续介绍如何利用 STM32CubeMX生成遵循应用需求的工程,以及在获得工程后,如何启动采样,实现麦克风采集的应用。

4.2 开发流程

利用 DFSDM 开发 PDM 麦克风应用介绍

4.3 STM32CubeMX 配置实现

STM32CubeMX 操作流程如下图所示。

利用 DFSDM 开发 PDM 麦克风应用介绍

a. DFSDM 通道选择

根据 X-NUCLEO- CCA02M1 板原理图,可知在将其处理成支持 DFSDM 采集的两路麦克风时,麦克风总线引脚与STM32L476RG 连接情况如下。

利用 DFSDM 开发 PDM 麦克风应用介绍

在 STM32CubeMX 中,选择 Channel1 中“ PDM/SPI Input from ch2 and internal clock ”和 Channel2 中“ PDM/SPI Inputfrom ch2 and internal clock ”,并选择“CKOUT”,如下图所示,PC2、PB14 自动对应与 DFSDM 的 Clock out 和 Data In功能脚。

利用 DFSDM 开发 PDM 麦克风应用介绍

b. 配置通道

切换至“Configuration” 标签页,点击“Control\DFSDM”打开 DFSDM 配置界面。由于选择了通道 1 和通道 2,这里可以对这两个通道进行配置。配置情况如下图。

利用 DFSDM 开发 PDM 麦克风应用介绍

Type:配置数据读取时刻。SPI with rising edge 在时钟的上升沿读取数据;SPI with falling edge 在时钟下降沿读取数据。

Spi clock:总线时钟源。Internal SPI clock 利用内部时钟,对应为 CKOUT 时钟。
Offset:数据偏移量补偿。

Right Bit Shift : 右移位。右移位的确定,涉及到获取有效数据的位数,如“分辨率”小节中图所示。需要结合滤波器和积分器配置及分辨率需求进行确定。本文中,经过滤波器和积分器处理后输出数据分辨率为 29-bit,所以将右移位设置为 5,从而在 24 位数据寄存器中获得有效的 24-bit 数据。

Analog watchdog parameters : DFSDM 中模拟看门狗参数设置。应用例中没涉及到此功能,参数保持默认。

c. 配置滤波器

切换至“Filter0”/ “Filter1” 标签页,配置情况如下图。

利用 DFSDM 开发 PDM 麦克风应用介绍

Regular channel selection: 数据来源。选择与外部麦克风连接的通道。

Continuous mode: 转换模式。选择连续转换模式。

Trigger to start regular conversion: 启动转换的触发源。

Fast mode: 快速模式。在连续转换数据源来自于同一个通道时可启用,能够提高转换速度。本文应用例满足条件,使能Fast mode。

DMA mode : DMA 模式。如果无法使能,需参考后面“配置 DMA”小节,先完成对 DMA 参数的配置。

Inject channel selection: 注入通道选择。应用例中没涉及到此功能,参数保持默认。

Sinc Order: 滤波类型。

Fosr: 滤波器过采样率。

Iosr: 积分器过采样率。

其中,Sinc order, Fosr 和 Iosr 共同决定了积分器处理后的内部数据分辨率。根据“分辨率”小节,在如上配置时,积分器最大输出分辨率为 29 位。

d. 配置时钟

切换至“Output Clock” 标签页,配置情况如下图。

利用 DFSDM 开发 PDM 麦克风应用介绍

Selection: CKOUT 时钟源选择。

Divider: 时钟预分频因子。CKOUT = Audio clock / divider。

其中,Audio clock 来源于 SAI1 时钟,如下图配置,SAI1 时钟配置为 17.411765MHz。CKOUT 输出时钟频率为1.0242MHz。

在 Fast mode 情况下,采样率 Fs 如下:

利用 DFSDM 开发 PDM 麦克风应用介绍

利用 DFSDM 开发 PDM 麦克风应用介绍

e. 配置 DMA

切换至“DMA Settings” 标签页,配置情况如下图。

利用 DFSDM 开发 PDM 麦克风应用介绍

DMA 配置中,选择 Circular 模式,可实现循环向数据 buffer 中填充采样数据。
Data Width 设置为 Half Word,以便实现只获取数据寄存器的高 16 位数据,实现 16-bit 分辨率数据采集。

f. 生成工程

在 STM32CubeMX\Help 打开帮助文档 UM1718,参考文档,生成 IAR 工程。至此获得与硬件对应,支持两路麦克风,采样率为 8KHz,分辨率为 16-bit 的初始化软件工程。

g. 启动采样

完成上述步骤后,即可调用 HAL 库中提供的函数,启动麦克风数据采集。建议利用 DMA 方式实现麦克风采集,占用 CPU 开销最小。下述为启动采样的实现例程。在例程中通过调用 HAL_DFSDM_FilterRegularMsbStart_DMA 启动采样,这个函数实现了利用 DMA 接收 DFSDM 的数据寄存器的高 16 位数据,并传输到分配的 Buffer 空间中。

注:HAL_DFSDM_FilterRegularMsbStart_DMA()的实现需要在 DMA 配置中将 Data Width 设置为 Half Word。

由于 DMA 采用 Circular 模式,采样数据向 buffer 空间的搬运连续进行,而半传输完成和传输完成中断回调函数被执行时,意味新的数据被填充至 Buffer 空间,用户可以在其中增加处理指令,完成利用 DFSDM 的麦克风数据采集应用的开发。

#define SAMPLE_FREQ 8000
#define BYTE_PER_SAMPLE 2
#define MICROPHEN_NUMBER 2
#define FRAME_NUMBER 2
//16bit sample resolution
#define BUF_LENGTH (SAMPLE_FREQ/1000*MICROPHEN_NUMBER*FRAME_NUMBER)
…
/* Buffer 分配 */
int16_t Buf_Mic0[BUF_LENGTH];
int16_t Buf_Mic1[BUF_LENGTH];
…
main()
{
…
/*启动采样,在初始化完成后调用*/
HAL_DFSDM_FilterRegularMsbStart_DMA(&hdfsdm1_filter0,Buf_Mic0,BUF_LENGTH);
HAL_DFSDM_FilterRegularMsbStart_DMA(&hdfsdm1_filter1,Buf_Mic1,BUF_LENGTH);
…
While (1){}
…
}
…
/* I2S DMA 回调函数 */
void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
{
 //半传输完成,可在此添加对采样数据的处理
}
void HAL_DFSDM_FilterRegConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
{
 //传输完成,可在此添加对采样数据的处理
}

除此之外,还可以调用 HAL_DFSDM_FilterRegularStart_DMA 启动采样,而这种实现获取的整个 32 位的数据寄存器内容,获取数据需要利用软件指令将低 8 位,非采样数据移除。同时这种实现,需要在 DMA 配置中,将 Data Width 配置为 Word。

五 小结

本文虽然尽可能详细的介绍在 PDM 麦克风采集中,DFSDM 作用及实现步骤。但并没有涉及到所有 DFSDM 支持功能的介绍,而是侧重于 DFSDM 在 PDM 麦克风采集中涉及的功能介绍,更多 DFSDM 功能介绍可以通过参考手册了解。另外不同系列 STM32 的 DFSDM 支持情况会略有差异,需以对应型号的参考手册为准。

来源:ST

围观 2155

页面

订阅 RSS - STM32CubeMX