硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4345|回复: 7
收起左侧

[RL-FlashFS] STM32F103ZE RL-FlashFS+NAND Flash+RL-USB(裸机综合实现)移植成功!

[复制链接]

1

主题

16

回帖

19

积分

新手上路

积分
19
发表于 2017-9-22 11:20:20 | 显示全部楼层 |阅读模式
参照安富莱V4板的RL-FlashFS例程及基于RTX+emWin+FlashFS+USB+TCPnet+CAN+Modbus的综合Demo例程,移植STM32F103ZE RL-FlashFS+NAND Flash+RL-USB(裸机综合实现)成功!
但还是有个问题想请教,我有多块板子,有的板子低格Nand Flash能成功,有的板子低格Nand Flash却不行,不行的板子烧入Ex018-USB Mass Storage例程(SD卡和NAND模拟U盘)后却可以低格,也可以在电脑上显示找到U盘,百思不得其解,还请高手指教,如果是Nand Flash芯片有问题,应该不至于十块板中有6块不行,费解! RL-FlashFS+NAND Flash+RL-USB(裸机综合实现).zip (2.89 MB, 下载次数: 3592) 另外我的USB芯片的控制引脚是PB12,如不同的话要在usbd_STM32F103.c中修改引脚 QQ截图20170922111610.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2017-9-23 01:07:06 | 显示全部楼层
可以将没问题板子的NAND换到有问题的板子上面看看,另外就是你的FlashFS的例子和Ex018的低格是不是有区别。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2017-9-23 16:14:37 | 显示全部楼层

回 eric2013 的帖子

eric2013:可以将没问题板子的NAND换到有问题的板子上面看看,另外就是你的FlashFS的例子和Ex018的低格是不是有区别。 (2017-09-23 01:07) 
感谢 eric2013 的回复
我认真看了一下,低格没有问题,是RL-FlashFS 中FAT32格式化失败
下面是串口调式助手低格后返回的信息
【0 - ViewNandCapacity】
正在进行低级格式化中....
低级格式化完成....
挂载文件系统失败 (2:卷错误,挂载失败,对于FAT文件系统意味着无效的MBR,启动记录或者非FAT格式)
挂载失败,NAND Flash需要进行FAT32格式化
正在进行FAT32格式化中....
格式化失败
------------------------------------------------------------------
Volume访问错误
NAND Flash剩余容量 =          0字节
卸载文件系统成功
NAND Flash总容量 =          0字节
NAND Flash的总扇区数 = 0
NAND Flash读扇区大小 = 512字节
NAND Flash写扇区大小 = 512字节
卸载成功
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2017-9-23 16:40:55 | 显示全部楼层

回 eric2013 的帖子

eric2013:可以将没问题板子的NAND换到有问题的板子上面看看,另外就是你的FlashFS的例子和Ex018的低格是不是有区别。 (2017-09-23 01:07) 
我又再试了一下,看来还真是芯片的问题,买到假货了[s:128]
eric2013能否告诉我 nand flash 芯片H27U1G8F2BTR-BC是在哪买的
立创商城居然没有这个型号
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2017-9-25 09:17:52 | 显示全部楼层

回 songguoda 的帖子

songguoda:我又再试了一下,看来还真是芯片的问题,买到假货了[s:128]
eric2013能否告诉我 nand flash 芯片H27U1G8F2BTR-BC是在哪买的
立创商城居然没有这个型号 (2017-09-23 16:40) 
华强商城,淘宝,云汉等地方看看。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2018-5-30 11:48:01 | 显示全部楼层
eric2013
STM32F103ZE RL-FlashFS+NAND Flash+RL-USB裸机电脑上可以识别U盘,可加上RTX操作系统就不行了,
1. MDK的option->c/c++选项里面的预定义宏需要加上__RTX。
2. 使用RTX的情况下,USB Device模拟U盘,额外增加2两个任务;HID额外增加三个任务。
3. SAV_Table.S文件里面要增加一个SVC 1系统调用。
这几点我都改好了,RTX操作系统移植也没有问题,打开USB连接,电脑上识别不了,不知道还得注意些什么?


SVC_Table.s QQ截图20180530113343.png
MDK的option->c/c++选项里面的预定义宏需要加上__RTX。
2.png
额外增加2两个任务
3.png

/*
*********************************************************************************************************
*        函 数 名: AppTaskUSB
*        功能说明: USB开关控制,这里实现的是NandFlash模拟U盘
*        形    参: 无
*        返 回 值: 无
*   优 先 级: 10  
*********************************************************************************************************
*/
__task void AppTaskUSB(void)
{
        OS_RESULT xResult;
        uint8_t ucUSBInit = 0;
       
       
    while(1)
    {
                if(os_evt_wait_or(0xFFFF, 0xFFFF) == OS_R_EVT)
        {
            xResult = os_evt_get ();
            switch (xResult)
            {
                                /* 连接USB */
                                case USBTaskOpen_0:
                                        mc0 = ioc_getcb (NULL);
                                        if (ioc_init (mc0) == 0)
                                        {
                                                ioc_read_info (&info, mc0);
                                                if(ucUSBInit == 0)
                                                {
                                                        /* 仅需初始化一次即可,否则重复初始化三次会进入硬件异常 */
                                                        usbd_init();
                                                       
                                                        ucUSBInit = 1;
                                                }                    
                                                usbd_connect(__TRUE); /* USB设备连接 */
                                        }
                                        else
                                        {
                                                printf_taskdbg("失败\r\n");
                                        }
                                        break;
                               
                                /* 断开USB */
                                case USBTaskClose_1:
                                        usbd_connect (__FALSE);
                               
                                    /*
                                       1. 此函数加不加意义都不大, 加上的话,下次重连时间稍长,有时候还会有连接不上的情况,
                                          特别是拔掉过一次USB线的情况下。                               
                                       2. 如果不加上的话,在拔掉USB的情况下,再次连接USB,使用函数usbd_configured会误判,
                                          返回已经连接上了。
                                    */
                                        //usbd_reset_core();
                                        if(ioc_uninit (mc0) != NULL)
                                        {
                                                printf_taskdbg("卸载NANDFlash失败\r\n");               
                                        }
                                        else
                                        {
                                                printf_taskdbg("卸载NANDFlash成功\r\n");       
                                        }
                                        break;
                                       
                                case USBTaskReMountSD_2:
                                        MountNANDFlash();  /* 重新挂载NANDFlash */
                                        break;
                               
                                default:
                                        break;
                        }
                }                       
    }
}


File_Config.c设置
4.png

usb_config.c设置
5.png



回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2018-5-30 11:49:28 | 显示全部楼层
usbd_STM32F103.c


/*----------------------------------------------------------------------------
*      RL-ARM - USB
*----------------------------------------------------------------------------
*      Name:    usbd_STM32F103.c
*      Purpose: Hardware Layer module for ST STM32F103
*      Rev.:    V4.70
*----------------------------------------------------------------------------
*      This code is part of the RealView Run-Time Library.
*      Copyright (c) 2004-2013 KEIL - An ARM Company. All rights reserved.
*---------------------------------------------------------------------------*/

/* Double Buffering is not yet supported                                      */

#define __STM32E

#include <RTL.h>
#include <rl_usb.h>
#include "usbreg.h"
#include <stm32f10x.h>                         /* STM32F10x Definitions      */

#define __NO_USB_LIB_C
#include "usb_config.c"

#define USB_DBL_BUF_EP      0x0000

#define EP_BUF_ADDR (sizeof(EP_BUF_DSCR)*(USBD_EP_NUM+1)) /* Endpoint Buf Adr */

EP_BUF_DSCR *pBUF_DSCR = (EP_BUF_DSCR *)USB_PMA_ADDR; /* Ptr to EP Buf Desc   */

U16 FreeBufAddr;                        /* Endpoint Free Buffer Address       */


/*
*  Reset Endpoint
*    Parameters:      EPNum: Endpoint Number
*                       EPNum.0..3: Address
*                       EPNum.7:    Dir
*    Return Value:    None
*/

void EP_Reset (U32 EPNum) {
  U32 num, val;

  num = EPNum & 0x0F;
  val = EPxREG(num);
  if (EPNum & 0x80) {                   /* IN Endpoint                        */
    EPxREG(num) = val & (EP_MASK | EP_DTOG_TX);
  } else {                              /* OUT Endpoint                       */
    EPxREG(num) = val & (EP_MASK | EP_DTOG_RX);
  }
}


/**********************************************************************
*  Set Endpoint Status
*  Parameters:      EPNum: Endpoint Number
*                   EPNum.0..3: Address
*                   EPNum.7:    Dir
*                   stat: New Status
*    Return Value:  None
**********************************************************************/

void EP_Status (U32 EPNum, U32 stat) {
  U32 num, val;

  num = EPNum & 0x0F;
  val = EPxREG(num);
  if (EPNum & 0x80) {                   /* IN Endpoint                        */
    EPxREG(num) = (val ^ (stat & EP_STAT_TX)) & (EP_MASK | EP_STAT_TX);
  } else {                              /* OUT Endpoint                       */
    EPxREG(num) = (val ^ (stat & EP_STAT_RX)) & (EP_MASK | EP_STAT_RX);
  }
}


/**********************************************************************
*   USB Device Interrupt enable
*   Called by USBD_Init to enable the USB Interrupt
*   Return Value:    None
**********************************************************************/

#ifdef __RTX
void __svc(1) USBD_IntrEna (void);
void __SVC_1               (void) {
#else
void          USBD_IntrEna (void) {
#endif
  NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
}


/*
*********************************************************************************************************
*
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2018-5-30 12:19:41 | 显示全部楼层
用V6的板子试了一下RTX RL-USB的连接,V6断电后,再用自己的板子试,电脑居然又能识别了,代码哪也没动,真搞不懂了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 07:52 , Processed in 0.191282 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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