欢迎来到天天文库
浏览记录
ID:955657
大小:231.76 KB
页数:44页
时间:2017-10-18
《基于stm32的fats文件系统移植全教程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、一、移植目的1、结合命令界面的改进,实现文件系统与命令界面的结合使用。2、在命令界面中实现以下文件系统操作命令:flist-列出当前目录下的文件;fmkdir-在当前目录下创建目录;fchgdir-改变当前目录;fread-读取文件内容;fwrite-新建文件并写入。二、移植条件1、可以识别参数的串口命令界面。2、FatFS007e版本。三、对命令界面所实现功能的描述1、超级终端设置。首先打开串口终端,设置波特率115200,8位数据,无奇偶校验,无流控,终端仿真选择ANSIW,asicc码设置为以换行符结尾(以
2、前设置的,原因已经忘了),反正这样设置了能够正常工作。开发板复位后,终端显示:**********nthq2004编写的简单命令接口!*********Sh>然后可以在这里输入命令执行。比如现在支持的命令包括:"help","cls","ledon","ledoff","time","temp","i2cwr","i2crd","sdrd","sdwr",共10个命令。比如输入helpme命令,则会显示命令界面当前支持的所有命令,并显示当前所有输入的命令参数。所以命令执行过程的分析以helpme为例,help是命
3、令,me是参数。2、串口终端命令输入过程在串口终端输入一个字符时,其工作工程为:voidUSART1_IRQHandler(void){//该函数在文件stm32f10x_it.c中OS_CPU_SRcpu_sr;OS_ENTER_CRITICAL();OSIntNesting++;//中断嵌套计数OS_EXIT_CRITICAL();if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){Uart_ReceiveChar();//串口接收字符}OSIntExit()
4、;//这里可以触发任务切换软中断}串口接收到字符引起终端、然后调用函数Uart_ReceiveChar()获取字符并放入串口消息队列,voidUart_ReceiveChar(void){//该函数在文件uart.c中u32RecChar;RecChar=(u32)(USART1->DR&0xFF);OSQPost(UartMsgOSQ,(void*)RecChar);//将字符指针化放入消息队列,这里接用了周慈航教授书中的方法。}在task_uartcmd.c文件创建的串口界面任务中,caseUartState
5、Input://如果出于输入状态{UartCharIn=Uart_GetChar();//读取输入按键UartCharIn&=0x7F;该函数从消息队列中取得从串口接收到的字符,然后放入到串口命令缓冲数组。UartCmdBuf[UartCharCount]=UartCharIn;//将字符存入缓冲区当前位置UartCharCount+=1;Uart_PutChar(UartCharIn);//将有效字符输出。这是在用户电脑的超级终端上进行回显。}如果用户在超级终端上按下了回车键:if(UartCharIn=='
6、n')//如果按下了Enter键,它是触发软件状态机从输入态{//进入命令解释执行态的关键。UartCmdBuf[UartCharCount]=' ';//命令缓冲区以0结束Uart_PutString("r");//显示器上回显换行UartCmdState=UartStateExe;//如果输入过字符,进入命令解释态UartCharCount=0;}3、串口命令执行过程进入命令执行态后,首先进行命令缓冲字符串的解析,从中分析出命令和参数:caseUartStateExe://如果处于命令执行态{Uart
7、ParseCmdBuf(UartCmdBuf,&CmdArg);//命令缓冲字符串的解析解析后得到一个结构数组,指明参数的个数和一个指向参数指针数组的指针:该数组的第一个指针指向命令字符串,第二个开始指向参数。UartCmdStr=CmdArg.Argv[0];//解析命令缓冲区,得到命令结构信息,我这里还只支持简单命令//所以处理很简单,直接获得命令字符串,以后可以扩展。for(UartCmdIndex=0;UartCmdIndex8、搜索对应命令字符串UartCompResult=strcmp((char*)UartCmdStr,(char*)(UartCmdStrTable[UartCmdIndex]));//命令字符串比较的结果if(UartCompResult==0)//如果在字符串表里找到。返回0.break;//此时CmdIndex对应的值为命令在命令表里的索引。}if(UartCmdInd
8、搜索对应命令字符串UartCompResult=strcmp((char*)UartCmdStr,(char*)(UartCmdStrTable[UartCmdIndex]));//命令字符串比较的结果if(UartCompResult==0)//如果在字符串表里找到。返回0.break;//此时CmdIndex对应的值为命令在命令表里的索引。}if(UartCmdInd
此文档下载收益归作者所有