抱歉,我不清楚这里提问能否使用中文,如果不支持我下次换成英文。
SDK: 2.3.1
请教一下,我在使用rt1052的usb读取u盘时,遇到一个奇怪的现象:
参考的是SDK2.3.1的usb例子usb_host_msd_fatfs,在sdram专门开了个区域给usb协议栈使用,MDK分散加载文件如下图:
把usb使用到的相关数据放到该区域
在设置MPU usb区域时遇到一个奇怪的现象,区域9即usb数据使用的区域,最后一个参数,只有在大于4M时,rt1052才能够正常枚举出U盘,也就是说使用ARM_MPU_REGION_SIZE_1MB,ARM_MPU_REGION_SIZE_2MB或者ARM_MPU_REGION_SIZE_4MB,此时都不能正常读取到U盘的信息。
所以在使用usb时应该怎样设置MPU呢?
Solved! Go to Solution.
MPU配置和链接文件看着没有问题,我怀疑是 SDK 2.3 里 USB 驱动本身有限制,你这边有没有可能升级到 SDK 2.11?经过了这么多版本迭代,USB stack得修了多少潜在问题。虽然不推荐SDK有更新就同步升级,不过你这差得版本太多了,SDK 2.3是三年前的事了
可以用中文。
你挂载的 SDRAM 具体容量是多少?0x80F00000 及之后的空间在工程里有具体使用吗?
看你的链接文件,只定义了 0x80E00000 之后的 1MB 空间放置 USB 驱动代码,所以你的 MPU 配置代码里对 Region 9 设置 1MB/2MB/4MB/8MB 应该是一样的效果。
但是你现在只能在配置为 8MB 的情况下功能正常,请问这个结果是稳定的吗?如果 MPU 这里配置 1MB,结果一定是不工作吗?(请测试5次以上)
另外可以尝试将I/D Cache先关掉,试试MPU 配置 1MB是否功能正常。
最后,你这样的配置是希望 0x80E00000 空间属性是带 cache 的 normal memory (through no write allocate),这是你的目的吗?
MPU->RBAR = ARM_MPU_RBAR(9, 0x80E00000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, 1, 1, 0, ARM_MPU_REGION_SIZE_1MB);
SDK里有时候为了避免cache一致性的问题,经常的做法是将这个区域的cache关掉,来放一些USB代码数据。
MPU->RBAR = ARM_MPU_RBAR(9, 0x80E00000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1MB);
谢谢衡大佬回答。
1、sdram是用32M的,0x80F00000 及之后的空间没有使用到。
2、usb otg 使用时有主从切换,即正常情况下usb 做从设备(虚拟串口VCOM)使用,检测到u盘时切换成usb 主设备模式,u盘拔出又切换到从模式。做从设备时vcom是可以正常使用,检测到u盘接入时也能主从切换,电源切换,就是u盘不能够正常枚举出来。
3 、MPU区域9,属性设置时参考SDK2.3.1的,里面有专门设置了MPU属性,比较新的sdk比如2.10的好像没有怎么设置了。该属性是shareable的,看资料好像意味着cache不起作用。
MPU->RBAR = ARM_MPU_RBAR(9, 0x80E00000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, 1, 1, 0, ARM_MPU_REGION_SIZE_1MB);
测试发现MPU9区域使用8M才能识别出U盘,但同时也有新的问题,MPU区域8的2M是non-cacheable的,里面存放的是lcd的显存的,lcd显示明显就有些卡顿,有时停止刷新。如果正常设置1M、2M、4M,u盘没识别出来,lcd显示倒是正常的。感觉是这两个冲突了?
#define m_ncache_start 0x80C00000
#define m_ncache_size 0x00200000
MPU->RBAR = ARM_MPU_RBAR(8, 0x80C00000);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB);
4、把d-cache关闭,区域9设置成1M,u盘也能正常枚举出来,就是明显lcd刷新慢了不少。
5、MPU 区域9设置成noncache,同时开启D-cache,u盘还是不能枚举出来。
不知道表述清楚不清楚,附上MPU配置和分散加载代码
MPU设置:
/* MPU configuration. */
void BOARD_ConfigMPU(void)
{
/* Disable I cache and D cache */
if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR))
{
SCB_DisableICache();
}
if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR))
{
SCB_DisableDCache();
}
/* Disable MPU */
ARM_MPU_Disable();
/* Region 0 setting: Memory with Device type, not shareable, non-cacheable. */
MPU->RBAR = ARM_MPU_RBAR(0, 0xC0000000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
/* Region 1 setting: Memory with Device type, not shareable, non-cacheable. */
MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
/* Region 2 setting */
#if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)
/* Setting Memory with Normal type, not shareable, outer/inner write back. */
MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_512MB);
#else
MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
#endif
MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
MPU->RBAR = ARM_MPU_RBAR(7, 0x80000000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_16MB);//
MPU->RBAR = ARM_MPU_RBAR(8, 0x80C00000);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB);
//usb region
MPU->RBAR = ARM_MPU_RBAR(9, 0x80E00000);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, 1, 1, 0, ARM_MPU_REGION_SIZE_8MB);//0, 1, 1, 1, 0,
ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk);
SCB_EnableDCache();
SCB_EnableICache();
}
分散加载:
#define m_sdram_interrupts_start 0x80000000
#define m_sdram_interrupts_size 0x00000400
#define m_sdram_text_start 0x80000400
#define m_sdram_text_size 0x001FFC00
#define m_sdram_font_start 0x80200000
#define m_sdram_font_size 0x00300000
#define m_sdram_icon_start 0x80500000
#define m_sdram_icon_size 0x00100000
#define m_sdram_data_start 0x80600000
#define m_sdram_data_size 0x00600000
#define m_ncache_start 0x80C00000
#define m_ncache_size 0x00200000
#define m_usb_start 0x80E00000
#define m_usb_size 0x00100000
#define m_itcm_start 0x00000000
#define m_itcm_size 0x00020000
#define m_dtcm_start 0x20000000
#define m_dtcm_size 0x00020000
#define m_ocram_start 0x20200000
#define m_ocram_size 0x00040000
/* Sizes */
#if (defined(__stack_size__))
#define Stack_Size __stack_size__
#else
#define Stack_Size 0x10000
#endif
#if (defined(__heap_size__))
#define Heap_Size __heap_size__
#else
#define Heap_Size 0x1000
#endif
LR_m_text m_sdram_interrupts_start m_sdram_text_start+m_sdram_text_size-m_sdram_interrupts_size
{ ; load region size_region
VECTOR_ROM m_sdram_interrupts_start m_sdram_interrupts_size
{ ; load address = execution address
* (RESET,+FIRST)
}
ER_m_text m_sdram_text_start m_sdram_text_size
{ ; load address = execution address
* (InRoot$$Sections)
.ANY (+RO)
}
ER_m_font m_sdram_font_start EMPTY m_sdram_font_size
{ ;execution address
}
ER_m_icon m_sdram_icon_start EMPTY m_sdram_icon_size
{ ;execution address
}
RW_m_data m_sdram_data_start m_sdram_data_size-Stack_Size-Heap_Size
{ ; RW data
.ANY (+RW +ZI)
*(m_usb_dma_init_data)
*(m_usb_dma_noninit_data)
}
ARM_LIB_HEAP +0 EMPTY Heap_Size
{ ; Heap region growing up
}
ARM_LIB_STACK m_sdram_data_start+m_sdram_data_size EMPTY -Stack_Size
{ ; Stack region growing down
}
RW_m_ncache m_ncache_start m_ncache_size
{ ; ncache RW data
* (NonCacheable.init)
* (NonCacheable)
}
RW_m_usb_data m_usb_start m_usb_size
{ ; RW data
*(section_for_usb)
usb_device_descriptor.o ( +RW +ZI)
virtual_com.o ( +RW +ZI)
usb_device_ehci.o ( +RW +ZI)
usb_osa_bm.o ( +RW +ZI)
usb_phy.o ( +RW +ZI)
usb_device_dci.o ( +RW +ZI)
usb_device_ch9.o ( +RW +ZI)
usb_device_class.o ( +RW +ZI)
usb_device_cdc_acm.o ( +RW +ZI)
usb_host_devices.o( +RW +ZI)
usb_host_ehci.o( +RW +ZI)
usb_host_framework.o ( +RW +ZI)
usb_host_hci.o( +RW +ZI)
usb_host_hub.o ( +RW +ZI)
usb_host_hub_app.o( +RW +ZI)
usb_host_msd.o ( +RW +ZI)
usb_host_msd_ufi.o ( +RW +ZI)
fsl_usb_disk_bm.o ( +RW +ZI)
host_msd_fatfs.o ( +RW +ZI)
usb_otg.o ( +RW +ZI)
}
m_dtcm m_dtcm_start m_dtcm_size
{
*(section_for_dtcm)
}
m_itcm m_itcm_start m_itcm_size
{
isr.o(+RO)
*(i.lcdif_irq_handler)
*(i.sys_task_tick_increase)
*(i.soft_timer_handler)
*(i.sys_gui_refresh_handler)
*(i.sys_gui_touch_handler)
*(i.keyboard_scan_task)
}
m_ocram m_ocram_start m_ocram_size
{
}
}
MPU配置和链接文件看着没有问题,我怀疑是 SDK 2.3 里 USB 驱动本身有限制,你这边有没有可能升级到 SDK 2.11?经过了这么多版本迭代,USB stack得修了多少潜在问题。虽然不推荐SDK有更新就同步升级,不过你这差得版本太多了,SDK 2.3是三年前的事了
确实太旧了, 其他那些外设驱动是不是也要改一下,我升级一下