OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3411|回复: 5

新手求助,从sd卡中复制一个文件到flash里去,exf_copy该怎么设置

[复制链接]

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-4-30
在线时间
7 小时
发表于 2017-3-23 17:16:52 | 显示全部楼层 |阅读模式
1金钱

文件名是demo.bin,放在sd卡根目录里 下面这个函数该怎么填参数?
u8 exf_copy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 totsize,u32 cpdsize,u8 fwmode)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2017-3-25 13:44:26 | 显示全部楼层
顶一下  同问 希望最好能给个例子
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-3-27 01:42:22 | 显示全部楼层
参考下我们例程了
回复

使用道具 举报

6

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2018-8-31
在线时间
115 小时
发表于 2018-10-30 17:04:03 | 显示全部楼层

exf_copy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 totsize,u32 cpdsize,u8 fwmode);         
没有找到这个函数的实现啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-10-31 01:20:06 | 显示全部楼层
长昵称不被占用 发表于 2018-10-30 17:04
exf_copy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 totsize,u32 cpdsize,u8 fwmode ...

在我们综合实验里面,   FATFS文件夹下, exfuns.c里面
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2017-3-24
在线时间
42 小时
发表于 2020-1-26 21:46:35 | 显示全部楼层
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "sram.h"
#include "malloc.h"
#include "ILI93xx.h"
#include "led.h"
#include "key.h"
#include "timer.h"
#include "touch.h"
#include "sdio_sdcard.h"
#include "GUI.h"
#include "ff.h"
#include "exfuns.h"
#include "w25qxx.h"
#include "fontupd.h"
#include "includes.h"
#include "EmWinHZFont.h"
#include "WM.h"
#include "BUTTON.h"
#include "mytext.h"
#include "ButtonUse.h"
#include "DIALOG.h"
#include "usmart.h"
#include "beep.h"
#include "diskio.h"                /* FatFs lower layer API */
#include "ff.h"           // FATFS和应用模块公用的包含文件
#include "aux_data.h"
#include "fattester.h"         
#include "exfuns.h"
/************************************************
ALIENTEK 探索者STM32F407开发板
STemWin 文本显示实验

UCOSIII中以下优先级用户程序不能使用,ALIENTEK
将这些优先级分配给了UCOSIII的5个系统内部任务
优先级0:中断服务服务管理任务 OS_IntQTask()
优先级1:时钟节拍任务 OS_TickTask()
优先级2:定时任务 OS_TmrTask()
计算活动任务的堆栈使用量:OSTaskStkChk  &p_tcb->StkFree,&p_tcb->StkUsed,
特别注意:在要显示汉字的任务程序中必须加这个头文件"EmWinHZFont.h"//要显示汉字必须加这个头文件

广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/
//字库更新任务
//设置任务优先级
#define FONTUPDATA_TASK_PRIO                7
//任务堆栈大小
#define FONTUPDATA_STK_SIZE                        128
//任务控制块
OS_TCB FontupdataTaskTCB;
//任务堆栈
CPU_STK FONTUPDATA_TASK_STK[FONTUPDATA_STK_SIZE];
//字库更新任务
void fontupdata_task(void *p_arg);
/************************************************/

//任务优先级
#define START_TASK_PRIO                                3
//任务堆栈大小       
#define START_STK_SIZE                                 1024
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈       
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);

//TOUCH任务
//设置任务优先级
#define TOUCH_TASK_PRIO                                4
//任务堆栈大小
#define TOUCH_STK_SIZE                                128
//任务控制块
OS_TCB TouchTaskTCB;
//任务堆栈
CPU_STK TOUCH_TASK_STK[TOUCH_STK_SIZE];
//touch任务
void touch_task(void *p_arg);

//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO                                 5
//任务堆栈大小
#define LED0_STK_SIZE                                128
//任务控制块
OS_TCB Led0TaskTCB;
//任务堆栈
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
//led0任务
void led0_task(void *p_arg);

//EMWINDEMO任务
//设置任务优先级
#define EMWINDEMO_TASK_PRIO                        6
//任务堆栈大小
#define EMWINDEMO_STK_SIZE                        2048
//任务控制块
OS_TCB EmwindemoTaskTCB;
//任务堆栈
CPU_STK EMWINDEMO_TASK_STK[EMWINDEMO_STK_SIZE];
//emwindemo_task任务
void emwindemo_task(void *p_arg);

u8 cpy_msg_show(u8* name,u8 pct,u8 mode)
{
//        if(mode&0X01)printf("\r\ncopy file:%s\r\n",name);
//        if(mode&0X02)printf("file copyed:%d\r\n",pct);
        return 0;
}

u8 mf_file_copy(u8* src,u8* dst)
{
        return exf_copy(cpy_msg_show,src,dst,0,0,0);       
}
   
int main(void)
{
        u8 res=0;
    OS_ERR err;
        CPU_SR_ALLOC();
        delay_init(168);                       // 延时初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         // 中断分组配置
        uart_init(115200);                    // 串口波特率设置
        TFTLCD_Init();                                    // 初始化LCD
        W25QXX_Init();                                    // 初始化W25Q128
        LED_Init();                                       // LED初始化
        BEEP_Init();                                     // 初始化蜂鸣器
    exfuns_init();       
    usmart_dev.init(84);                        // 初始化USMART
        FSMC_SRAM_Init();                         // SRAM初始化       
        mem_init(SRAMIN);                         // 内部RAM初始化
        mem_init(SRAMEX);                     // 外部RAM初始化
        mem_init(SRAMCCM);                    // CCM初始化
        disk_initialize(1);             // 初始化磁盘
        exfuns_init();                                // 为fatfs文件系统分配内存
        f_mount(fs[0],"0:",1);                // 挂载SD卡
        res=f_mount(fs[1],"1:",1);            // 挂载FLASH
    if(res==0X0D)                   // FLASH磁盘,FAT文件系统错误,重新格式化FLASH
        {
            LCD_ShowString(30,150,200,16,16,"Flash Disk Formatting...");        //格式化FLASH
            res=f_mkfs("1:",0,0);//格式化W25Q128,盘符:1;disk_initialize(1)中设置了格式化为6M字节为fatfs文件系统用。
            if(res==0)
            {
                f_setlabel((const TCHAR *)"1:ALIENTEK");        //设置Flash磁盘的名字为:ALIENTEK
                LCD_ShowString(30,150,200,16,16,"Flash Disk Format Finish");        //格式化完成
            }else LCD_ShowString(30,150,200,16,16,"Flash Disk Format Error ");        //格式化失败
            delay_ms(1000);
        }
        TP_Init();                                //初始化触摸屏
        OSInit(&err);                        //初始化UCOSIII
/*********************   初始化字库  ***************************/   
        while(font_init())                //初始化字库
        {
                LCD_ShowString(30,70,240,32,32,"Font Error!");
                while(SD_Init())        //检测SD卡
                {
                        LCD_ShowString(30,104,240,32,32,"SD Card Failed!");
                        delay_ms(200);
                        LCD_Fill(30,104,200+30,70+32,WHITE);
                        delay_ms(200);                    
                }
                update_font(30,104,32,"0:");        //如果字库不存在就更新字库
                delay_ms(2000);
                LCD_Clear(WHITE);        //清屏
                break;
        }   
        OS_CRITICAL_ENTER();        //进入临界区
        //创建开始任务
        OSTaskCreate((OS_TCB         * )&StartTaskTCB,                //任务控制块
                                 (CPU_CHAR        * )"start task",                 //任务名字
                 (OS_TASK_PTR )start_task,                         //任务函数
                 (void                * )0,                                        //传递给任务函数的参数
                 (OS_PRIO          )START_TASK_PRIO,     //任务优先级
                 (CPU_STK   * )&START_TASK_STK[0],        //任务堆栈基地址
                 (CPU_STK_SIZE)START_STK_SIZE/10,        //任务堆栈深度限位
                 (CPU_STK_SIZE)START_STK_SIZE,                //任务堆栈大小
                 (OS_MSG_QTY  )0,                                        //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
                 (OS_TICK          )0,                                        //当使能时间片轮转时的时间片长度,为0时为默认长度,
                 (void           * )0,                                        //用户补充的存储区
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
                 (OS_ERR         * )&err);                                //存放该函数错误时的返回值
        OS_CRITICAL_EXIT();        //退出临界区         
        OSStart(&err);  //开启UCOSIII
        while(1);
}

//开始任务函数
void start_task(void *p_arg)
{
        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg = p_arg;

        CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);          //统计任务               
#endif
       
#ifdef CPU_CFG_INT_DIS_MEAS_EN                //如果使能了测量中断关闭时间
    CPU_IntDisMeasMaxCurReset();       
#endif

#if        OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
         //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
        OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif               
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC,ENABLE);//开启CRC时钟
        WM_SetCreateFlags(WM_CF_MEMDEV); //启动所有窗口的存储设备
        GUI_Init();                                         //STemWin初始化
       
        OS_CRITICAL_ENTER();                   //进入临界区
        //STemWin Demo任务       
        OSTaskCreate((OS_TCB*     )&EmwindemoTaskTCB,               
                                 (CPU_CHAR*   )"Emwindemo task",                
                 (OS_TASK_PTR )emwindemo_task,                        
                 (void*       )0,                                       
                 (OS_PRIO          )EMWINDEMO_TASK_PRIO,     
                 (CPU_STK*    )&EMWINDEMO_TASK_STK[0],       
                 (CPU_STK_SIZE)EMWINDEMO_STK_SIZE/10,       
                 (CPU_STK_SIZE)EMWINDEMO_STK_SIZE,               
                 (OS_MSG_QTY  )0,                                       
                 (OS_TICK          )0,                                         
                 (void*       )0,                                       
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR*     )&err);
        //触摸屏任务
        OSTaskCreate((OS_TCB*     )&TouchTaskTCB,               
                                 (CPU_CHAR*   )"Touch task",                
                 (OS_TASK_PTR )touch_task,                        
                 (void*       )0,                                       
                 (OS_PRIO          )TOUCH_TASK_PRIO,     
                 (CPU_STK*    )&TOUCH_TASK_STK[0],       
                 (CPU_STK_SIZE)TOUCH_STK_SIZE/10,       
                 (CPU_STK_SIZE)TOUCH_STK_SIZE,               
                 (OS_MSG_QTY  )0,                                       
                 (OS_TICK          )0,                                         
                 (void*       )0,                                       
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR*     )&err);                         
        //LED0任务
        OSTaskCreate((OS_TCB*     )&Led0TaskTCB,               
                                 (CPU_CHAR*   )"Led0 task",                
                 (OS_TASK_PTR )led0_task,                        
                 (void*       )0,                                       
                 (OS_PRIO          )LED0_TASK_PRIO,     
                 (CPU_STK*    )&LED0_TASK_STK[0],       
                 (CPU_STK_SIZE)LED0_STK_SIZE/10,       
                 (CPU_STK_SIZE)LED0_STK_SIZE,               
                 (OS_MSG_QTY  )0,                                       
                 (OS_TICK          )0,                                         
                 (void*       )0,                                       
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR*     )&err);
        //字库更新任务
        OSTaskCreate((OS_TCB*     )&FontupdataTaskTCB,               
                                 (CPU_CHAR*   )"Fontupdata task",                
                 (OS_TASK_PTR )fontupdata_task,                        
                 (void*       )0,                                       
                 (OS_PRIO            )FONTUPDATA_TASK_PRIO,     
                 (CPU_STK*    )&FONTUPDATA_TASK_STK[0],       
                 (CPU_STK_SIZE)FONTUPDATA_STK_SIZE/10,       
                 (CPU_STK_SIZE)FONTUPDATA_STK_SIZE,               
                 (OS_MSG_QTY  )0,                                       
                 (OS_TICK            )0,                                         
                 (void*       )0,                                       
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR*     )&err);                                  
        OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);                //挂起开始任务                         
        OS_CRITICAL_EXIT();        //退出临界区
}

//EMWINDEMO任务
void emwindemo_task(void *p_arg)
{
        GUI_CURSOR_Show(); //调用鼠标
       
        //更换皮肤
        BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
        CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
        DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
        FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
        HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
        MENU_SetDefaultSkin(MENU_SKIN_FLEX);
        MULTIPAGE_SetDefaultSkin(MULTIPAGE_SKIN_FLEX);
        PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
        RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
        SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
        SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
        SPINBOX_SetDefaultSkin(SPINBOX_SKIN_FLEX);
        while(1)
        {
                ButtonUse_Demo(); //
        }
}

//TOUCH任务
void touch_task(void *p_arg)
{
        OS_ERR err;
        while(1)
        {
                GUI_TOUCH_Exec(); //        触摸屏驱动通过 GUI_TOUCH_Exec() 函数持续监控和更新触控面板,该函数在意识到执行了某项动
                          //作或发生什么变化时,会调用适当的通用触摸屏 API 程序。
                OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_PERIODIC,&err);//延时5ms
        }
}

//LED0任务
void led0_task(void *p_arg)
{
    u32 total,free;
        OS_ERR err;
        while(1)
        {
                exf_getfree("1:",&total,&free);
        printf("\r\n FLASH总容量:%d KB,FLASH余容量:%d KB。 \r\n",total,free);
        LED0 = !LED0;
                OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_PERIODIC,&err);//延时500ms
        }
}
//字库更新任务
//KEY_UP键长按2s更新字库
void fontupdata_task(void *pdata)
{
    FRESULT result;
        OS_ERR err;
        while(1)
        {
//                if(WK_UP == 1){                        //KEY_UP键按下
//                        OSTimeDlyHMSM(0,0,0,40,OS_OPT_TIME_PERIODIC,&err);//延时2s
//                        if(WK_UP == 1)                        //还是KEY_UP键
//                        {
////                                LCD_Clear(WHITE);
//                                OSSchedLock(&err);                //调度器上锁
//                printf("HZ Updataing,Please Wait...");

////                                LCD_ShowString(10,40,400,30,32,"HZ Updataing,Please Wait...");//是用font.h的字符
//////                                update_font(10,84,32,"0:");//更新字库  是用font.h的字符
//////                                LCD_Clear(WHITE);
//////                                POINT_COLOR = BLACK;  // BLACK
//////                                LCD_ShowString(10,40,400,30,32,"HZ Updata finshed.");//是用font.h的字符
//////              LCD_ShowString(10,82,400,30,32,"Please Restart!");//是用font.h的字符

//                 
//                                OSSchedUnlock(&err);        //调度器解锁
//               
//                        }

//                }
        
/********************start*************************/       

//        res=f_open (&fil,"0:/message.txt", FA_CREATE_ALWAYS|FA_WRITE);//打开文件,设置为没有就创建,并设置为写操作       
//         
//        f_write (&fil, "Please Restart!", 50, &bww);//写“alientek test”,50个字节
//        
//        f_close(&fil);
//        
//        res=f_open (&fil,"0:/message.txt", FA_READ);
//        
//        f_read (&fil, buf,100,&bww);       
//        f_close(&fil);
//        printf("\r\n message.txt:%s。 \r\n",buf);
/********************end***************************/
   
    /*开启按键GPIO口的时钟*/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0);
    while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1);
   
    OSSchedLock(&err);                //调度器上锁
   
    /*** 格式化FLASH    */
//    result = f_mount(fs[1],"1:",1);

//    BURN_INFO("正在格式化FLASH...");
//    //格式化FLASH
//    result = f_mkfs(FLASH_ROOT,0,0);                                                       

//    //重新挂载flash
//    result = f_mount(NULL,FLASH_ROOT,1);
//    result = f_mount(fs[1],"1:",1);

//    //如果文件系统挂载失败就退出
//    if(result != FR_OK)
//    {
//    BURN_ERROR("FLASH文件系统挂载失败,请复位重试!");

//    }else{
//        BURN_ERROR("FLASH格式化完成");
//    }
    /********************end***************************/
    /*** 删除文件    */
//    result=f_unlink("1:新宋体25.xbf");
//    if(result==FR_OK){printf("删除GB2312_H3232.FON成功");
//    }else{
//        printf("删除失败");
//    }
    /*** 复制文件    */
//    if(mf_file_copy("0:/srcdata/新宋体25.xbf","1:/新宋体25.xbf")==0)printf("复制新宋体25.xbf成功");
   
    mf_scan_files("1:");
    OSSchedUnlock(&err);        //调度器解锁
    OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);//延时10ms
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-19 22:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表