STM32移植USB驱动到RTX系统无法使用问题(USB分析/终篇)

1 篇文章 0 订阅

前景提要

有了前面的问题解决经验,首先将模块里的malloc函数换成自己实现的接口函数,然后调整USB中断的等级,这些工作都做完之后,电脑也有了一点反应,识别到我的这个存储设备,但是就是不出现相应的磁盘。
同样的,打开调试,这次依旧是进入硬件错误中断,但是这次有所不同,是指向了os_dly_wait函数。

分析过程

然后又使用同样的手段,看看程序是由于哪一行的程序执行导致的,但是经过调试,发现每次程序死掉的时候,标志位都不一样,但是每一次都在一个可以找到的范围内。
最终锁定在这一部分,设置类配置信息这个函数出现的几率十分大,并且多次启动调试,全速运行,查看硬件错误指向的函数位置,很多次都指向SDIO模块中,可以看到是死的地方是使用DMA进行数据传输,并且是一直等待DMA传输完成,但是这里需要知道,这个函数是在USB中断中调用的,也就意味着在一个中断中开启另一个中断(SDIO DMA中断的优先级也是0)。

猜测是DMA中断的问题,通过宏定义将当前使用的通信模式改为查询模式,下载程序运行,电脑可以正常读取SD卡和NAND Flash。

移植主机的MSC设备时,依旧出现一些新的问题,虽然经过前面的修改,主机模式很顺利移植成功,但是,U盘在使用过程中仅有首次烧写成功后,才可正常识别,并写入文件,再次掉电上电后,U盘不再可以使用。
这个问题之前在硬件测试环节时,使用示波器进行测试时一旦探头碰到DM或DP引脚,显示屏就不再能够识别这个U盘,只有重新烧写才能够使用。
最一开始怀疑是由于我们的测试改变了flash里的程序,但是这个大胆而又可怕的想法很快就被排除了,因为这是不可能(因为程序还可以使用,不会那么巧每次都是USB不能使用,其他都很正常)。
既然可以很快复现,所以就开始调试运行,看问题出在哪里,前一段时间返回值都很正确。
但是经过一段时间(3分钟左右)之后文件拷贝结果就出现了错误码100,查看源码,可以看到是FatFS模块的代码,是由于申请缓存时,至少有一个申请失败导致的。

查看该文件系统模块的宏定义,可以发现当前使用缓存区时内部普通RAM区,猜测可能是由于资源竞争(内部RAM资源)所导致,将缓存区配置为外部SDRAM之后,经过很长一段时间之后,都没有出现前面出现的错误码。
但是,经过大概20分钟后,这个错误码再次出现,由此可以看出外部SDRAM出现错误的概率要比内部RAM出现的概率小很多。但是在此之后,重新上电U盘再也无法识别。
重新烧写程序,U盘又可以被成功识别,为了排除U盘是被错误情况下锁住(但是电脑依旧可以识别,这无法解释得通),将U盘拔掉后,再次重新烧写程序,然后再插上U盘,上电,U盘竟然依旧无法识别,由此可以看出,必须保证U盘是插在显示屏上(烧写程序时),这就很奇怪了,烧写程序的过程并不会对USB口写什么数据。
在这个过程中唯一提供的只是USB供电,然后就猜测是否是由于U盘在使用前需要保持上电一段时间,于是就复现之前的问题后,使用跳线帽(F429是低电平复位)短接J-Link(5pin)的后面两个引脚,将RESET复位脚和GND短接,进行复位(这个过程电源供电是没有关闭的),这时U盘又可以使用了。
为了更进一步验证这个现象,在初始化U盘之前添加一个延时函数(分别试过500ms、800ms、1s),最终发现这个U盘初始化之前需要在上电之后1s以上。
经过示波器测试,该显示屏从上电到电平稳定仅用了200us,所以不会是硬件USB电源供电不稳定,更换一个U盘后(或是一个读卡器)也就无此需求,可以看出这只是个别U盘所具有的现象,所以为了兼容大部分的U盘,在程序中还是应该考虑到这种情况(在后期使用过程中,支持热插拔,所以该问题不会影响使用,而且不需要单独为这一问题提供一个延时)。
到此,USB的主机(MSC)和从机(MSC和VCP)从逻辑移植到RTX过程中遇到的问题得到解决。

总结

本次USB移植过程遇到的问题,是由于:
1.HAL库中的实现所依赖的一个时钟滴答被RTX占用,而RTX未开源,所以只能在RTX任务中使用RTX留出的os_time;
2.USB的工作空间需求比较大,所以需要更大的系统堆栈大小;
3.由于RTX内部有使用标准库的malloc进行缓存的申请,而我们移植的USB模块内部也使用了标准库的malloc,而且还是在中断中使用的;
4.当前使用的系统中断和USB中断需要调至最高,否则会无法正常运行;
5.在中断中使用DMA(查询方式)进行数据传输会出现问题,可能是使用方式不对;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F103是STMicroelectronics(意法半导体)推出的一款32位ARM Cortex-M3内核的微控制器系列产品。而RTX则是Keil MDK(Microcontroller Development Kit)中提供的一种实时操作系统,用于在嵌入式系统中管理任务和资源。 要配置STM32F103的RTX,首先需要安装MDK-ARM开发环境和ST-Link驱动程序。接下来,可以使用Keil MDK提供的"CubeMX"工具生成工程代码,其中包括了RTX的配置。 在CubeMX中,可以选择需要的外设和引脚功能,然后配置RTOS(RTX)选项。在RTOS选项中,可以选择启用RTX,并设置时钟频率以及堆栈和线程的大小。还可以设置RTOS的优先级和任务调度方式等相关参数。 配置完毕后,CubeMX会自动生成代码,并生成工程的HAL(Hardware Abstract Layer)驱动文件。接下来,可以使用Keil MDK打开该工程,并将生成的代码添加到工程中。然后,编写应用程序代码,利用RTX提供的API函数来创建任务、互斥信号量、消息队列、定时器等,实现所需的多任务管理和资源共享。 最后,通过编译、烧录和调试,可以将配置好的RTX程序部署到STM32F103微控制器上运行。在运行过程中,RTX会按照设定的优先级和任务调度方式来管理系统中的任务和资源,确保多任务的协调和实时性。 总之,配置STM32F103的RTX需要安装MDK-ARM开发环境、ST-Link驱动程序和CubeMX工具,通过CubeMX生成RTX的配置代码,然后结合Keil MDK编写应用程序代码,并最终将程序烧录到STM32F103上运行。这样,就可以实现对STM32F103的多任务管理和实时操作系统使用。 ### 回答2: STM32F103是STMicroelectronics推出的一款基于ARM Cortex-M3内核的32位微控制器。RTX(Real-Time eXecutive)是Keil MDK软件套件中的一个实时操作系统RTOS),用于编写实时响应和多任务应用程序。 要对STM32F103进行RTX配置,可以按照以下步骤进行操作: 1. 下载安装Keil MDK软件套件,并打开Keil uVision5集成开发环境。 2. 在工程目录下创建一个新的工程,并选择正确的STM32F103系列芯片作为目标设备。 3. 在源文件夹中创建一个名为"cmsis_os.c"的新文件,并在文件中包含"CMSIS/RTOS2/Include/cmsis_os2.h"头文件。 4. 在"cmsis_os.c"文件中定义一个全局变量作为操作系统对象: ```c osKernelState_t osKernelRunning; // 操作系统状态 ``` 5. 在"main.c"文件中,添加以下代码以初始化RTX: ```c #include "cmsis_os2.h" int main(void) { osKernelInitialize(); // 初始化操作系统 osKernelRunning = osKernelRunning; // 设置操作系统状态为运行中 osKernelStart(); // 启动操作系统 while(1) {} // 进入主循环,等待任务执行 } ``` 6. 在工程配置(Options for Target)中,选择RTX作为操作系统,并设置正确的操作系统堆栈大小和任务堆栈大小。 7. 在工程目录中创建一个新的任务文件,并在文件中定义一个任务函数。例如,创建一个名为"task1.c"的新文件,并添加以下代码: ```c #include "cmsis_os2.h" void task1(void *argument) { while(1) { // 任务执行的代码 } } ``` 8. 在"main.c"文件中添加以下代码以创建并启动任务: ```c #include "cmsis_os2.h" extern void task1(void *argument); // 声明任务函数 int main(void) { // ... osThreadNew(task1, NULL, NULL); // 创建并启动任务 // ... } ``` 9. 编译并下载程序到STM32F103芯片上,并通过调试器进行调试。 通过以上步骤,你可以在STM32F103上成功配置和使用RTX实时操作系统,并编写适用于该微控制器的实时响应和多任务应用程序。注意在编写任务代码时,需要遵循RTX的API规范和RTOS的原则,确保任务能够按照预期执行。 ### 回答3: stm32f103系列是意法半导体推出的一款高性能微控制器,它采用了高性能ARM Cortex-M3内核,拥有丰富的外设和强大的处理能力。 RTX是一种优秀的实时操作系统,可以帮助开发者更好地管理任务调度和资源分配,提高系统的稳定性和可靠性。在stm32f103中配置RTX需要以下步骤: 1. 首先,下载并安装Keil MDK开发环境,该软件包含了RTX实时操作系统。 2. 打开Keil MDK,创建一个新的项目。 3. 在创建项目时,可以选择指定所需的STM32F103系列设备。 4. 在项目创建完成后,需要添加RTX的库文件。可以在Keil MDK的安装目录中找到RTX的库文件,添加到项目中。 5. 配置RTX的相关参数。可以通过在项目中创建的配置文件中修改相关参数,例如任务的优先级、堆栈大小等。 6. 在主函数中,初始化RTX,并创建需要的任务。可以使用RTX的API函数来创建任务和设置任务的优先级。 7. 在任务中,可以编写需要实现的功能代码。可以使用RTX提供的API函数来实现任务间的通信和同步,提高系统的效率。 8. 最后,编译和下载代码到stm32f103系列设备,即可开始测试和运行。 需要注意的是,对于初学者来说,配置RTX可能会有一定的难度。建议参考官方的文档和示例代码,以便更好地理解和掌握配置RTX的方法。同时,也可以参考其他开发者的经验,通过网络上的论坛和社区进行交流和学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值