利用STM32的内部SysTICk进行精确计时
发布时间:2018-12-18 17:29

  产生的音频信号驱动蜂鸣器演奏乐曲,实现了音乐播放器的应用设计。该播放器能实现从低音到高音的21个音阶,并能根据乐谱演奏完整的曲目。测试结果表明,PWM的输出信号与各音阶对应的声音频率基本一致,方案切实可行。这一方法也可用于电机控制、电子琴设计等方面,具有较好的实用性。在科研项目开发中,有时会遇到需要播放电话铃声、音乐等情况。简单的做法是购买专用音乐芯片,但该方法的缺点是播放的内容不可变,不能很好地满足项目需求。一般地,可采用89C51等单片机实现音乐播放,其播放内容及歌曲数量都可以随时修改,使用上相对方便。随着STM32系列微处理器的出现,其基于ARM Cortex—M内核的32位闪存微控制器,高达72 MHz的主频,高集成度、实时性、数字信号处理、低功耗、低电压操作等众多特点,使得其应用越来越广泛。本文基于STM32处理器,根据乐曲简谱制作供程序识别的乐谱,并利用内部产生PWM输出信号,驱动蜂鸣器完成自定义乐谱的播放。经测试,播放效果良好。音阶是音乐必不可少的要素,主要由声音的频率决定。通过给蜂鸣器不同频率的音频脉冲,可以产生不同的音阶,而要产生某频率的音频脉冲,最简单的办法是算出该音频的周期,然后将此周期除以2即为半周期的时间。通过程序控制单片机某引脚半周期为“高”、半周期为“低”,不断交替变换,即可产生该频率的矩形波,接到蜂鸣器上就可发出该频率的声音。若想改变音阶,只需要改变半周期时间即可。表1为C调时音符频率对照表,据此可产生不同音阶的音符。“#”表示半音,用于上升或下降半个音,乘以2就提升该声音一个8度音阶,减半则降一个8度。

  若要构成音乐,光有音阶是不够的,还需要节拍,也就是音符持续时间的长短,一般用拍数表示。至于1拍是多少秒,没有严格的规定,只要节拍适宜,声音悦耳即可。假如某首歌曲的节奏是每分钟120拍,那么1拍为0.5 s,1/4拍为0.125 s,以此类推可得到其他节拍对应的时长。这样,利用不同的频率,加上与拍数对应的延时,就构成了乐曲。

  音阶的产生与声音频率有关,为了实现不同音阶,必须能为蜂鸣器提供不同频率的脉冲。为此,选择STM32芯片,利用其自带的定时器,通过PWM产生脉冲信号。STM32中一共有11个定时器,包含2个高级控制定时器、4个普通定时器、2个基本定时器,以及2个看门狗定时器和1个系统滴答定时器SysTiek。其中,TIM1和TIM8是高级定时器,时钟由APB2的输出产生。TIM2~TIM5是普通定时器,TIM6和TIM7是基本定时器,这6个定时器的时钟由APB1的输出产生。

  定时器的一个主要功能就是到指定时间就会产生一个溢出事件,这个时间的设置与定时器时钟有关,在定时器时钟基础上进行预分频,设置计数溢出大小即可。

  要保证定时的准确性,必须先确保系统时钟的设置是我们所预期的。定时器时钟分配如图1所示。通过编程使SYSCLK为72 MHz,APB1预分频后得到PCLK1为36 MHz,再经TIM2~TIM7倍频器得到TIM2~TIM7时钟72 MHz。时钟源多采用HSE(外部时钟源),对于STM32F103,其外部时钟为8 MHz,而STM32F107外部时钟为25 MHz,因此,在使用HSE做时钟源时,这两种器件产生SYSCLK的分频和倍频方式不同,需要使用者引起注意。

  定时器的参数由结构体TimeBaselnitTypeDef定义,主要包括预分频系数、时钟分割、计数器模式、计数溢出大小等。例如,要由TIM3(定时器3)产生一个时长为1 s的定时,首先,应进行系统时钟的设置,得到TIM3CLK=72MHz,然后进行定时器设置。其中,预分频系数为35 999,此时,TIM3时钟为72 MHz/36 000=2 kHz,无时钟分割。设置计数溢出大小为1 999,即每计2 000个数就产生一个更新事件,输出频率为2 kHz/2 000=1 Hz。代码如下:

  脉冲宽度调制(Pulse Width Modulation,PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,简而言之,就是实现对输出信号脉冲宽度的控制,一般用来控制步进电机等。STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中,高级定时器TIM1和TIM8能够产生3对PWM互补输出,而TIM2~TIM5也能同时产生4路的PWM输出。

  STM32给不同的定时器分配了不同的输出引脚,考虑到引脚复用功能,STM32还提出了一个“重映像”的概念,就是通过设置某一些相关的寄存器,使得在其他非原始指定的引脚上也能输出PWM波形,但是这种重映像不是随意的,使用方法可参照参考文献。例如,TIM3的通道2,在没有重映像的时候,指定的引脚是PA7。如果设置部分重映像之后,输出就被映像到PB5上了;如果设置完全重映像的线 占空比的计算

  占空比(Duty Ratio)有如下含义:在一串理想的脉冲周期序列(如方波)中,正脉冲的持续时间与脉冲总周期的比值。

  当TIM_Period为1 999时,若想得到占空比50%,则TIM_Pulse应设置为(1999+1)/2=1000。具体设置如下:

  蜂鸣器电路如图2所示。需要注意的是,有源蜂鸣器是以固定频率工作,加电即可鸣叫,无源蜂鸣器可以用不同频率输入信号来控制发声,因此,需要选择无源蜂鸣器。核心控制器件选择STM32F103VET6,其引脚PB5连接到BEEP。由电路可知,当PB5为高电平时,蜂鸣器可工作,只要控制PB5高低电平输出形成的矩形波的频率就可以控制蜂鸣器演奏音乐。

  音阶的产生依赖于PWM输出信号的频率。为了简化设计,我们令定时器的TIM_Period为1 999,且占空比始终为50%,根据式(1)则TIM_ Pulse为1000。此时,PWM输出信号频率仅与定时器预分频系数TIM_Prescaler有关,只需要调整该系数,即可得到所需信号频率。

  乐谱由音阶和节拍组成,每两个元素为一组,前者表示音阶,后者表示节拍。节拍以1/4拍为基准,存放的数值为1/4拍的倍数。相关代码如下:

  程序流程如图3所示。由于STM32的PWM输出引脚是PB5,所以我们采用TIM3的通道2来产生PWM输出。在GPIO设置程序中,将TIM3的通道2引脚部分重映像到PB5,GPIO模式选择为复用推挽输出。程序循环读取乐谱,根据音阶修改定时器的预分频系数,并重新设置定时器和PWM。同时,利用STM32的内部SysTICk进行精确计时,根据节拍实现ms级延时,并减少内核消耗。图4为示波器测量得到的低音So的PWM输出波形。根据表1,该波形频率应为392Hz,实测为391.549 Hz,可见本方案的PWM输出误差较小。

  STM32既可以搭载μC/OS,也可以作为单片机使用,是一款性价比较高的处理器。本文利用STM32的定时器,产生PWM音频脉冲波形,实现了

  。这种方法可用于电机控制、电子琴以及无线报务中的电子键设计等,具有较高的实用价值。

  本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

  ,进入中断程序后就开始使用MSP,如果还有一个高优先级的中断难么就继续的使用MSP,在程序推出最后一级中断的时候就用用户堆栈恢复寄存器。下面以uCOS-II为例进行说明:首先建立一个堆栈 OS_STK AppTaskStartStk[1024] //32位STM32是向下生长的满栈,初始化堆栈后(在没有使用PSP以前,一直使用的是MSP)。

  在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。它确实在程序的运行上牺牲了效率(但只是在调试阶段

  说的直白点就是以下区别,在选择启动文件的时候有选择性区别!startup_stm32f10x_cl.s互联型的STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s大容量的STM32F101xx,STM32F102xx,STM32F103xxstartup_stm32f10x_hd_vl.s大容量的STM32F100xxstartup_stm32f10x_ld.s小容量的STM32F101xx,STM32F102xx,STM32F103xxstartup_stm32f10x_ld_vl.s小容量

  单片机的定时器的确很强大,参考说明书中就占了一百多页,占参考手册1/4有多了。STM32的定时器分了好几个类别,各个类别针对功能作用都不大相同。分有:一、高级定时器 二、通用定时器 三、基本定时器 四、看门狗定时器 五、SysTick定时器 其中看门狗定时器和SysTick定时器本篇笔记阐述,这里主要记下对平时使用

  我在原创的基础又从另一位博主处引用了一些内容。时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32。 下面是从网上找的一个STM32时钟框图,比《STM32中文参考手册》里面的是中途看起来清晰一些:重要的时钟: PLLCLK,SYSCLK,HCKL,PCLK1,PCLK2 之间的关系要弄清楚; 1、HSI:高速内部时钟信号

  关于STM32的中断,相信大家玩过单片机的朋友就知道,中断是MCU的一大优点,使MUC工作能够分清事情的”轻重缓急“ ,从而达到处理事情井井有条;今天就讲解下STM32-Cortex-M3内核的中断管理机制,其他处理器的也类似;M3中F103系列的有60个可屏蔽的中断和16个内核级别的中断; 大家知道,操作一款MCU 其实实质就是操作的寄存器,而寄存器有机的结合起来就实现了特定的功能;中断系统也不例外,下面来认识一下中断系统中的几个重要的寄存器; 1. ISER[8](Interrupt Set-Enable Registers),就是中断使能寄存器组

  下载、答题赢好礼:使用Mentor的Xpedition Layout高效设计PCB

  Maxim 利用nanoPower创新技术,致力于降低系统的静态功耗 看视频答题赢好礼! 还有免费开发板等你拿

  安森美半导体——FOD83xx/T系列来袭! 答题赢好礼,更可免费申请样片

  SimpleLink CC26x2CC13x2 可支持多重协议的无线微控制器

  基于 TI MSP430 Scan Interface 技术的流量表解决方案

  综合资讯51单片机PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430C2000单片机论坛单片机资源下载单片机习题与教程