USBFS—关于CH32系列USBFS的上传和接收机制

以V30x USBFS的CDC模拟串口为例,讲解通用的上下传机制,和注意事项

USB初始化:

USBFS_RCC_Init是USB时钟配置

USBFS_Device_Init是USB设备初始化,其中有一个USBFS_Device_Endp_Init端点初始化

配置了端点使能,设置DMA地址,长度、控制寄存器。

注意事项:

1.  关于DMA地址,FS的IN和OUT缓冲区是连在一起的,如果同时使能了某个端点的TX和RX,需要注意只有一个DMA地址,前64字节是OUT,后64字节是IN。这里是V20X、V30X的USBFS的,其它要看对应的RM手册,各有不同。

2.  USBFS_Endp_Busy端点标志位清零,有些例程中没有,需要加上。

发送:

先判断busy标志位是否忙,装载数据、设置长度、设置ACK,busy标志位置1

发送完成中断

翻转toggle,设置NAK,busy标志位清零

接收:

OUT完成中断,初始化的时候,设置的ACK,所以OUT数据来时,会进入OUT完成中断,翻转toggle,读取数据,然后还可以控制是否NAK,一般默认保持ACK。

注意:

  1. 在中断里,没有清标志位之前,一直保持NAK,所以不用担心在中断里处理时,来了下一包数据的情况。
  2. 当RX设置了NAK,处理完,需要重新开启接收的时候,设置ACK即可。
  3. memcpy会占用时间,对速度有要求的,可以像例程中那样,直接改DMA地址。
  4. 一般不加打印,此处只为了演示。

 完整代码:V307_USBFS_CDC

其它:中断临界保护

中断抢占机制:没有配置NVIC的抢占优先级的话,默认是0,比如USB中断,默认是最高优先级。

临界保护:当有变量在主函数或多个中断里都有修改时,并且是++、--、与或操作等这种底层汇编是读-改-写的流程,需要加临界保护,先关闭中断,操作完在打开中断,__disable_irq是全局的中断,也可以改成某个指定的中断NVIC_DisableIRQ,执行两次Disable是因为关闭中断需要4个周期左右的时间。

Value++;这个的汇编大概有这3步,t0是内核的通用寄存器

  1. t0=value读
  2. t0=t0+1改
  3. value=t0写

当在第1步之后、第3步之前被高优先级中断打断时,如果那个高优先级的中断里也对value操作,无论怎么修改,退出后,返回这里,t0依然是进入中断前的t0值,也就是高优先级中断里的操作只修改了value,但是没有办法修改t0,所以执行第三步的时候,高优先级中断里的修改就相当于没有起作用。

在关闭中断期间产生了触发中断的事件,会挂起中断标志位,使能中断后,立即进入中断,不会丢失。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值