[STM32F0] STM32F0 USB调试小记

[复制链接]
6381|11
手机看帖
扫描二维码
随时随地手机跟帖
huangqi412|  楼主 | 2015-11-30 17:55 | 显示全部楼层 |阅读模式
之前用F103做USB转CAN调试小工具时候USB和CAN不能同时用,还挂了个串口,很不爽。周末抽空打算改一版用F072来做,直接单片USB转CAN.  072比F4便宜多了,总不至于改成F4的。
先得搞定USB,基本就成了,拿DISCOVER下手。虽然ST有固件库,不过一直是自己写驱动的,USB也不例外,移植很方便,改改宏定义和读写包和端点配置就能用。
左右开2个PDF粗略对比寄存器,看起来F0和F103的USB只有时钟源 中断向量 上拉电阻有差别(充电模块就无视) ,貌似30秒修改就能正常运行,兼容真是一件好事,感觉幸福来得太快。但是点完编译下载,实际发现居然会运行不起来!!发现未知设备,这没道理啊,赶紧进入调试压压惊,简化问题先取消EP0以外所有端点,收包断点暂停,上拉电阻有效 时钟有效 中断有效 接收枚举包也正常,进入收包中断了, 但是读8字节错误, 问题显然出在缓冲区。

先说说ST的USB缓冲区,缓冲区是1024字节,其中最后256字节可以分配给CAN。最前面是一大堆端点条目,每个端点可四个条目,每个条目16位,分别定义数据缓冲位置和大小。条目群后面是端点数据缓冲。

记得貌似F103缓冲区是USB按16位访问 用户按32位访问(高16位无意义)。先观察了一下MEM窗口 每32位后面16位重复前面16位,看起来似乎符合高16位无效情况?已经看到8字节打头那个0X80了,但是收到8字节明显不在预定位置啊。手工修改EP0_RX_ADD不管怎么修改它居然就死定在一个固定位置,真是神了,折腾了好久一阵怎么也挪不动。
不死心再试试将4个条目全部改动,这下RX位置动了,但是位置居然是第二条条目即TX_COUNT定义处。再回看开始不动情况,位置不也正好在TX_COUNT定义处么。仿佛明白了什么----这货极可能不是32位访问,而是16位访问!!赶紧再看手册,条目下有这句Address offset: [USB_BTABLE] + n*8意味着果然是16位访问。吐血啊,对比寄存器只浏览了寄存器定义没看到这行不起眼小字,跟它较劲了半小时。赶紧改动宏定义和缓冲读写语句。枚举妥妥的通过。回翻F103手册条目下有两句分别是+n*8 和+n*16。
回头继续观察MEM窗口,依然是每32位后面16位重复前面16位,误导人!!!难道是MDK的失误?装了ST的STM32 ST-LINK Utility再读内存0X40006000段,显示的跟MDK一模一样,不能怪MDK了,估计是ST改模块或者什么的也是跟我一样没改全,导致调试观察跟实际不对。

再来通信读写数据,HardFault死机,这个好解决,追堆栈死在缓冲区写函数,秒懂这十之**是地址不对齐问题。设个判断断点,果然抓到奇数地址,奇数地址16位访问下就挂了。地址就是UCHAR用户缓冲数组地址,赶紧把用户缓冲加了强制对齐,连续运行正常。


所以,F103的USB往F0上面移时候,不要看到寄存器定义一样就笑开了花,还有个32位访问要改成16位访问的坑在等着你,一不小心没看条目说明下面那句不起眼的小字就掉进去了,然后半天摸不清情况。
yklstudent| | 2015-11-30 17:59 | 显示全部楼层
经验之谈,mark;谢谢楼主的分享

使用特权

评论回复
chinamaken| | 2016-3-1 16:07 | 显示全部楼层
求大神给个改好后的程序,谢谢

使用特权

评论回复
zxm19820916| | 2016-3-7 11:23 | 显示全部楼层
Mark!!

使用特权

评论回复
qq792368480| | 2016-4-12 11:10 | 显示全部楼层
请教楼主,STM32F072 USB和CAN同时使用,USB缓冲区的最后256个字节是怎么分配给CAN呢,只要USB端点不分配到那256个字节位置就可以同时使用吗?

使用特权

评论回复
STARM| | 2016-8-3 14:39 | 显示全部楼层
qq792368480 发表于 2016-4-12 11:10
请教楼主,STM32F072 USB和CAN同时使用,USB缓冲区的最后256个字节是怎么分配给CAN呢,只要USB端点不分配到 ...

最后256个字节自动分配给CAN,无需手动设置。
USB 端点绝对不要再使用最后256个字节就可以了。
Capture_0074.jpg

Capture_0075.jpg

Capture_0076.jpg

Capture_0077.jpg
Capture_0078.jpg

STM32F103 的 CAN 的 SRAM 使用方案供参考:

Capture_0079.jpg


使用特权

评论回复
qq792368480| | 2017-1-7 12:00 | 显示全部楼层
STM32F072做的CAN适配器(USB虚拟的串口),CAN收到数据往USB发出去(到串口助手),(从串口助手发)USB收到数据往CAN发出去,这个功能可以了,但速度一快的话(1MS发送一帧数据),不是CAN死掉,就是SUB死掉。(帧协议:A1 00 60 87 76 65 54 45 37 00 00 5F (12字节一帧)),好想找出问题来,哪位帮忙下,谢谢

CANadapter.zip

1.32 MB

使用特权

评论回复
ffbiao| | 2017-3-27 10:14 | 显示全部楼层
qq792368480 发表于 2017-1-7 12:00
STM32F072做的CAN适配器(USB虚拟的串口),CAN收到数据往USB发出去(到串口助手),(从串口助手发)USB收到 ...

请问是否解决这个问题?

使用特权

评论回复
hudi008| | 2017-3-27 16:41 | 显示全部楼层
STM32F4的USB调试一样吗?

使用特权

评论回复
hudi008| | 2017-3-27 16:46 | 显示全部楼层
电脑的上位机驱动怎么写的?

使用特权

评论回复
wofei1314| | 2017-8-12 14:17 | 显示全部楼层
这一看,少走不少弯路啊,谢谢大神分享~

使用特权

评论回复
hchzdh| | 2017-8-13 03:42 | 显示全部楼层
本帖最后由 hchzdh 于 2017-8-13 03:43 编辑

顶你,这样的技术实战贴应该多出

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则