您尚未登录。

楼主 #1 2018-08-25 17:00:52

posystorage
会员
注册时间: 2018-05-06
已发帖子: 170
积分: 561

贴一个在stm32f1跑的裸奔usb程序

看了晕哥的这个帖子
https://whycan.cn/t_1546.html
想到前两天玩过的直接操作USB寄存器 不要任何库 裸奔跑起来的USB程序
就贴上来献献丑吧~
实现的功能不复杂 stm32f103  全速12M的usb  只能做设备
只用了BULK传输 单缓存 如果填充缓存部分足够快的话,可以不丢IN包的
传输速度取决于驱动 在我电脑随便用的一个bulk驱动上至少853kb/s的速度
当然驱动如果足够好的话 可以上到950kb 但是这个时候就需要用汇编来填缓冲了(包间隔如果小于7us),不然会丢in包
程序很简单 几个文件 操作USB的主要内容在easyusb.c里面
USB_HW只负责简单的硬件功能
mian里面没啥
QQ20180825163825.jpg
负责处理EP0的STEUP包的函数
QQ20180825165515.jpg
占用资源描述
编译优先级 最低
QQ20180825164546.jpg
编译完连其他乱七八糟的东西(包括启动文件 中断向量表 串口 led 时钟配置等等乱七八糟的)占用的空间
QQ20180825164445.jpg
单纯看两个usb核心文件生成的大小 加起来约1K
QQ20180825164528.jpg

文件
STM32F103的简易usb库

离线

楼主 #2 2018-08-25 17:02:06

posystorage
会员
注册时间: 2018-05-06
已发帖子: 170
积分: 561

Re: 贴一个在stm32f1跑的裸奔usb程序

具体的内容呢 是用这usb库做了一个麻雀虽小五脏俱全的USB-bootloader
测试版的上位机这样子
QQ20180825170645.jpg
这套上位机+boot支持的功能
自动插入拔出检测
带一个设备描述的指令 可以向主机报告设备名称 可编程可读写的储存范围
boot自带可操作地址范围的控制
允许进行对非对齐操作数量 非对齐地址进行读取
对flash和SRAM均有读写(擦除)操作支持
支持擦除前查空
调整到应用编号 跳转到地址
CRC校验
由上位机实现先查同,若同在不擦写

占用资源 很小
极限优化以后
flash占用整整不多不少4K+SRAM 1K 
整个程序虽然是纯C写的 但是优化的时候一半以上的函数都看过汇编并针对优化过,和纯汇编直接撸码区别不会太大了
QQ20180825171324.jpg
比较大的空间用在boot的服务上
QQ20180825171411.jpg
其实如果不在boot里面判断操作地址是否符合范围 对齐规则的话,来了地址直接操作,还能再小不少。不过大容量芯片一个flash的扇区是2K 除非能吧程序压缩掉一半 只有2K(那基本上是不可能的) 不然意义都不大了~~~
如果是中容量的话 每扇区大小1K的话,还可以考虑压到3K玩玩~~

最近编辑记录 posystorage (2018-08-25 17:23:27)

离线

楼主 #3 2018-08-25 17:26:13

posystorage
会员
注册时间: 2018-05-06
已发帖子: 170
积分: 561

Re: 贴一个在stm32f1跑的裸奔usb程序

因为涉及到这个boot的安全性 就不发上位机和boot的程序了。

至于usb的框架 要想玩转的话,usb的协议一定要烂熟 usb官方的pdf一定要看透了,芯片的usb寄存器那块的内容也要看熟了,才能灵活自如的用起来

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn