OpenEdv-开源电子网

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

通过串口指令控制读写U盘,程序卡住了

[复制链接]

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
发表于 2019-1-7 17:26:04 | 显示全部楼层 |阅读模式
5金钱
int main(void)
{
char ch;
/* 初始化LED */
LED_GPIO_Config();

/* 初始化调试串口,一般为串口1 */
Debug_USART_Config();

  printf("\r\n这是一个USB OTG例程,STM32作USB主机读取U盘 \r\n");

/* Init Host Library */
USBH_Init(&USB_OTG_Core,
USB_OTG_FS_CORE_ID,
            &USB_Host,
            &USBH_MSC_cb,
            &USR_cb);
  printf("\r\nUSBH_Init成功\r\n");

while(1)
{
    //USB处理过程
USBH_Process(&USB_OTG_Core, &USB_Host);

ch = getchar();
printf("输入字符是:%c\r\n",ch);

switch(ch)
{
case '1':
{
LED2_TOGGLE;
printf("case1操作");
result = f_mount(&fs,"0:",1);        /* Mount a logical drive */
printf("挂载文件系统");
if(result != FR_OK)
{
printf("\r\n文件系统挂载失败!\r\n");
}
else
{
ch = '0';
printf("\r\n扫描到的U盘文件:\r\n");
scan_files(scan_path);
}
break;
}
case '2':
{
LED3_TOGGLE;
result = f_mount(&fs,"0:",1);        /* Mount a logical drive */
if(result != FR_OK)
{
printf("\r\n文件系统挂载失败!\r\n");
}
else
{
ch = '0';
read_write_flie();        /* 读取根目录下test.txt的内容 */
}
break;

default:
/* 如果不是指定指令字符,打印提示信息 */
printf("\r\n输入有误\r\n");
break;
}
}
}
}
之前用按键刷新做条件能成功运行,换成串口字符做条件就卡住了,没遇到过这种情况,求助大佬

捕获.PNG

最佳答案

查看完整内容[请看2#楼]

找到这个问题的原因了,我写的程序直接在串口中断中处理U盘读写,可能因此卡住的吧,需要写一个usmart扫描函数 补充内容 (2019-1-30 10:12): 准确的说是中断没有配置好,因为u盘读写也是中断处理,我的串口接收也是中断处理,u盘的库函数中有个定时器延时函数也是中断处理,有协调好这三个中断的优先级才行,我把串口的优先级放到最低,程序正常读写U盘
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
 楼主| 发表于 2019-1-7 17:26:05 | 显示全部楼层
正点原子 发表于 2019-1-8 02:17
可以参考下我们的U盘例程

找到这个问题的原因了,我写的程序直接在串口中断中处理U盘读写,可能因此卡住的吧,需要写一个usmart扫描函数

补充内容 (2019-1-30 10:12):
准确的说是中断没有配置好,因为u盘读写也是中断处理,我的串口接收也是中断处理,u盘的库函数中有个定时器延时函数也是中断处理,有协调好这三个中断的优先级才行,我把串口的优先级放到最低,程序正常读写U盘
回复

使用道具 举报

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
 楼主| 发表于 2019-1-7 17:27:04 | 显示全部楼层
result = f_mount(&fs,"0:",1);        /* Mount a logical drive */
就卡在这了,挂载不上文件系统为什么,之前用按键可以的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-1-8 02:17:33 | 显示全部楼层
可以参考下我们的U盘例程
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
 楼主| 发表于 2019-1-8 09:32:19 | 显示全部楼层
正点原子 发表于 2019-1-8 02:17
可以参考下我们的U盘例程

我看了USB-HOST那节讲的很细致,我试着移植了一下,然后卡在FATfs进行不下去了,才发现你们的FAT和USART包装的好复杂,我想移植到STM32F105上的板子上
回复

使用道具 举报

0

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
金钱
286
注册时间
2018-12-31
在线时间
12 小时
发表于 2019-1-8 10:14:02 | 显示全部楼层
我还是小白啊!
回复

使用道具 举报

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
 楼主| 发表于 2019-1-8 10:54:31 | 显示全部楼层
正点原子 发表于 2019-1-8 02:17
可以参考下我们的U盘例程

在USB-HOSTdemo的基础上,直接修改main函数,printf打印不出东西,串口没输出这是啥情况?
回复

使用道具 举报

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
 楼主| 发表于 2019-1-8 11:03:57 | 显示全部楼层
我修改后的main.c编写无告警
#include "sys.h"
#include "delay.h"  
#include "usart.h"   
#include "led.h"
#include "lcd.h"
#include "key.h"  
#include "usmart.h"  
#include "sram.h"   
#include "malloc.h"
#include "w25qxx.h"   
#include "sdio_sdcard.h"
#include "ff.h"  
#include "exfuns.h"   
#include "fontupd.h"
#include "text.h"       
#include "piclib.h"         
#include "usbh_usr.h"

//ALIENTEK 探索者STM32F407开发板 实验53
//USB U盘 实验-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司   
//作者:正点原子 @alientek

USBH_HOST  USB_Host;
USB_OTG_CORE_HANDLE  USB_OTG_Core;


//用户测试主程序
//返回值:0,正常
//       1,有问题
u8 USH_User_App(void)
{
        u32 total,free;
        u8 res=0;
        res=exf_getfree("2:",&total,&free);
        if(res==0)
        {
                printf("\r\nFATFS OK!");       
                printf("\r\nU Disk Total Size: %d    MB",total);         
                printf("\r\nU Disk  Free Size: %d    MB",free);             
        }

        while(HCD_IsDeviceConnected(&USB_OTG_Core))//设备连接成功
        {       
                        printf("\r\n设备连接成功!.");       
        }
        printf("\r\n设备连接中...");
        return res;
}


int main(void)
{        
        u8 t;
        uart_init(115200);                //初始化串口波特率为115200
        printf("\r\n初始化串口波特率为115200");
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        printf("\r\n设置系统中断优先级分组2");
        delay_init(168);  //初始化延时函数
        printf("\r\n初始化延时函数");
        LED_Init();                                //初始化与LED连接的硬件接口
        KEY_Init();                                //按键
        printf("\r\n初始化与LED");
//        W25QXX_Init();                        //SPI FLASH初始化
        usmart_dev.init(84);         //初始化USMART
        printf("\r\n初始化USMART");
        my_mem_init(SRAMIN);        //初始化内部内存池       
        printf("\r\n初始化内部内存池        ");
        exfuns_init();                        //为fatfs相关变量申请内存
        printf("\r\n为fatfs相关变量申请内存");
//        piclib_init();                        //初始化画图
//          f_mount(fs[0],"0:",1);         //挂载SD卡  
//          f_mount(fs[1],"1:",1);         //挂载SD卡  
          f_mount(fs[2],"2:",1);         //挂载U盘
                printf("\r\n挂载U盘");
//        POINT_COLOR=RED;      
//         while(font_init())                                 //检查字库
//        {            
//                LCD_ShowString(60,50,200,16,16,"Font Error!");
//                delay_ms(200);                                  
//                LCD_Fill(60,50,240,66,WHITE);//清除显示             
//                delay_ms(200);                                  
//        }
                        
        //初始化USB主机
          USBH_Init(&USB_OTG_Core,USB_OTG_FS_CORE_ID,&USB_Host,&USBH_MSC_cb,&USR_Callbacks);
                printf("\r\n初始化USB主机");               
        while(1)
        {
                USBH_Process(&USB_OTG_Core, &USB_Host);
                delay_ms(1);
                t++;
                if(t==200)
                {
                        LED0=!LED0;
                        t=0;
                }
        }       
}


回复

使用道具 举报

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
 楼主| 发表于 2019-1-9 12:33:47 | 显示全部楼层
Scorpio95 发表于 2019-1-8 11:03
我修改后的main.c编写无告警
#include "sys.h"
#include "delay.h"  

没改时钟。。。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 17:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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