| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666 |
- #include "common.h"
- #include "flash.h"
- #include "stdio.h"
- #include "stdlib.h"
- #include "ff.h"
- #include "integer.h"
- #include "diskio.h"
- //#include "stm32_eval.h"
- #include "string.h"
- void edit_file(void)
- {
- FATFS fs;
- FIL file;
- FRESULT res;
- DIR dirs;
- FILINFO finfo;
- char key = 0;
- char path[20];
- uint32_t index = 0x00;
- uint32_t reindex = 0x00;
- uint8_t file_buff[512] = {0};
- uint32_t files_num = 0;
- uint8_t length = 0;
- res = f_mount(0,&fs);
- if (res != FR_OK)
- {
- printf("\r\n挂载文件系统失败,错误代码: %u",res);
- return;
- }
- res = f_opendir(&dirs,"/");
- printf("\r\n------------文件列表------------");
- if (res == FR_OK)
- {
- while ((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0])
- {
- if (finfo.fattrib & AM_DIR)//如果是文件夹
- {
- continue;
- }
- else
- {
- files_num++;
- //显示文件名,显示文件实际大小 ,文件实际大小采用四舍五入法
- printf("\r\n/%12s%7ld KB ", &finfo.fname[0],(finfo.fsize+512)/1024);
- }
- }
- if( files_num == 0 )//无文件
- {
- printf("\r\n无文件!");
- }
- }
- else
- {
- printf("\r\n打开根目录失败!");
- printf("\r\n错误代码: %u",res);
- }
- printf("\r\n输入要编辑文件全名,以回车结束...");
- get_file_name((uint8_t *)path,length,FI);
- res = f_open(&file,path,FA_READ | FA_WRITE);
- if (res == FR_OK)
- {
- printf("\r\n打开文件 %s 成功",path);
- printf("\r\n现在是文件编辑状态,请输入要写入的数据!");
- printf("\r\n按ESC或者Ctrl+C结束编辑!\r\n");
-
- while(1)
- {
- key = GetKey();
- if ((key == 0x1B) && (index == 0x00))//key ESC
- {
- printf("\r\n数据还没有输入,现在处于编辑模式...");
- continue;
- }
- else if ((key == 0x1B)) //key ESC
- {
- printf("\r\n保存数据...");
- res = f_write(&file,file_buff,index,&reindex);
- if ((res == FR_OK) && (reindex == index))
- {
- printf("\r\n保存数据成功!");
- f_close(&file);
- index = 0x00;
- reindex = 0x00;
- }
- else
- {
- printf("\r\n保存数据失败!");
- printf("\r\n错误代码: %u",res);
- }
- break;
- }
- else if (key == 0x03) //key Ctrl+C
- {
- printf("\r\n结束文件编辑!");
- printf("\r\n保存数据...");
- res = f_write(&file,file_buff,index,&reindex);
- if ((res == FR_OK) && (reindex == index))
- {
- printf("\r\n保存数据成功!");
- f_close(&file);
- index = 0x00;
- reindex = 0x00;
- }
- else
- {
- printf("\r\n保存数据失败!");
- printf("\r\n错误代码: %u",res);
- }
- break;
- }
- else if ((key < 0x21) || (key > 0x80))
- {
- continue;
- }
- else
- {
- file_buff[index++] = key;
- printf("%c",key);
- if (index > 512)
- {
- index = 0x00;
- }
- }
- }
- }
- else
- {
- printf("\r\n打开文件失败,错误代码: %u",res);
- }
- }
- void read_file(void)
- {
- FATFS fs;
- FIL file;
- FRESULT res;
- DIR dirs;
- FILINFO finfo;
- char path[20];
- char buffer[512] = {0};
- uint32_t i;
- uint8_t length=0;
- uint32_t re,files_num = 0;
- res = f_mount(0,&fs);
- if (res != FR_OK)
- {
- printf("\r\n挂载文件系统失败,错误代码: %u",res);
- return;
- }
- res = f_opendir(&dirs,"/");
- if (res == FR_OK)
- {
- //i = strlen(path);
- printf("\r\n-----------文件列表-------");
- while ((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0])
- {
- if (finfo.fattrib & AM_DIR)//如果是文件夹
- {
- continue;
- }
- else
- {
- files_num++;
- //显示文件名,显示文件实际大小 ,文件实际大小采用四舍五入法
- printf("\r\n/%12s%7ld KB ", &finfo.fname[0],(finfo.fsize+512)/1024);
- }
- }
- if( files_num == 0 )//无文件
- {
- printf("\r\n无文件,请返回先创建文件!");
- return;
- }
- }
- else
- {
- printf("\r\n打开根目录失败!");
- printf("\r\n错误代码: %u",res);
- }
- printf("\r\n输入文件全名,以回车结束...");
- get_file_name((uint8_t *)path,length,FI);
- res = f_open(&file,path,FA_READ);
- printf("\r\n正在打开文件,以下是文件数据:\r\n");
- if (res == FR_OK)
- {
- while (1)
- {
- for(i = 0;i < 512;i++)
- {
- buffer[i] = 0x00;
- }
- res = f_read(&file,buffer,512,&re);
- printf("%s",buffer);
- if (res || re == 0)
- {
- printf("\r\n文件读取结束,关闭文件!");
- f_close(&file);
- break;
- }
- }
- }
- f_mount(0,NULL);
- }
- void creat_dir(void)
- {
- FATFS fs;
- FRESULT res;
- char path[20];
- uint8_t length=0;
- res = f_mount(0,&fs);
- if (res != FR_OK)
- {
- printf("\r\n挂载文件系统失败,错误代码: %u",res);
- return;
- }
- printf("\r\n请输入文件夹名,回车确认...格式 8 + 3...");
- get_file_name((uint8_t *)path,length,DI);
- res = f_mkdir(path);
- if (res == FR_OK)
- {
- printf("\r\n创建文件目录成功!");
- }
- else
- {
- printf("\r\n创建目录失败...");
- printf("\r\n错误代码: %u",res);
- }
- f_mount(0,NULL);
- }
- void get_file_name(uint8_t *file_name,uint8_t length,uint8_t type)
- {
- uint8_t key;
- uint8_t name_leng = 0;
- printf("\r\n");
-
- while (1)
- {
- key = GetKey();
- if ((key == 13) && (name_leng == 0))
- {
- printf("\r\n");
- continue;
- }
- else if ((key == 0x2F) || (key == 0x5C))
- {
- printf("%c",key);
- continue;
- }
- else if ((key == 13) && (name_leng > 0))
- {
- printf("\r\n");
- if (type == FI)
- {
- if (check_file_name(file_name,name_leng) == 0)
- {
- break;
- }
- }
- else
- {
- break;
- }
-
- }
- else
- {
- printf("%c",key);
- file_name[name_leng] = key;
- name_leng++;
- if (name_leng > 12)
- {
- printf("\r\n文件名格式: 8 + 3,只支持8个字符,3个扩展名!");
- printf("\r\n请重新输入...");
- name_leng = 0;
- continue;
- }
- }
- }
- }
- void format_disk(void)
- {
- FATFS fs;
- uint8_t res;
- res = f_mount(0,&fs);
- if (res != FR_OK)
- {
- printf("\r\n挂载文件系统失败,错误代码: %u",res);
- return;
- }
- printf("\r\n正在格式化磁盘,请稍候...");
- res = f_mkfs(0,1,4096);
- if (res == FR_OK)
- {
- printf("\r\n格式化成功...");
- }
- else
- {
- printf("\r\n格式化失败...");
- printf("\r\n错误代码: %u\r\n",res);
- }
- f_mount(0,NULL);
- }
- void creat_file(void)
- {
- FIL file;
- FIL *pf = &file;
- FATFS fs;
- uint8_t res;
- uint8_t name[16] = {0};
- uint8_t length = 0;
- printf("\r\n请输入文件名,回车确认...格式 8 + 3...");
- printf("\r\n例:123.dat\r\n");
- get_file_name(name,length,FI);
- res = f_mount(0,&fs); /* Mount a Logical Drive 0 */
- if (res != FR_OK)
- {
- printf("\r\n挂载文件系统失败,错误代码: %u",res);
- return;
- }
- res = f_open(pf,(TCHAR *)name,FA_READ | FA_WRITE | FA_CREATE_NEW);
- if (res == FR_OK)
- {
- printf("\r\n创建文件成功!");
- res = f_close(pf);
- if (res != FR_OK)
- {
- printf("\r\n创建文件成功,但关闭文件时,失败!");
- printf("\r\n错误代码: %u",res);
- }
- }
- else
- {
- printf("\r\n创建文件失败!");
- printf("\r\n错误代码: %u",res);
- }
- f_mount(0,NULL);
- }
- void delete_file(void)
- {
- FATFS fs;
- FRESULT res;
- DIR dirs;
- FILINFO finfo;
- uint8_t name[16] = {0};
- uint8_t length = 0;
- uint32_t files_num = 0;
- res = f_mount(0,&fs); /* Mount a Logical Drive 0*/
- if (res != FR_OK)
- {
- printf("\r\n挂载文件系统失败,错误代码: %u",res);
- return;
- }
- res = f_opendir(&dirs,"/"); /* Create a Directroy Object */
- if (res == FR_OK)
- {
- printf("\r\n-----------文件列表-------");
- while ((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0])
- {
- if (finfo.fattrib & AM_DIR)//如果是文件夹
- {
- continue;
- }
- else
- {
- files_num++;
- //显示文件名,显示文件实际大小 ,文件实际大小采用四舍五入法
- printf("\r\n/%12s%7ld KB ", &finfo.fname[0],(finfo.fsize+512)/1024);
- }
- }
- if( files_num == 0 )//无文件
- {
- printf("\r\n无文件,请返回先创建文件!");
- return;
- }
- }
- get_file_name(name,length,FI); /* Get file name */
-
- res = f_unlink((TCHAR *)name); /* Delete a File or Directory */
- if (res == FR_OK)
- {
- printf("\r\n删除文件成功!");
- }
- else if (res == FR_NO_FILE)
- {
- printf("\r\n找不到文件或目录!");
- }
- else if (res == FR_NO_PATH)
- {
- printf("\r\n找不到路径!");
- }
- else
- {
- printf("\r\n错误代码: %u",res);
- }
- f_mount(0,NULL);
- }
- void list_file(void)
- {
- FATFS fs;
- FILINFO finfo;
- FRESULT res;
- DIR dirs;
- int i;
- int files_num=0;
- res = f_mount(0,&fs);
- if (res != FR_OK)
- {
- printf("\r\n挂载文件系统失败,错误代码: %u",res);
- return;
- }
- res = f_opendir(&dirs,"/"); /* Create a Directroy Object */
- printf("\r\n------------文件列表------------");
- if (res == FR_OK)
- {
- while ((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0]) /* Read Directory Entry in Sequense*/
- {
- i = strlen(finfo.fname);
- if (finfo.fattrib & AM_DIR)//如果是文件夹
- {
- files_num++;
- printf("\r\n/%s", &finfo.fname[0]);
- switch(i)//作用:输出文件名左对齐
- {
- case 1:printf(" ");
- case 2:printf(" ");
- case 3:printf(" ");
- case 4:printf(" ");
- case 5:printf(" ");
- case 6:printf(" ");
- case 7:printf(" ");
- case 8:printf("%15s"," ");
- }
- }
- else
- {
- continue;
- }
- }
- }
- else
- {
- printf("\r\n打开根目录失败!");
- printf("\r\n错误代码: %u",res);
- }
- res = f_opendir(&dirs, "/");
- if (res == FR_OK)
- {
- while ((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0])
- {
- if (finfo.fattrib & AM_DIR)
- {
- continue;
- }
- else
- {
- files_num++;
- printf("\r\n/.%12s%7ld KB ", &finfo.fname[0],(finfo.fsize+512)/1024);
- }
- }
- if( files_num==0 )//无文件
- {
- printf("\r\n无文件!");
- }
- }
- else
- {
- printf("\r\n打开根目录失败!");
- printf("\r\n错误代码: %u",res);
- }
- f_mount(0,NULL);
- }
- void get_disk_info(void)
- {
- FATFS fs;
- FATFS *fls = &fs;
- FRESULT res;
- DWORD fre_clust;
-
- res = f_mount(0,&fs); /* Mount a Logical Drive 0 */
- if (res != FR_OK)
- {
- printf("\r\n挂载文件系统失败,错误代码: %u",res);
- return;
- }
- res = f_getfree("/",&fre_clust,&fls); /* Get Number of Free Clusters */
- if (res == FR_OK)
- {
- /* Print free space in unit of MB (assuming 4096 bytes/sector) */
- printf("\r\n%d KB Total Drive Space.\r\n"
- "%d KB Available Space.\r\n",
- ((fls->n_fatent-2)*fls->csize)*4,(fre_clust*fls->csize)*4);
- }
- else
- {
- printf("\r\n获得磁盘信息失败!");
- printf("\r\n错误代码: %u",res);
- }
- f_mount(0,NULL); /*Unmount a Logical Drive 0 */
- }
- uint8_t check_file_name(uint8_t *file_name,uint8_t length)
- {
- uint8_t res;
- if (length > 13)
- {
- res = 1;
- }
- else
- {
- if (file_name[length - 4] == '.')
- {
- res = 0;
- }
- else
- {
- res = 2;
- }
- }
- return res;
- }
- void SerialPutChar(uint8_t c)
- {
- USART_SendData(USART1, c);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
- void Serial_PutString(uint8_t *s)
- {
- while (*s != '\0')
- {
- SerialPutChar(*s);
- s ++;
- }
- }
- /**
- * @brief Test to see if a key has been pressed on the HyperTerminal
- * @param key: The key pressed
- * @retval 1: Correct
- * 0: Error
- */
- uint32_t SerialKeyPressed(uint8_t *key)
- {
- if ( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
- {
- *key = (uint8_t)USART1->DR;
- return 1;
- }
- else
- {
- return 0;
- }
- }
- /**
- * @brief Get a key from the HyperTerminal
- * @param None
- * @retval The Key Pressed
- */
- uint8_t GetKey(void)
- {
- uint8_t key = 0;
- /* Waiting for user input */
- while (1)
- {
- if (SerialKeyPressed((uint8_t*)&key)) break;
- }
- return key;
- }
- void Sys_Soft_Reset(void)
- {
- SCB->AIRCR =0X05FA0000|(u32)0x04;
- }
- #if 0
- void GPIO_KEY_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- /* Configure KEY1 Button */
- RCC_APB2PeriphClockCmd(RCC_KEY1, ENABLE);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Pin = GPIO_KEY1;
- GPIO_Init(GPIO_KEY1_PORT, &GPIO_InitStructure);
- /* Configure KEY2 Button */
- RCC_APB2PeriphClockCmd(RCC_KEY2, ENABLE);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Pin = GPIO_KEY2;
- GPIO_Init(GPIO_KEY2_PORT, &GPIO_InitStructure);
- /* Configure KEY3 Button */
- RCC_APB2PeriphClockCmd(RCC_KEY3, ENABLE);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Pin = GPIO_KEY3;
- GPIO_Init(GPIO_KEY3_PORT, &GPIO_InitStructure);
- /* Configure KEY4 Button */
- RCC_APB2PeriphClockCmd(RCC_KEY4, ENABLE);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Pin = GPIO_KEY4;
- GPIO_Init(GPIO_KEY4_PORT, &GPIO_InitStructure);
- }
- void USART1_Init(void)
- {
- USART_InitTypeDef USART_InitStructure;
- /* USARTx configured as follow:
- - BaudRate = 115200 baud
- - Word Length = 8 Bits
- - One Stop Bit
- - No parity
- - Hardware flow control disabled (RTS and CTS signals)
- - Receive and transmit enabled
- */
- USART_InitStructure.USART_BaudRate = 115200;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- STM_EVAL_COMInit(COM1, &USART_InitStructure);
- }
- #endif
- int fputc(int ch, FILE *f)
- {
- USART_SendData(USART1, (u8) ch);
- while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == SET))
- {
- }
- return ch;
- }
- int fgetc(FILE *f)
- {
- while(!(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET))
- {
- }
- return (USART_ReceiveData(USART1));
- }
|