donatello1996 发表于 2017-5-5 21:36:28

【NUCLEO-L496ZG评测】震惊!男人看了会沉默的无晶振USB-OTG评测

   我想知道有多少人点进来看了;P
      
   USB-OTG,OTG的意思是On The Go,意思是在没有主机(PC)充当主设备(Host)的情况下,各个USB从设备能够进行数据通信,虽是这样说,USB设备通信是一定要分主从的,因此,在这个实验中,开发板就是主设备(Host),U盘就是从设备了。有一点要注意的,由于没有像PC机这样的传统主设备那样提供电源,因此U盘的供电由开发板提供,即OTG接口有一个VBUS引脚,这个VBUS由PG6的电平通过控制一个三极管来控制通断,三极管通断表示是否给从设备供电,若该PG6控制给从设备供电,则LD8绿色灯会亮。
    早些年,STM32的官方开发板就已经有USB-OTG的例程演示了。如图所示,此为STM32F429-Disco开发板的电子画板例程,用户在画完图案后点击保存按钮,则画板会以BMP格式存储在USB-OTG从设备(U盘)上,将U盘插上电脑就能看到刚画的图案的图片文件了。
       正如之前的帖子所说的那样,这种OTG接口使用MCU内部晶振作时钟源,省去外部晶振,在节省电路板空间的同时不影响性能,但前提是MCU支持USB-OTG-FS接口,因此大家在移植例程给F103或者F0系列的时候可以用CubeMX看下相应的MCU是否支持USB-OTG-FS接口,如图所示,F103系列由于年代久远,并不支持USB-OTG-FS接口,而F0系列就更不用说了,虽然出现的比F103系列晚,但是由于F0系列本身精简了许多外设,因此也不支持USB-OTG-FS接口。不过不用灰心,看过4月25日STM32峰会直播的童鞋就知道,STM32L0最新的型号有可能支持Type-C接口,因此,等那个型号的板子出来之后,再慢慢玩吧。

    之前社区已经有不少人发过基于CubeMX自动生成代码工程的无晶振USB-OTG评测了,为此步骤不再重复,简单来说就是配置引脚-选Fatfs和USBHost中间件-设置系统时钟。

    但我要说下非常重要的三点地方,这三点非常重要,若没注意,则USB-OTG程序无法正常运行。第一点,就是系统滴答时钟中断处理SysTick_Handler()和USB-OTG中断处理OTG_FS_IRQHandler()必须写上,而很多新手用CubeMX生成代码的时候往往会不注意这点;

第二点,那就是堆和栈的大小必须大于0x500,最好调大一点,因为OTG所需系统堆栈空间其实也很大的,如果调小了的话,文件系统的f_open()函数就无法使用。这点是必须要注意到的。如果在CubeMX中没有配置,可以在startup_stm32l496xx.s中重新配置。第三,如上文所说,要配置PG6为输出并输出高电平,否则从设备获取不到供电而无法工作。第二点和第三点在之前的帖子都有提及,但是第一点却从未有人提及过!

    放上部分代码和实验效果。在一个间隔为1秒的死循环中,使用f_open()函数打开文件系统并创建文件,然后使用f_write()函数编辑文件,文件保存完毕并关闭后,再次使用f-open()函数打开,然后用f_read()函数读取文件作校验。

    上传工程文件和Fatfs以及Usbhost的驱动文件。

    最后感谢@荣丰宇的帖子。    严正批判@moyanming2013这种另开一帖传播负面信息的行为。


小虾丁 发表于 2017-5-11 17:24:37

我用STM32CUBEMX,就只是用来生成一些初始化代码。

moyanming2013 发表于 2017-5-9 12:05:07

donatello1996 发表于 2017-5-9 09:26
第一,代码最重要的三点是可读性,可移植性,健壮性,而cubeMX生成的代码东丢西落,关键时钟使能语句和中 ...

1.我看了楼主你的代码,你根本就没有用STM32CUBEMX生成代码,楼主你的代码如下图:

用STM32CUBEMX生成的代码如下图(在我的帖子里面也可以直接下载到看看https://www.stmcu.org.cn/module/forum/thread-611658-1-1.html):


其实通过对比就可以看出来到底是你的代码有所谓的“可读性、可移植性、健壮行”还是ST官方的有可读性、可移植性、健壮行!
显然的,ST官方的代码结构、规整都符合工程性思维带来的良好可读性、可移植性和健壮行!具体代码展示如下述。
2.楼主的main函数节选如下图:

用STM32CUBEMX生成的main函数节选如下图:

注释!我们强调的就是注释,楼主说ST官方的注释见下图红框:

ST的注释怎么可能没用呢?写的非常清楚,在哪写代码,哪些函数的功能如何等等!请问看了没就说注释没用?!
在哪写代码正是STM32CUBEMX的精妙所在,也正是解决楼主的疑惑:

我负责任的告诉你,真!不!累!而且倍爽!在STM32CUBEMX中修改GPIO及其配置、中间件等等,使用STM32CUBEMX非常友好而且速度比用手写快多了!关键是不会丢失你写过的代码,不会删除你添加的文件。
你想到的别人也一定想到了!
3.楼主说的第一点根本就是自己没有使用STM32CUBEMX生成代码,而正说明了楼主是“凑出来”的工程导致的!凑出来的工程怎么能符合最新的L496系列的芯片呢?
楼主提到:

用STM32CUBEMX生成的代码不用动手就自动已经是这样了,代码可以从我的帖子下到:
https://www.stmcu.org.cn/module/forum/thread-611658-1-1.html
用STM32CUBEMX生成的代码如下图:

所以,这也正说明了一点:STM32CUBEMX是严格的和实时性很强的!
通过楼主的言论看,对STM32CUBEMX抱有很大的成见,以至于根本没用STM32CUBEMX就说它有这样和那样的问题,但是楼主帖子里又提到自己在用而且还加了几个图来说明,到底是用了还是没用呢?还是只是贴几张图“糊弄”一下呢?!如果不是糊弄,那么是不会出现楼主的所谓的第一点关于中断的问题的!
我很负责任的告诉你,STM32CUBEMX是可用的,而且尤其对于新手来说!我们都知道看linux的源码可以提升自己,同样,ST花费那么多精力来完善STM32CUBEMX是有值得我们学习的地方的!尤其是会改善国内“垃圾”代码横行的风气!
别以老鸟卖老鸟,再不学习就落伍了!

moyanming2013 发表于 2017-5-8 23:07:37

之所以出现你说的第一点:
1.你使用cube或其它程序凑成的工程,缺少一些配置或代码片段很正常,不是你理解的不正常和别人没注意到。
2.你该升级下CUBE到最新版v4.20.1和L4的hal库到最新版v1.7.0(从v1.6.0升级不上来就重新装),没有你说的所谓的“奇怪”的问题。我的示例代码都是从上述最新版本生成的,自己写的除外,没问题。

donatello1996 发表于 2017-5-7 11:48:16

补回工程文件。

SInzo 发表于 2017-5-9 09:00:16

想了想过程,准备也拿我的429试试看,otg这个现在有库支持会方便不少,以往因为配置麻烦而且不一定成功基本都懒得去折腾

donatello1996 发表于 2017-5-9 09:26:53

本帖最后由 donatello1996 于 2017-5-9 09:38 编辑

moyanming2013 发表于 2017-5-8 23:07
之所以出现你说的第一点:
1.你使用cube或其它程序凑成的工程,缺少一些配置或代码片段很正常,不是你理解 ...
第一,代码最重要的三点是可读性,可移植性,健壮性,而cubeMX生成的代码东丢西落,关键时钟使能语句和中断handler语句七零八落,还加上一大堆没用的注释,可读性非常低;代码要有可移植性必须经过系统的归纳整理,也就是你所谓的"拼凑",生成属于自己的工程,这才叫可移植性,不然,每次要用新的外设都要用cubeMX生成的工程,不累?至于健壮性更不用说了,没有经过归纳的工程何来的健壮性?我们是老鸟,稍微改点东西不会报错,就算报错了我们也知道怎么解决,但是占社区人数最多的萌新呢?一改就各种报错。cubeMX只是一个工具,我们只是用它生成的十几条初始化语句粘贴到自己的工程而已,工具有时候出问题是很正常的,我们既然是在评测一个开发板,知道哪里出问题,当然有义务告诉广大的萌新,而不是像之前的帖子那样简单地生成代码应付一下了事。
第二,我的cubeMX和firmware均为最新版本,不需要你的提醒和质疑。

donatello1996 发表于 2017-5-9 09:31:54

SInzo 发表于 2017-5-9 09:00
想了想过程,准备也拿我的429试试看,otg这个现在有库支持会方便不少,以往因为配置麻烦而且不一定成功基本 ...

429官方例程就有otg,去玩一下吧,真的很好玩

donatello1996 发表于 2017-5-9 12:20:53

本帖最后由 donatello1996 于 2017-5-9 12:28 编辑

moyanming2013 发表于 2017-5-9 12:05
1.我看了楼主你的代码,你根本就没有用STM32CUBEMX生成代码,楼主你的代码如下图:

用STM32CUBEMX生成的 ...

第一,我这个工程的确是自己参照frimware从无到有建立起来的,我没有说过这个工程是从cubemx生成的
第二,我在写程序的过程中的确是参照了cubemx生成的工程的初始化代码,因为对于我来说cubemx生成的工程就只有外设初始化代码是有用的
第三,你觉得不累,我觉得累,这是我自己认为累的,谁也不能说服谁
第四,如果你认为我只是贴几张图片糊弄大家的话,那你就错了,我要是想糊弄,连图片都不想贴,因为这几张图片的内容在我使用cubemx过程中的确有调用
第五,你认为我认为cubemx没有用,那是你的主观臆测
第六,cubemx只是一个工具,如果人们以后写代码依赖cubemx,不去深究它生成的代码结构,一离开cubemx就没辙,那不是更可怕的事情?
第七,系统滴答时钟函数和USB-OTGhandler()函数,谁也不敢100%保证一定会注意到,万一要移植到别的MCU呢?移植到F4,F7上面去呢?
第八,既然cubemx只是一个工具,用不用是看情况的,如果有时候点个灯,用寄存器就能搞定的事情,根本不需要用上cubemx,那还有必要用到?第九,倚老鸟卖老鸟的是你,我是去年11月底加入社区的,发的帖子貌似不比你少很多

adersonl 发表于 2017-5-9 12:48:33

donatello1996 发表于 2017-5-9 12:20
第一,我这个工程的确是自己参照frimware从无到有建立起来的,我没有说过这个工程是从cubemx生成的
第二 ...

本人无意引战,有任何对我感觉心里不爽的事请憋着,不要评论我,也不要AT我
这点上面比较支持楼主,cubemx存在的问题是效率差和学习成本高的问题,因为增加了HAL层,越是抽象的东西就越是难懂,文件数量也变多了,HAL刚出来的时候,我也去研究过这个库,发现配置是非常方便,但是之后就发现一个问题,同样的功能,类似的实现方式HAL的开销是非常大的,当然现在单片机资源越来越大,也不缺这么一点。还有一个最重要的一点是,之前的工程全部用的STD写的,积累下来的自己调试好的一些内外设的驱动,基本都是非常稳定的,所以鼠标点点,配置工程和复制粘贴没啥区别。而且标准库用的时间久了,项目做的多了,多维护一套HAL库也是麻烦事,以上个人不用HAL的原因。

哈佛祖安智 发表于 2017-5-9 12:55:55

adersonl 发表于 2017-5-9 12:48
本人无意引战,有任何对我感觉心里不爽的事请憋着,不要评论我,也不要AT我
这点上面比较支持楼主,cubem ...
以后的片子不支持STD,据说2017 Q4全面支持LL+HAL
页: [1] 2
查看完整版本: 【NUCLEO-L496ZG评测】震惊!男人看了会沉默的无晶振USB-OTG评测