硬汉嵌入式论坛

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

[USB] ST的H7版USB库移植到各种RTOS上坑死你没商量(已经更新)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2020-9-23 08:07:25 | 显示全部楼层 |阅读模式

坑1:诡异的USB中断优先级和Systick优先级问题

如果主要有两种情况受此影响,
(1)一个是加入RTOS后,HAL库的时间基准依然是基于Systick,USB协议栈与此时间基准相关的函数,非常容易受到影响,特别是USB中断里面调用一些相关基准判断。
(2)另一个是RTOS的Systick中断服务程序对此的影响。

坑2:MSC_MEDIA_PACKET包大小

这个参数设置的小,USB速度奇卡无比,让你怀疑还没有移植成功。

坑3:默认使用的malloc做动态内存分配

堆空间一定要开的够大。配合坑2一起用。

坑4:USB所使用内存空间的MPU配置。

解决后对应的案例:

基于STM32H7的uCOS-III + FatFS + emWin + ST USB的综合模板下载
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100125

基于STM32H7的FreeRTOS+ FatFS + emWin + ST USB的综合模板下载
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100127


基于STM32H7的uCOS-II + FatFS + emWin + ST USB的综合模板下载
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100126






评分

参与人数 2金币 +40 收起 理由
morning_enr6U + 20 很给力!
missfox + 20 神马都是浮云

查看全部评分

回复

使用道具 举报

3

主题

52

回帖

61

积分

初级会员

积分
61
发表于 2020-9-23 09:20:46 | 显示全部楼层
顶顶顶
回复

使用道具 举报

2

主题

58

回帖

74

积分

初级会员

积分
74
发表于 2020-9-23 10:48:28 | 显示全部楼层
准备听硬汉讲课,自己折腾两天都失败了。。。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2020-9-23 11:33:10 | 显示全部楼层
期待楼主总结,刚好在做L4的usb otg,cdc和msc。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-9-23 12:09:08 | 显示全部楼层
ST这个USB库,移植到RTOS上坑太多,晚上简单整理下。
回复

使用道具 举报

3

主题

1228

回帖

1237

积分

至尊会员

积分
1237
发表于 2020-9-23 14:01:40 | 显示全部楼层
就喜欢硬汉大哥点评Bug
回复

使用道具 举报

3

主题

30

回帖

39

积分

新手上路

积分
39
发表于 2020-9-23 16:23:55 | 显示全部楼层
前一阵用过,发现这个USB创建的任务占用CPU时间太多 导致别的任务卡顿
回复

使用道具 举报

2

主题

58

回帖

74

积分

初级会员

积分
74
发表于 2020-9-23 21:45:31 | 显示全部楼层
求更新。。。
回复

使用道具 举报

7

主题

23

回帖

44

积分

新手上路

积分
44
发表于 2020-9-24 09:16:48 | 显示全部楼层
前段时间一直在H7折腾ST自带USB库+ThreadX,简直吐血,包括CPU占用高和其他一些小问题,不过下面这个链接帮忙解决了大部分的问题。
https://blog.csdn.net/loveliu928/article/details/105588583
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-9-24 09:43:59 | 显示全部楼层
已经更新。
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2020-9-24 09:48:21 | 显示全部楼层
谢谢分享,辛苦了
代码不规范,亲人两行泪!
回复

使用道具 举报

1

主题

13

回帖

16

积分

新手上路

积分
16
发表于 2020-9-24 13:12:57 | 显示全部楼层
本帖最后由 zack_b0t 于 2020-9-24 13:19 编辑

st有个文档说
中断中有hal时间操作,hal库时基(带rtos时)就不能最低优先级的systick
应该用另一个最高优先级的tim做时基
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-9-24 13:47:05 | 显示全部楼层
zack_b0t 发表于 2020-9-24 13:12
st有个文档说
中断中有hal时间操作,hal库时基(带rtos时)就不能最低优先级的systick
应该用另一个最高 ...

1、不需要,我就没用另外一个定时器。
2、准确的说,不是HAL库的时基比Systick高,而是用Systick做时基的话,如果其它中断里面调用到时基相关函数时,Systick的优先级一定要比这个中断优先级高才可以,怕时基在这个阶段没有得到执行。

3、另外优先级问题是个坑,这里做的RTOS例子恰恰相反,USB中断优先级比Systick高才正常,而裸机里面就正常,都是继续用的systick做时基。

其实这种情况非常有必要研究下ST USB的源码实现,怎么搞的这么多坑,一步一个坑。
回复

使用道具 举报

16

主题

148

回帖

196

积分

初级会员

积分
196
发表于 2020-9-24 17:34:42 | 显示全部楼层
老哥 关于坑1 第二点 具体有啥影响呀 USB主机的中断优先级 我设置的是受ucos控制的  目前使用下来 很稳定了 没啥问题了
回复

使用道具 举报

3

主题

1228

回帖

1237

积分

至尊会员

积分
1237
发表于 2020-9-24 17:55:40 | 显示全部楼层
硬汉大哥,会更新这些坑的填坑措施不 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-9-24 19:16:14 | 显示全部楼层
morning_enr6U 发表于 2020-9-24 17:55
硬汉大哥,会更新这些坑的填坑措施不 ?

已经都发布了

QQ截图20200924191606.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-9-24 19:16:43 | 显示全部楼层
dyhfaily 发表于 2020-9-24 17:34
老哥 关于坑1 第二点 具体有啥影响呀 USB主机的中断优先级 我设置的是受ucos控制的  目前使用下来 很稳定了 ...

这是H7系列,与你的F4系列坑略有不同,而且这个是设备模式。
相关案例都已经发布了:

QQ截图20200924191606.png
回复

使用道具 举报

3

主题

1228

回帖

1237

积分

至尊会员

积分
1237
发表于 2020-9-24 23:24:43 | 显示全部楼层
回复

使用道具 举报

10

主题

17

回帖

47

积分

新手上路

积分
47
发表于 2020-9-25 10:53:24 | 显示全部楼层
eric2013 发表于 2020-9-24 19:16
这是H7系列,与你的F4系列坑略有不同,而且这个是设备模式。
相关案例都已经发布了:

H743有裸机的USB CDC模式的例程吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-9-25 11:00:27 | 显示全部楼层
ndthome 发表于 2020-9-25 10:53
H743有裸机的USB CDC模式的例程吗

下个月15发布RL-USB教程,所有常用通信都将发布:

RL-USB教程准备开工,各种常用USB通信协议和上位机案例统统整出来,首版定于10月15号发布(2020-09-07)
http://www.armbbs.cn/forum.php?m ... 9713&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-9-25 11:01:26 | 显示全部楼层
ndthome 发表于 2020-9-25 10:53
H743有裸机的USB CDC模式的例程吗

当前急需例子的话,我们H7-TOOL的APP固件即可,裸机的。

http://www.armbbs.cn/forum.php?mod=viewthread&tid=95468
回复

使用道具 举报

0

主题

17

回帖

17

积分

新手上路

积分
17
发表于 2020-10-23 11:39:25 | 显示全部楼层
这个模板能把USB HOST MSC的也加进去吗,我加了USB HSOT,一直会卡死
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-10-23 11:47:12 | 显示全部楼层
淼晶磊 发表于 2020-10-23 11:39
这个模板能把USB HOST MSC的也加进去吗,我加了USB HSOT,一直会卡死

后面有时间了吧。
回复

使用道具 举报

9

主题

57

回帖

84

积分

初级会员

积分
84
发表于 2021-1-19 14:24:30 | 显示全部楼层
eric大佬有用H7的HAL库做过USB HOST 的HUB吗,要改的地方太多了,HUB枚举能够成功,但是HUB上连接的设备枚举失败了,有没有合适的例程呀
回复

使用道具 举报

9

主题

57

回帖

84

积分

初级会员

积分
84
发表于 2021-1-19 16:13:05 | 显示全部楼层
烟花易冷~ 发表于 2021-1-19 14:24
eric大佬有用H7的HAL库做过USB HOST 的HUB吗,要改的地方太多了,HUB枚举能够成功,但是HUB上连接的设备枚 ...

已解决,设备地址设置错误了,感谢硬汉论坛带来的灵感
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
发表于 2021-5-25 22:21:03 | 显示全部楼层
硬汉哥,我这边测H750的USB虚拟串口功能,USB可以接收数据,但是发送数据就进入硬件故障中断,使用的是CubeMX的库+freertos,,我也试了裸跑程序,也是在发送数据时进入硬件故障 HardFault_Handler,我在想两个问题:1.MPU没有配置正确;2.某个参数没有设置对,导致数据错误引起的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2021-5-26 07:41:38 | 显示全部楼层
whjzhizun 发表于 2021-5-25 22:21
硬汉哥,我这边测H750的USB虚拟串口功能,USB可以接收数据,但是发送数据就进入硬件故障中断,使用的是Cube ...

hardfault的错误类型是什么,可以贴一下,方便下一步分析。
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
发表于 2021-5-27 10:16:41 | 显示全部楼层
eric2013 发表于 2021-5-26 07:41
hardfault的错误类型是什么,可以贴一下,方便下一步分析。

仿真时候,在红色圈出来的这一步执行完成后进入故障中断
57f941c3c7df580d86a665ec036108d.png
15093ca1fb75225fa5b1f60f2d594e9.png
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
发表于 2021-5-27 10:19:53 | 显示全部楼层
eric2013 发表于 2021-5-26 07:41
hardfault的错误类型是什么,可以贴一下,方便下一步分析。

之前仿真的位置不对,这张是对的
89cc4cfbd8a95b5c41b427a094efbcd.png
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
发表于 2021-5-27 11:45:17 | 显示全部楼层
whjzhizun 发表于 2021-5-27 10:19
之前仿真的位置不对,这张是对的

我尝试了一些,USB连接上后主动发送,居然是可以的(随便在发送函数中定义了一个数组),也可以接收数据,但是唯独不能按照我定好的协议发送,那么很快把问题定位到定义的数据是不是存在什么问题,也就是上面定义的局部变量数组和全局变量之间的问题,局部变量可以,全局变量则不可以使用CDC_Transmit_FS(),完全说不通呀,都是定义在0x24000000内的
52056847170748026ac4800c956a633.png
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
发表于 2021-5-27 11:56:07 | 显示全部楼层
eric2013 发表于 2021-5-26 07:41
hardfault的错误类型是什么,可以贴一下,方便下一步分析。

已解决,并不是全局变量和局部变量的问题,而是4字节对齐的问题,已修改地址使其是4字节的倍数,然后就可以正常发送数据了
请问有没有适用IAR的4字节对齐来定义数组或者结构体方式呢
85a824ca283aa13b4bfe656e51a4825.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 13:43 , Processed in 0.468126 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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