时钟配置

作为MCU运行的基础,时钟是单片机各个模块工作时序的最小时间单位,推动单片机的各指令执行,是MCU选型的一个重要指标。CKS32F4xx系列产品具有众多的外设,但并非所有的外设均需要系统时钟的高频率,并且高时钟频率将导致功耗增加、抗电磁干扰能力变弱,因此,CKS32F4xx系列产品内部具备多个时钟源。本文将对CKS32F4xx系列产品时钟组成进行分析,并讲解该系统单片机的时钟的配置方法,以能够让用户更加简单的对系统时钟进行配置。

CKS32F4xx系列产品时钟树

在CKS32F4xx系列产品中,有HSI、HSE、LSI、LSE、PLL五个重要的时钟源,其中PLL分为主PLL和专用PLL两部分。从时钟频率来分可以分为高速时钟源(HIS、HIS、PLL)和低速时钟源(LSI、LSE);从来源可分为外部时钟源(HSE、LSE)和内部时钟源(HIS、LSI、PLL)。

1.jpg

①:LSI是低速内部RC振荡器,频率为32kHz。供独立看门狗和RTC单元使用。
②:LSE是低速外部时钟,接频率为32.768kHz晶振。主要供RTC单元使用。
③:HSE是高速外部时钟晶振输入,频率范围为4MHz~26MHz。。
④:HSI是高速内部RC振荡器,频率为16MHz。可以直接作为系统时钟或者用作PLL输入。
⑤:PLL为锁相环倍频输出,有两个PLL:
    1)主 PLL(PLL)由 HSE 或者 HSI 提供时钟信号,并具有两个不同的输出时钟。
     其一PLLP用于生成高速的系统时钟(最高 168MHz)
    其二PLLQ用于生成 USB_OTG_FS(48MHz)、随机数发生器SDIO时钟。
    2)专用 PLL(PLLI2S)用于生成精确时钟,用于实现I2S高品质音频性能。

CKS32F4xx系列系统时钟配置

在CKS32F4xx系列固件库system_cks32f4xx.c文件中定义了函数SystemInit(void),并在其中调用了SetSysClock()函数来配置系统关键时钟寄存器,其处理流程如下:

先使能外部时钟HSE,等待HSE稳定之后,配置AHB、APB1、APB2时钟相关的分频因子;等待这些都配置完成之后,打开主PLL时钟并设置主PLL作为系统SYSCLK时钟源。如果HSE不能达到就绪状态则依然以HSI作为系统时钟源头。

在设置主PLL时钟时,需要设置一系列的分频系数和倍频参数,代码如下:

RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |                        (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

 PLL_M、PLL_N、PLL_P宏定义均在在System_cks32f4xx.c文件中定义,当采用8MHz外部晶振时,主PLL时钟计算方法如下:

PLL = 8MHz * PLL_N / (PLL_M * PLL_P) = 8MHz * 336 /(8 * 2) = 168MHz

用户可根据实际需求,根据SetSysClock函数内的注释进行实际修改,可用的时钟源配置宏定义位于cks32f4xx.h中,如RCC_CR_HSION、RCC_CR_HSEON等。

CKS32F4xx系列外设时钟配置

在系统初始化之后,在使用部分外设时,我们还需要根据外设需求修改某些时钟源配置。在CKS32F4xx系列固件库中,时钟源的选择以及时钟使能等函数均在RCC相关固件库文件 cks32f4xx_rcc.h 和 cks32f

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

以上5个系统时钟使能函数分别控制AHB1、AHB2、AHB3、APB1、APB2总线。要使能某个外设,调用对应的总线外设时钟使能函数即可。

例如,如果我们要使能GPIOA,那么我们可以在头文件 cks32f4xx_rcc.h 里面查看到宏定义标识符RCC_AHB1Periph_GPIOA挂载在AHB1总线之下,因此我们调用方式入如下:‍

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

 同理,如果我们要使能USART1的时钟,那么我们调用的函数为:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

还有一类时钟使能函数是时钟源使能函数,前面我们已经讲解过CKS32F4xx系列有5类时钟源。这里我们列出来几种重要的时钟源使能函数:

void RCC_HSICmd(FunctionalState NewState);
void RCC_LSICmd(FunctionalState NewState);
void RCC_PLLCmd(FunctionalState NewState);
void RCC_PLLI2SCmd(FunctionalState NewState);
void RCC_PLLSAICmd(FunctionalStateNewState);
void RCC_RTCCLKCmd(FunctionalState NewState);

具体调用方法如下:

RCC_PLLCmd(ENABLE);

 第二类时钟功能函数:时钟源选择和分频因子配置函数用来选择相应的时钟源以及配置相应的时钟分频系数,比如配置HSI、HSE、PLL三个中的一个时钟源为系统时钟。以下为几种时钟源配置函数:

void RCC_LSEConfig(uint8_t RCC_LSE);
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
void RCC_PCLK1Config(uint32_t RCC_HCLK);
void RCC_PCLK2Config(uint32_t RCC_HCLK);
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM,uint32_t PLLN, int32_t PLLP, uint32_t PLLQ);

比如我们要设置系统时钟源为 HSI,则可以调用系统时钟源配置函数:

RCC_HCLKConfig(RCC_SYSCLKSource_HSI);

第三类外设复位函数如下:

void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);void RCC_AHB2PeriphResetCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);void RCC_AHB3PeriphResetCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

这类函数和前面讲解的外设时钟函数使用方法基本一致,不同的是一个是用来使能外设时钟,一个是用来复位对应的外设。对于这些时钟操作函数,我们就不一一列举出来,大家可以打开 RCC 对应的文件仔细了解。有问题欢迎邮件咨询:wangb@cksmcu.com.cn

来源:中科芯MCU

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

围观 43

简介

时钟是芯片正确高效运行的基础,正确的时钟配置是芯片能正确运行的必要条件,其重要性不言而喻。AT32各系列产品的时钟配置部分可能存在细微的差异和需要注意的事项,本文档就着重针对各系列的情况来详细介绍如何结合雅特力提供的V2.x.x的板级支持包(BSP)来配置时钟。

以下介绍时钟配置的方法主要分两种:

1、 以手动编写代码调用BSP中提供的驱动函数接口来进行时钟配置。

2. 采用时钟工具来配置并生成相应的源码文件。

时钟树

在进行时钟配置之前,应充分了解对应芯片的时钟树结构,这样在进行时钟配置时才会游刃有余。对于系统时钟频率及路径的配置我们需要关注时钟源、倍频及系统时钟部分。类似如下图:

图1. 时钟框图

1.png

可由图中得到以下几个关键信息:

1) SCLKSEL:系统时钟可以由HEXT、PLLCLK、HICK三大时钟源提供。

2) HEXT:HEXT是外部高速时钟,其可以外接范围是4~25 MHz的晶振或时钟源。

3) HICK:HICK RC是内部高速振荡器,频率为48 MHz。HICK时钟由内部振荡器给出,但在初始情况下由HICKDIV控制并默认6分频后为8 MHz,亦可配置为不分频,保持48MHz的频率。

4) PLLCLK:PLL时钟=PLL输入时钟/PLL_MS*PLL_NS/PLL_FR。

5) PLL输入时钟:PLL的输入时钟由PLLRCS决定,有两个来源:HICK 8 MHz和HEXT。

代码配置解析

以下将以库函数接口为核心来对时钟配置流程和方法进行说明。

函数接口

各系列产品对应提供的BSP中对硬件的时钟设置部分已封装好接口函数以供调用,以下罗列出时钟配置常用的函数接口,各函数的具体参数及返回值类型等请参考at32f435_437_crm.c/.h文件。

2.png

时钟配置流程

按常规应用来讲解时钟配置流程,其内容可大致分为如下步骤:

图2. 时钟配置流程图

3.png

Flash时钟分频(Set Flash Clock Division)

Flash时钟分频系数与系统时钟频率相对应,系统时钟频率与Flash分频系数对应关系如下:

4.png

代码实现如下:

5.png

复位(CRM Reset)

首先按规范流程应复位CRM配置参数,其主要是将系统时钟切换到HICK,其余的系统时钟配置寄存器写入默认值,待后续进行新配置参数的写入。函数调用的代码实现如下:

6.png

时钟源配置(Clock Source Configuration)

与系统时钟相关的高速时钟源主要包括HEXT和HICK,PLL也是使用以上时钟源来进行倍频。需要在配置使能PLL前将所使用的PLL参考时钟源开启并等待其稳定。

  • HEXT

外部高速时钟如采用外接有源时钟的方式时,可开启旁路模式来进行使用,采用晶振时,不能开启旁路模式,旁路模式应在外部高速时钟源使能前进行设定,其默认情况为关闭。旁路模式使能代码实现如下:

7.png使能HEXT时钟源并等待HEXT时钟稳定,代码实现如下:

8.png

  • HICK

内部高速时钟是由芯片内部振荡器提供,使能HICK时钟源并等待HICK时钟稳定,代码实现如下:

9.pngPLL配置(PLL Configuration)

PLL配置主要包括:PLL时钟源、PLL倍频系数、PLL倍频频率范围等的设置。倍频时钟公式为:PLLCLK=(PLL输入时钟*PLL_NS)/(PLL_MS*PLL_FR)。

  • PLL时钟源

PLL时钟源细分有如下来源:1、HICK(8 MHz),2、HEXT。PLL时钟源应在PLL配置使能前开启并等待稳定。以上PLL时钟源在crm_pll_config函数中对应的参数定义如下:

10.png


  • PLL倍频系数

PLL_MS:PLL预分频系数,范围值1~15。其功能是对PLL输入时钟进行预分频。

PLL_NS:PLL倍频参数,范围值31~500。其功能是对PLL_MS进行预分频处理后的时钟进行倍频。PLL_FR:PLL后分频系数,范围(1、2、4、8、16、32)。其功能是对PLL_NS倍频后的时钟进行后除频,除频后的时钟才是PLL时钟。以上参数在搭配使用时有如下限制条件,详情可参考RM的4.1.1时钟源章节:

11.png

当PLL参数设置完成后,即可开启PLL并等待PLL稳定。示例:外部时钟晶振8 MHz,采用HEXT时钟作为PLL时钟源,PLLCLK倍频到288 MHz的代码实现如下:

12.png

总线分频(Set Bus Frequency Division)

总线分频包含SCLK到AHBCLK分频、AHBCLK到APB1CLK分频、AHBCLK到APB2CLK分频。AHB总线1分频、APB1/APB2总线2分频的代码实现如下:

13.png

切换系统时钟(Switch System Clock)

系统时钟来源主要有三个:HICK、HEXT、PLLCLK。在切换系统时钟到如上时钟源时应提前确保对应时钟源已稳定。

  • 顺滑模式

时钟顺滑模式是为了确保整个系统时钟切换过程的稳定而设计,当即将切换为系统时钟的目标时钟频率大于108 MHz时应开启时钟顺滑模式,所以其主要应用对象为PLLCLK用作系统时钟时的场景。通常使用方法是在系统时钟切换前开始,切换成功后关闭。代码实现如下:

14.png

  • HICK系统时钟

内部高速时钟在系统复位重新运行时默认作为系统时钟,后期代码进行设定时,可有两种频率值来进行设定(8 MHz和48 MHz)。如图1所述HICK默认情况下用的是8 MHz,可配置为48 MHz。HICK 8 MHz用作系统时钟的代码实现如下:

15.pngHICK 48 MHz用作系统时钟的代码实现如下:

16.png

  • HEXT系统时钟

外部高速时钟用作系统时钟时,其系统时钟频率以实际使用的外部时钟频率为准,范围为4~25 MHz。HEXT用作系统时钟的代码实现如下:

17.png

  • PLLCLK系统时钟

PLLCLK用作系统时钟时,其系统时钟频率以实际的PLL倍频结果为准。其最高频率应满足芯片规格为基础。PLLCLK用作系统时钟的代码实现如下:

18.png

  • 更新核心频率(Update Core Frequency)

提供的BSP中,其代码框架内保留了一个表示系统核心频率的参数值system_core_clock,其保存的是CPU核心的运行频率值,应该在每次系统时钟配置完成后来进行更新。为的是在整个代码框架下,各外设驱动的频率配置能很快获取到当前核心运行频率值并使用。代码实现如下:

19.png

时钟配置示例

以下将以完整的时钟配置流程来进行说明,示例:由8 MHz外部时钟晶振作为时钟源,经PLL倍频到288 MHz并用做系统时钟,AHB不分频,APB1/APB2采用2分频。函数system_clock_config代码实现如下:

20.png

时钟工具

时钟配置工具是雅特力科技为方便对AT32系列MCU进行时钟配置而开发的一个图形化配置工具,其主旨是使用户清晰了解时钟路径和配置出期望的时钟频率并生成源码文件。

环境要求

软件要求需要Windows7及以上操作系统支持。

安装

软件安装本软件不需要安装,只需直接运行可执行程序AT32_New_Clock_Configuration.exe。

功能介绍

本章节将介绍此工具的基本操作,其主要的启动界面和配置界面如下所示

图3. 启动界面

21.png

图4. 配置界面

22.png

菜单栏

菜单栏内容如图所示:

图5. 菜单栏

23.png

  • “项目”(Project)菜单:

新建:新建时钟配置项目

打开:打开已存在的配置项目

保存:保存已打开的配置项目

  • “语言”(Language)菜单:

English:选择English作为显示语言

简体中文:选择简体中文作为显示语言

  • “生成代码”(General code)菜单:

当在对应型号的操作配置界面将所期望的时钟路径和时钟频率配置完成之后,可点击“生成代码”菜单来选择源码文件的存储路径并生成相应的源码文件。

  • “帮助”(Help)菜单:

新版本下载:联网进行新版本下载

版本:查看当前版本

新建配置项目

双击打开时钟配置工具,可看到图示的启动界面,可点击“项目”菜单-->“新建”,进行配置项目的新建,在新建配置项目的过程中需要对芯片的系列所属进行选择,操作方法如下图所示

图6. MCU选择界面

24.png

MCU系列的选择,可点击下拉框来进行选择,当选择好MCU后点击“确定”可进入到时钟配置界面。

配置界面的使用

配置界面主要用来进行时钟路径及参数的配置并对部分外设当前运行的时钟频率进行显示,以下的介绍将以AT32F435系列作为示例来展开进行,其余系列的配置方法与此类似。整个配置界面主要可以分为四个大块,如下图所示

图7. 配置界面框架

25.png


1、标题部分:用于展示当前配置项目所选择的MCU系列。

2、配置部分:用于对时钟路径和时钟参数进行选择和配置,以达到期望的应用需求。

3、输出部分:用于时钟输出(CLKOUT)的配置。

4、在SCLK栏也可在选中PLL为系统时钟时作为输入框,可输入期望的系统时钟频率来反向自动配置出倍频参数。

5、结果部分:用于显示当前外设所使用的时钟频率及总线上的外设。

接下来就着重介绍一下配置部分的使用。配置部分的流程界面是对应着 MCU 时钟树来进行的,各系列MCU的此部分可能存在着差异,但使用方式大同小异。时钟路径的配置可按流程对各开关进行点选来进行选择,配置部分如下图所示,将逐个流程点的功能及其注意事项进行介绍。

图8. 时钟配置框

26.png1. ertc使能:ertc时钟代码配置的使能下拉框。

2.ertcsel:点选框,ertc时钟源选择。当ertc使能开启后,此点选框可配置。

3. ertcdiv:下拉框,当ertc选择hext外部高速时钟作为时钟来源时,此下拉框选择分频系数。

4. lext bypass:外部低速时钟的旁路使能。

5. hext:此为输入框,8 MHz为所采用外部时钟源的默认频率,用户可根据实际使用的外部时钟源频率进行修改。(注:此8 MHz被修改为其他频率值时,对应的BSP中demo目录下的inc/at32f435_437_conf.h文件内的HEXT_VALUE宏定义也应该一致修改,也可以采用工具生成的at32f435_437_conf.h文件来进行使用)。

6. hext bypass:高速外部时钟的旁路使能。

7. pllrcs:点选框,可配置PLL时钟源为HEXT或HICK。

8. pll_ms:输入框,PLL预分频系数,范围值1~15。其功能是对PLL输入时钟进行预分频。

9. pll_ns:输入框,PLL 倍频参数,范围值31~500。其功能是对PLL_MS进行预分频处理后的时钟进行倍频。

10. pll_fr:下拉框,PLL后分频系数,范围(1、2、4、8、16、32)。其功能是对PLL_NS倍频后的时钟进行后除频,除频后的时钟才是PLL时钟。

11. sclk select:点选框,可配置HEXT、PLL或HICK作为系统时钟。

12. sclk频率:当采用正向配置时,此作为系统时钟频率的配置结果显示,当将其用作输入框时,输入期望的频率后点击回车键,会根据此输入值反向计算一组合适的或最接近期望值的PLL配置参数。

13. hick to sclk:点选框,当sclk select选择HICK作为系统时钟时,可配置HICK的8 MHz或48 MHz到系统时钟(注:当选择48 MHz HICK到系统时钟后,CLKOUT输出HICK时的频率也为48 MHz)。14. usbdiv:下拉框。当PLL时钟被选作为USB的时钟来源时,此处配置PLL时钟到USB时钟的分频系数。

15. hick to usb:点选框,可配置USB时钟由PLL时钟或HICK 48 MHz提供,USB时钟配置代码由下拉框to usb来进行选择控制。因USB时钟需要的是固定48 MHz,所以在usbdiv可分频参数为前提下,PLL倍频出来的频率可能不满足USB 48 MHz的时钟需求。

16. USB使能:USB时钟代码配置的使能下拉框。

17. USB时钟频率的显示。此显示栏会实时计算USB时钟的频率并显示,如果配置出来的USB时钟不等于48 MHz时,显示出来的USB时钟频率会标注为红色,而实际应用中没有用到USB时选择disable则不会显示。(注:此部分只针对USB时钟频率的配置,USB外设时钟使能需自行额外打开)。

生成代码

当时钟配置完成后,可点击生成代码,然后选择代码生成的路径并确认,最后会在所选目录下生成两个文件夹inc和src,源文件存放在src文件夹下,头文件存放在inc文件夹下。这些文件可结合到BSP_V2.x.x内的工程来进行使用。可以采用新生成的时钟代码文件(at32f4xx_clock.c/at32f4xx_clock.h/at32f4xx_conf.h)将原BSP demo中的对应文件替换,在main函数中进行system_clock_config函数调用即可。

注意事项

外部时钟源(HEXT)修改

因本文档所示例的demo和配置工具都默认采用的8 MHz外部时钟频率,当实际硬件使用的外部时钟源是非8 MHz频率时需注意以下几点。

  • 代码修改

1、 以实际的外部时钟频率按文中时钟配置流程章节所描述的时钟配置流程及方法来编写相应的代码,配置出期望的时钟配置及时钟路径。

2、 修改对应demo工程中at32f4xx_conf.h文件的HEXT_VALUE值,以实际使用的外部时钟源频率值来进行修改。如实际外部高速时钟使用12.288 MHz的晶振或时钟源时,at32f4xx_conf.h文件应修改如下:

27.png

  • 工具修改

1、在时钟配置工具中的 HEXT 输入框内填入外部时钟源实际频率值并按“Enter”键确认。

2、配置好所需的时钟路径及时钟频率,生成代码。采用新生成的时钟代码文件(at32f4xx_clock.c/at32f4xx_clock.h/at32f4xx_conf.h)将原BSP demo中的对应文件替换或取其中函数内容进行替换,在main函数中进行system_clock_config函数调用即可。

工具使用

在使用本时钟配置工具时需注意:1. 此工具生成的时钟配置源码文件需结合雅特力科技提供的BSP_V2.x.x进行使用。2. 不同系列所生成的时钟配置源码文件不能型号混用,只能在相对应的工程项目中进行调用。3. 配置工具中各输入框参数修改后,请以“Enter”键结束。

案例 系统时钟切换

功能简介

在系统运行过程中来进行系统时钟切换。

资源准备

1) 硬件环境对应产品型号的AT-START BOARD2) 软件环境project\at_start_f435\examples\crm\sysclk_switch

软件设计

1) 配置流程

  • 初始化按键。

  • 配置clkout时钟输出pll 4分频。

  • 编写从hick经pll倍频64 MHz到系统时钟的配置代码。

  • 编写从hext 2分频经pll倍频96 MHz到系统时钟的配置代码。

2) 代码介绍

main函数代码描述

28.png

hick经pll倍频64 MHz到系统时钟的代码描述

29.png

hext经pll倍频96 MHz到系统时钟的代码描述

30.png

实验效果

上电运行led2以间隔100ms时间进行闪烁,clkout(PA8)输出60 MHz。每次USER按键按下,系统时钟在64 MHz与96 MHz之间进行交替切换,clkout输出对应的4分频频率,led4 toggle一次。

案例 时钟失效检测

功能简介

在当HEXT时钟直接或间接作为系统时钟时,当HEXT时钟出现故障,且时钟失效模块侦测到失效后,时钟失效事件将产生NMI中断,在此中断中可完成系统的营救操作。

资源准备

1) 硬件环境对应产品型号的 AT-START BOARD2) 软件环境project\at_start_f435\examples\crm\clock_failure_detection

软件设计

1) 配置流程

  • 配置clkout1时钟输出pll 4分频。

  • 开启时钟失效检测,并完善void NMI_Handler(void)函数。

  • 编写从hick经pll倍频288 MHz到系统时钟的配置代码。

2) 代码介绍

main函数代码描述

31.png

hick经pll倍频288 MHz到系统时钟的代码描述

32.png

NMI中断实现

33.png

实验效果

在运行过程中将晶振拔掉或晶振脚接地,产生时钟失效。通常来说hext比hick更稳定,可观测clkout(PA8)的输出,可发现时钟拯救回来后hick作为源时的频率上存在细微波动。

案例PLL参数计算

功能简介

在进行系统时钟配置过程时,可调用库函数根据PLL输入时钟源和目标时钟频率自动计算一组合理的PLL参数以供配置,减少人为计算的烦恼。

资源准备

1) 硬件环境对应产品型号的AT-START BOARD2) 软件环境project\at_start_f435\examples\crm\pll_parameter_calculate

软件设计

1) 配置流程

  • crm_pll_parameter_calculate函数自动计算PLL参数方式配置系统时钟。

  • 配置clkout1时钟输出pll 4分频。

  • 判断计算结果,能以目标时钟准确计算一组PLL参数时LED4闪烁,如果不能LED2闪烁。

2) 代码介绍main函数

34.png

代码描述自动以目标时钟计算PLL参数并配置系统时钟的代码描述

35.png

实验效果

系统会自动计算一组以目标时钟为结果的PLL参数并配置,如果计算参数所算结果与目标时钟相等则LED4闪烁,如果所算结果与目标时钟接近则LED2闪烁。

来源:AT32 MCU 雅特力科技

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

围观 160

1.引言

DFSDM 全称为 Digital filter for sigma delta modulators。顾名思义,其作用主要是对外部 Σ∆调制的数字信号进行滤波。STM32L462xx 系列支持最多 4 个外部串行通道,2 个数字滤波器,最大可达到 24bit 的 ADC 分辨率。并且支持 SPI 接口和曼切斯特编码 1-wire接口。

2.问题分析

客户使用 STM32L462xx 的 DFSDM 连接数字麦克风,将麦克风的 PDM 信号转化为 PCM 信号,并采集数据。使用的参数为 16KHz 采样,2M 左右的时钟驱动数字麦克风,能够正常读取麦克风数据。了解到他们所使用的数字麦克风可以使用 768K 时钟驱动,从而达到更低功耗的状态,但是客户无法配置出合适的时钟,即使勉强配置到了768K 附近,通过 DFSDM 采集到的数据也是混乱的,完全无法解析。

了解到基本需求后,我们需要对 DFSDM 的时钟有一定了解。从 RM0394 参考手册中可以找到如下内容:

“DFSDM

DFSDM 可以提供一个时钟用于驱动外部 sigma delta 调制器,并且时钟来源可以是DFSDM 时钟或者 Audio 时钟,其中 Audio 时钟就是 SAI1 的时钟。

在处理和时钟相关的配置问题时,强烈建议使用 CubeMX 的时钟配置界面进行配置。我们先来看下客户用于驱动外部数字麦克风的时钟配置。

“DFSDM

从图中可以看出,DFSDM 的时钟为 36MHz,来自 PCLK2。SAI1 的时钟约为 34.29MHz来自 PLLSAI1P。

“DFSDM

这是关于 DFSDM 输出时钟的代码片段,可以看到使用了 AUDIO 的时钟作为输出,并且使用 17 分频,那么最终驱动数字麦克风的时钟为 34.29/17≈2.02MHz。

再来看看滤波器部分参数的设计:

“DFSDM

其中,使用了 4 阶 SINC 滤波,过采样参数为 128,那么 2.02MHz/128≈16KHz。也就是说这种配置参数下,可以接近 16KHz 的采样率来对音频数据采样。

客户想要将麦克风驱动时钟重新配置为 768K,但只考虑修改 Divider 和 Oversampling 参数是配置不出来的。

3.问题解决

我们可以反过来推,要想获得 16KHz 采样率,768KHz 的时钟,首先需要满足以下公式:768K/ Oversampling = 16K, 那么 Oversampling=48。Oversampling 这个参数是比较好确定的,而 768K 来自于 CLK_SAI1/Divider, 这两个参数目前无法确定,其中 CLK_SAI1 又来自于 PLLSAI1P,它由 PLLSAI1_N, PLLSAI1_P 两个系数决定。也就是说要想获得 768K 的时钟,需要把这些参数都配置为合适的值。到这一步,实际上没有直接的公式可以求下去了,只能自己测试并调整,建议可以先将 Divider 定好,然后通过 CLK_SAI1/Divider=768K 就可以求出CLK_SAI1 的值,将这个值手动输入到 Cubemx 的时钟配置界面可以自动求出合适的

PLLSAI1_N, PLLSAI1_P 系数,这样可以大大减少调整时间。如果无法求出合适的值,CubeMX也会进行提示,那么只能重新换 Divider 来测试了。

最终调试下来的值如下图所示:

“DFSDM

我选择的 Divider=50,那么可以算出CLK_SAI1=50*768K=38.4MHz,输入到上图界面中可以得到 PLLSAI1_N=12, PLLSAI1_P=5。

至此,已经可以正确得到 768KHz 的时钟驱动麦克风了,但是目前仍然无法获取到准确的音频数据。

由于前面修改了 Oversampling,该参数会影响采样值。在参考手册中可以找到下表:

“DFSDM

从表中可以看到,之前是 FOSR=128,Sinc4,对应的数值为+/-268435456,但是DFSDM 的数据寄存器只有 24bit,2^23<268435456 的,也就是说需要进行移位,只能以损失精度为代价进行转换。客户代码中有以下配置:

“DFSDM

数据需要右移 5 位保存到数据寄存器,那么现在我们的 FOSR 修改为了 48,对应上表可以看到数值是比较小的,不需要移位处理,所以改为:

“DFSDM

到这里,我们需要修改的内容就全部结束了。将这些修改内容通知客户,让其进行测试,测试结果也比较满意。

小结

DFSDM 在数字音频应用中比较常见,主要用于将数字麦克风的 PDM 信号转换为PCM 信号,如果没有DFSDM 外设,就只能使用软件库进行转化,效率比较低。当然,也可以用于一些模拟信号的采集,需要外部 Sigma Delta 调制器调制好之后再进行滤波,这样得到的 ADC 精度要比通用的 ADC 精度更高,在要求高精度 ADC 的场合,不失为一种较好的方案。

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

围观 173
订阅 RSS - 时钟配置