STM32处理器综合应用_第1页
STM32处理器综合应用_第2页
STM32处理器综合应用_第3页
STM32处理器综合应用_第4页
STM32处理器综合应用_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章STM32处理器综合应用9.1RTX_Blinky9.2MP3_Player9.1RTX_Blinky本节将介绍一个综合应用RTX、ADC、GPIO、LCD的实例RTX_Blinky。STM32处理器根据电位器的电压值来控制四相八拍步进电机的旋转速度,这里以四个LED灯闪烁来表示处理器给步进电机的输入,也就是通过电位器来控制四个LED灯循环闪烁的速度,同时电位器的电压值在LCD上显示。作用其一是如何使用实时库RTX来实现多任务的应用程序;其二是如何使用MDK、ULink2和STM32处理器的SW端口来进行实时跟踪分析调试9.1.1硬件电路9.1.2RTX内核RTX内核是一个非常小的RTOS,仅有50多个函数,没有内存管理、文件管理等复杂功能,但可以实现多任务的管理和调度。RTX是用标准C语言编写,由RealView编译器编译成的,可轻松实现任务函数的声明,而不需要复杂的堆栈以及变量帧的配置。利用RTX核编写实时应用程序仅需要在源程序中包含一个连接RTX实时库的头文件“RTX.h”即可。RTX常用函数os_sys_init(void(*task)(void))该函数用于初始化并启动RTX核,在核被初始化后,将运行参数task所指向的任务函数。该函数一定是放在C语言的main()函数中。RTX常用函数OS_TIDos_tsk_create(void(*task)(void),U8priority)该函数创建由参数任务函数指针*task所指定的任务,并将任务添加准备好的队列中,新的任务会被动态分配一个任务识别号(TID)。参数priority用于指定任务的优先级,默认的任务优先权是1。0为闲置的任务保留的,如果指定一个任务的优先权为0,则自动用1代替,值255也保留。RTX常用函数voidos_evt_set(U16event_flags,OS_TIDtask);该函数为参数task指定的任务设置标志,函数仅对参数event_flags中相应位为1的事件设置标志。voidos_tsk_delete_self(void)该函数停止并删除当前任务,程序将继续执行下一个就绪队列中最高优先权的任务。RTX常用函数voidos_dly_wait(U16delay_time)该函数用于暂停调用任务。参数delay_time具体规定停顿的时间长度,它由system_ticks衡量,delay_time可以设置为从1至0xfffe的任何值。RTX常用函数OS_RESULTos_evt_wait_and(U16wait_flags,U16timeout)该函数用于等待在wait_flags中被指定发生的所有事件。函数等待参数wait_flags中相应的位被设定为1的事件,最多可达16个不同的事件。timeout用于设置预约时间,预约时间之后即使没有一个事件发生,函数必须返回。timeout可以为除了0xFFFF之外的值,如果timeout设置为0xFFFF,则表示一个不确定的预约时间。预约时间由系统时间衡量。9.1.3软件程序设计为了使用RTX以多任务的方式驱动LED灯的闪烁,设置5个任务OS_TIDt_phaseA、OS_TIDt_phaseB、OS_TIDt_phaseC、OS_TIDt_phaseD和OS_TIDt_lcd。其中前4个任务的作用是点亮某个LED灯,延迟一段时间,然后通过设置标志触发另一个任务执行,再延迟一段时间之后,熄灭LED灯,等待下一次事件标志的到来;通过这四个任务的循环触发可以实现四个LED灯循环闪烁,其延迟时间由ADC转换值决定。软件程序设计OS_TIDt_lcd用于将ADC转换值显示在LCD上,按固定时间间隔不断更新。除了以上5个任务之外,还有init任务和idle任务,init任务用于创建以上5个任务,该任务在完成之后自行删除;idle任务无需创建,永远存在,当系统无其他任务时执行该任务。源文件简介Blinky.c该源文件用于创建多个任务,并多个任务之间的触发。STM32_Init.c该源文件用于初始化STM32处理器各个外围接口设备。源文件简介Setup.c该文件用于设置ADC和LED相关的端口和时钟。RTX_Config.c该文件用于配置RTX的参数,例如同时运行的最多任务数、任务堆栈等。MDK在\Keil\ARM\RV30\Startup下自带了几款MCU的RTX配置模版文件,编程时可以先加入近似MCU的配置模版文件,然后使用配置向导来修改参数,如下页图所示,无需编程。RTX参数配置向导源文件简介LCD_4BIT.c该文件用于提供评估板上2行16字符的文本LCD驱动。9.1.4实时跟踪分析Cortex-M3处理器内核可以使用SW接口进行实时跟踪(Trace);这里结合RTX_Blinky介绍如何使用MDK、ULink2进行STM32的实时跟踪工具。9.1.4.1配置实时跟踪调试若要使用SW进行实时调试,则需要按以下步骤配置调试器、配置SWD、配置跟踪功能。配置调试器:选择Project->OptionsforTarget–>Debug,在如下页图所示的对话框中选择ULINKCortexDebugger调试器。选择调试器配置实时跟踪调试然后将路径\Keil\ARM\Startup\ST下的STM32DBG.ini文件拷贝到工程文件夹中。选择Project->OptionsforTarget–>Debug,在InitializationFile选项中选择该文件:STM32DBG.ini文件用于配置实时跟踪的选项,可以使用配置向导来修改该文件:STM32DBG.ini中可配置选项(1)DBG_SLEEP(DebugSleepMode):允许在睡眠模式下调试;DBG_STOP(DebugStopMode):允许在停止模式下调试;DBG_STANDBY(DebugStandbyMode):允许在备用模式下调试;TRACE_IOEN(TracePinAssignmentcontrol):允许跟踪引脚分配;TRACE_MODE(TracePinAssignmentControl):设置跟踪引脚分配;STM32DBG.ini中可配置选项(2)DBG_IWDG_STOP(DebugIndependentWatchdogstoppedwhenCoreishalted):当处理器核挂起时候,停止独立看门狗时钟;DBG_WWDG_STOP(DebugWindowWatchdogstoppedwhenCoreishalted):当处理器核挂起时候,停止窗口看门狗时钟;DBG_TIMx_STOP(DebugTimerstoppedwhenCoreishalted):当处理器核挂起时候,停止调试时钟;DBG_CAN_STOP(DebugCANstoppedwhenCoreishalted):CAN接收寄存器被冻结。配置SWD选择OptionsforTarget–>Debug–>Settings,如图所示,设置SWD,端口选择SW。配置Trace功能Trace功能包括:CoreClock、TracePort以及定义TraceEvents等,如图所示。9.1.4.2实时跟踪MDK提供了多种实时跟踪窗口,来从不同角度显示实时跟踪所捕获的记录;包括:状态栏信息、ITM观测器、逻辑分析仪、RTX核事件观测器和实时跟踪窗口。状态栏信息如果配置了实时跟踪,当选择Debug->StartDebugSession菜单开始调试时,μVision3的窗口状态栏将显示当前跟踪状态信息:在状态栏中可能显示如下的Trace信息:Trace:CommunicationError,表示Cortex-M3和μVision之间通信出现错误,原因是CoreClock设置出错或者Trace硬件有问题;Trace:HWBufferOverrun,表示ULink2缓冲超出,ULink2无法给μVision提供足够快的数据通信;在状态栏中可能显示如下的Trace信息续Trace:SWBufferOverrun,发生μVision内部软件缓冲超出;Trace:NoSynchronization,未受到同步包,原因是配置错误或者未连接跟踪硬件;Trace:DataStreamError,检测到跟踪数据流;Trace:DataOverflow,捕获了太多的跟踪数据,跟踪端口太忙导致跟踪包丢失;Trace:Running...,表示目标板和实时跟踪允许正确;TargetandRealtimeTraceisrunningwithoutanyerrors.<none>:表示目标板和实时跟踪停止,之前未发生任何错误。ITM观测器(ITMViewer)ITM是一个应用驱动跟踪源,支持应用事件跟踪和printf类型的调试。它支持如下跟踪信息源:软件跟踪、硬件跟踪和时间戳。要使用ITM观测器,首先需要在源代码中加入如下关于ITM端口寄存器的定义:#defineITM_Port8(n)(*((volatileunsignedchar*)(0xE0000000+4*n)))#defineITM_Port16(n)(*((volatileunsignedshort*)(0xE0000000+4*n)))#defineITM_Port32(n)(*((volatileunsignedlong*)(0xE0000000+4*n)))#defineDEMCR(*((volatileunsignedlong*)(0xE000EDFC)))#defineTRCENA0x01000000然后,在源代码中添加fputc函数,它用于向ITM的激励端口0寄存器写数据:struct__FILE{inthandle;/*Addwhateveryouneedhere*/};FILE__stdout;FILE__stdin;intfputc(intch,FILE*f){if(DEMCR&TRCENA){while(ITM_Port32(0)==0);ITM_Port8(0)=ch;}return(ch);}有了fputc函数之后,就可以用printf函数做为ITM调试输出。ITM的激励端口0与ITMViewer窗口之间的连接是固定关系的:完成以上设置之后,在目标调试期,可以选择View->SerialWindow->ITMViewer打开ITMViewer窗口这时就可以在目标调试期间通过ITMViewer窗口查看到调试跟踪信息:逻辑分析仪(LogicAnalyzer)使用实时调试,可以通过逻辑分析器观测至多4个变量值的变化。在调试期间,可以在逻辑分析仪中添加希望观测的变量:RTX核事件观测器

(RTXKernelEventViewer)当运行使用实时库RTX的应用程序时,可使用RTXKernelEventViewer窗口来观察任务的切换过程。还需要允许TraceEnable,并设置正确的CoreClock:完成上述设置之后,在目标调试过程中选择Peripherals->RTXKernel即可打开RTXKernel窗口:System窗口EventViewer窗口实时跟踪窗口在实时调试时,选择Peripherals–>Trace菜单,来观测和分析所有的跟踪记录:ExceptionTrace窗口EventCounters窗口显示特殊事件计数器的值:Cortex-MTargetDriverSetup窗口中选择对那些特殊事情进行计数:9.2MP3_Player本节将介绍一个利用STM32处理器实现简易MP3Player的设计实例;这个综合应用实例有助于读者了解SPI接口、SD卡、TIMER、USB、FAT文件系统等的应用。两种设计方案第一种方案是简易声波播放器,仅使用STM103V100评估板;令计时器TIM4工作在PWM模式下,将wav格式的声波文件从SD卡中读出;由TIM4产生不同频率的方波通过低通滤波器和放大器送喇叭。简易声波播放器方案第二种方案第二种方案即是简易MP3播放器;还需要使用额外的解码芯片,将MP3格式的文件从SD卡读出,然后送解码芯片解码播放。简易MP3Player方案9.2.1SD卡的结构及读写方法SD卡(SecureDigitalMemoryCard)是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件;SD卡允许在两种模式下工作,即SD模式和SPI模式,本系统采用SPI模式。SD连接器与STM32处理器SPI连接图SD卡内部结构及引脚SD卡主要引脚和功能为:CLK:时钟信号,每个时钟周期传输一个命令或数据位,频率可在0~25MHz之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz的频率;CMD:双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可以来自单卡或所有卡;DAT0~3:数据线,数据可以从卡传向主机也可以从主机传向卡。SD卡的命令SD卡以命令形式来控制SD卡的读写等操作。可根据命令对多块或单块进行读写操作。在SPI模式下其命令由6个字节构成,其中高位在前。读写SD卡的两个函数:读取SD卡函数u8MSD_ReadBlock(u8*pBuffer,u32ReadAddr,u16NumByteToRead);写读取SD卡函数u8MSD_WriteBlock(u8*pBuffer,u32WriteAddr,u16NumByteToWrite)9.2.2FAT16文件系统简介SD卡如果采用FAT16文件格式,按照其不同的特点和作用大致可分为5部分:MBR区、DBR区、FAT区、FDT区和DATA区。由于SD卡一般不做引导盘,一般也不分区,因此通常无MBR区,直接从DBR区开始。DBR区内容为系统引导记录,它包括一个引导程序和一个被称为BPB(BiosParameterBlock)的本分区参数记录表。引导程序的主要任务是当MBR将系统控制权交给它时,判断本分区根目录是否有操作系统引导文件,如果有则将其读入内存,并把控制权交给该文件。BPB参数块记录着本分区的起始扇区、结束扇区、文件存储格式、根目录大小、FAT个数,分配单元大小等重要参数。FAT区该区内容为文件分配表,FAT16文件系统进行空间分配的最基本单位是簇。文件分配表反映了SD卡所有簇的使用情况,通过查文件分配表可以得知任一簇的使用情况。FAT表对于FAT16来说,FAT表每项占用两个字节。FAT表的第一项通常为FFF8H。对于其它项,若其值为0000H表示可用;FFF7H表示为坏簇;FFF8H-FFFFH之间表示该簇为某文件或目录的最后一个簇,FFF0H-FFF6H之间为保留值;其它值则指示下一个簇的簇号。FDT区该区的内容为文件目录表,FAT文件系统的一个重要思想是把目录(文件夹)当作一个特殊的文件来处理,FAT32甚至将根目录当作文件处理。FAT分区中所有目录文件,实际上可以看作是一个存放其它文件(文件夹)入口参数的数据表。因此,目录占用空间的大小并不等同于其下所有数据的大小,但也不等于0,通常是占很小的空间。其具体的存储原理是:不管目录文件所占空间为多少簇,一簇为多少扇区、多少字节;系统都会以32个字节为单位,进行目录文件所占簇的分配。DATA区该数据区存放文件的内容,SD卡所占用的空间绝大部分为此部分。如果文件长度大于一个簇的大小,需要多个簇存放该文件,这些放通过FAT链表串连起来。9.2.3VS1003-MP3/WMA

音频编解码器简介VS1003是由芬兰VLSISolutionOy公司所设计的一款单片MP3/WMA/MIDI音频解码器和ADPCM编码器;它包含一个高性能、自主产权的低功耗DSP处理器核VSDSP4。VS1003内部结构及引脚VS1003芯片与STM32F103x处理器配合VS1003可以作为一个微控制器的从机,通过串行SPI接口来接收输入的比特流,输入的比特流被解码后,可以通过一个数字音量控制器到达一个18位过采样多位DAC。STM32处理器读取SD卡中的MP3文件,将其通过SPI接口送往VS1003芯片播放,然后再利用STM32F10X处理器的一些GPIO口来控制VS1003即可以实现一个MP3Player的原形设计。9.2.4简易声波播放器的设计与实现通过SPI1从SD卡中读取声波文件,将所读取的部分存放在一个缓冲器中,利用TIMER2通道1定期产生的中断,从缓冲器中读取声音数据,然后根据声音数据通过TIMER4的通道3产生不同频率方波输出。这里使用了两个缓冲器,一个用于存放从SD卡读到的声音数据,另一个用于将声音数据输出到PWM,两个缓冲区的功能不断交替,形成一个由2个缓冲区构成的环形缓冲。播放声波文件由PC机通过超级终端以命令的方式选择,声音的播放状态也显示在PC机超级终端上。main.c源文件包含以下几个主要函数:SetupClock:用于初始化并设置系统时钟,并允许GPIOA、GPIOB、TIM2、TIM4和SPI的时钟;Speaker_Timer_Config:用于配置定时器TIM2和TIM4,TIM4的通道3处于PWM1模式;TIM2的通道1工作于输出比较模式,定期发出中断,在每次中断修改TIM4通道3相关寄存器,使之产生不同频率的方波;USART_Scanf_Name和USART_Scanf_Cmd:用于从超级终端获取输入字符串;main.c源文件包含以下几个主要函数(续)PrintPass:用于在超级终端上输出提示符“X:>”;main:主函数,首先初始化系统时钟、串口、连接SD卡的SPI1,与SD进行通讯初始化,检测并在超级终端上打印SD卡的信息;然后根据用户在超级中输入的命令进行操作,这里有“dir”、“cd”、“read”、“free”、“play”五个简单的命令,分别是目录项列表、目录更换、以文本方式读取文件、查询SD空余空间和播放声音文件;如果输入“Play***.wav”,则处理器开始从SD卡中读取相应的声波文件,并将其放入相应的缓冲区;msd.c:该文件用于提供SD卡的驱动,由ST公司所带例程提供,本系统用到以下一些函数。SPI_Config:配置与SD卡相连接的SPI1;MSD_Init:初始化SD卡通讯;MSD_WriteByte:向SD卡写一个字节;MSD_WriteByte:从SD卡读一个字节;MSD_GoIdleState:令SD卡处于空闲态;Get_Medium_Characteristics:获取SD卡的容量;MSD_SendCmd:向SD卡发命令;MSD_GetResponse:从SD卡获取响应;MSD_ReadBlock:从SD卡读取一块数据;fat16.c:该文件提供FAT16文件系统的支持,主要包含以下一些函数:ReadMBR:读取MBR数据结构;ReadBPB:读取BPB数据结构;ReadFAT:读取文件分配表指定项;ReadBlock:读取一个扇区;FAT_Init:获取FAT16文件系统基本信息;DirStartSec:获取根目录的开始扇区号;DataStartSec:获取数据区的开始扇区号;fat16.c续ClusConvLBA:获取一个簇的开始扇区号;LBAConvClus:转换扇区号与簇号之间的关系;LBAConvClus:计算可用空间,返回字节数;GetFileName:获取指定文件的首扇区号;List_DateAndTime:获取文件或目录项的日期时间;SearchFoler:在指定范围内查找子目录;List_AllDir_Long:列出指定范围内的目录及目录信息;FAT_FileOpen:打开指定文件;FAT_FileRead:读取文件数据;uart.c

hw_config.cuart.c:该文件提供USART串口驱动函数,可以参考7.5串行通讯接口实例的程序;hw_config.c:该文件包含系统初始化设置函数和中断配置函数。Set_System:用于提供系统时钟及电源设置;NVIC_Config:用于设置中断向量,允许TIM2中断;stm32f10x_it.c

UnicodeToGB2312.cstm32f10x_it.c:该文件仅包含一个函数TIM2_IRQHandler,即在每次TIM2中断时从缓冲器中读取音频数据送TIM4定时器,以用于产生不同频率的声音。UnicodeToGB2312.c:该文件仅包含一个函数UnicodeToGB2312,处理从UniCode编码到GB2312字符的转换,用于处理长文件名。查看SD卡内容播放声波文件9.2.5简易MP3Player的设计与实现9.2.4小节所介绍的声音播放器,是通过定时器TIM4产生不同频率方波来产生声音的,因此只适合播放wav声波文件,其音质也非常粗糙。如果希望播放MP3文件,并产生高品质的声音,则需要使用专用声音解码芯片,这将得到一个简易MP3Player原型设计。9.2.5.1

硬件设计9.2.5.2软件程序设计通过SPI1从SD卡中读取MP3文件,将所读取的内容通过SPI2发送到VS1003解码器中播放;PC机可通过USB总线读写SD卡的内容,传送MP3文件;PC机的超级终端用于发送MP3播放命令、显示MP3播放状态。main.c:源文件包含以下几个主要函数:USART_Scanf_Name和USART_Scanf_Cmd:用于从超级终端获取输入字符串;PrintPass:用于在超级终端上输出提示符“X:>”;main:主函数,首先初始化系统时钟、串口、USB接口、SPI1、SPI2,通过命令启动VS1003芯片,检测并在超级终端上打印SD卡的信息;然后根据用户在超级中输入的命令进行操作,这里有“dir”、“cd”、“read”、“free”、“usb”、“vstest”、“play”七个简单的命令,分别是目录项列表、目录更换、以文本方式读取文件、查询SD空余空间、启

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论