看了晕哥的这个帖子
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里面没啥
负责处理EP0的STEUP包的函数
占用资源描述
编译优先级 最低
编译完连其他乱七八糟的东西(包括启动文件 中断向量表 串口 led 时钟配置等等乱七八糟的)占用的空间
单纯看两个usb核心文件生成的大小 加起来约1K
离线
具体的内容呢 是用这usb库做了一个麻雀虽小五脏俱全的USB-bootloader
测试版的上位机这样子
这套上位机+boot支持的功能
自动插入拔出检测
带一个设备描述的指令 可以向主机报告设备名称 可编程可读写的储存范围
boot自带可操作地址范围的控制
允许进行对非对齐操作数量 非对齐地址进行读取
对flash和SRAM均有读写(擦除)操作支持
支持擦除前查空
调整到应用编号 跳转到地址
CRC校验
由上位机实现先查同,若同在不擦写
占用资源 很小
极限优化以后
flash占用整整不多不少4K+SRAM 1K
整个程序虽然是纯C写的 但是优化的时候一半以上的函数都看过汇编并针对优化过,和纯汇编直接撸码区别不会太大了
比较大的空间用在boot的服务上
其实如果不在boot里面判断操作地址是否符合范围 对齐规则的话,来了地址直接操作,还能再小不少。不过大容量芯片一个flash的扇区是2K 除非能吧程序压缩掉一半 只有2K(那基本上是不可能的) 不然意义都不大了~~~
如果是中容量的话 每扇区大小1K的话,还可以考虑压到3K玩玩~~
最近编辑记录 posystorage (2018-08-25 17:23:27)
离线
因为涉及到这个boot的安全性 就不发上位机和boot的程序了。
至于usb的框架 要想玩转的话,usb的协议一定要烂熟 usb官方的pdf一定要看透了,芯片的usb寄存器那块的内容也要看熟了,才能灵活自如的用起来
离线