stm32usb库bug及解决办法

发布者:luanzgc最新更新时间:2018-09-20 来源: eefocus关键字:stm32  usb库  bug 手机看文章 扫描二维码
随时随地手机看文章

本人项目开发stm32usb设备的时候,发现usb发送会经常性的阻塞main函数,或者说无法让程序流畅的运行,实时性大打折扣,甚至会卡几十毫秒都很正常,我不明白st为什么会写出这样的usb程序,实属脑残,经过几经周折找到了解决办法:

usb_dcusb_dcd_int.c文件中,函数DCD_WriteEmptyTxFifo有个bug,会导致经常死循环,导致usb库耗时过长。
应该如下修改,在原始程序中增加红框内的语句:

usb的连接并不属于可靠实时性连接,有时会丢包都很正常,修改后usb不再会出现阻塞问题,非常流畅,但要注意增加丢包处理逻辑,来解决usb丢包问题。本人开的的是usbhid设备,附赠上位机三平台源码https://download.csdn.net/download/u012572552/10612090


关键字:stm32  usb库  bug 引用地址:stm32usb库bug及解决办法

上一篇:STM32例程之USB HID双向数据传输
下一篇:STM32 USB HID 自定义设备 bulk 传输

推荐阅读最新更新时间:2024-03-16 16:14

STM32 HAL printf 串口重定向
在对printf重定向之前,一定不要有printf,否则程序马上跑飞。 在main函数之前加上如下代码对串口进行重定向,当然,串口一定要初始化之后再用printf,否则程序虽然不会飞,但是printf也不会有结果 #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { //具体哪个串口可以更改huart1为其它串口 HAL_UART_Transmit(&huart1 , (
[单片机]
STM32学习——中断方式下的发送数据
利用中断接收数据较为简单,但利用中断去发送数据弄了半天才搞定。。。 注:在设置USART的控制寄存器的TE位时,会发送一个空闲帧,于是便会进入中断。 错误的做法 本来的思路是中断里的代码尽可能地少,发送字符放在主函数中,类似这样 while(1) { USART_SendData(DEBUG_USARTx,Buf ); //Delay(0xfffff); if(j =5) break; } 然而。。。要是不加Delay延时j就无法在中断服务函数中自加,通过调试,发现调用USART_SendData(),发送完成标志位TC并不是马上置位,该函数只是将数据送入数据寄存器DR,并不代表发送完毕,所以
[单片机]
STM32系统时钟配置及时钟树
参考资料:《 STM32F4xx 中文参考手册》 RCC 章节。 STM32时钟可大致分为系统时钟和其它时钟两大类,总共包含5个时钟源 HSI(High Speed Internal Clock)、HSE(High Speed External Clock)、LSI(low Speed Internal Clock)、LSE(Low Speed External Clock )、PLL(Phase Locked Loop Clock)。 下图即为STM32时钟树,黄色标识部分即为系统时钟部分,橙色即为其它时钟部分。 一、系统时钟 ①HSE(High Speed External Clock)高速外部时钟信号
[单片机]
<font color='red'>STM32</font>系统时钟配置及时钟树
STM32——硬件IIC从机通信
前言:   根据网上的资料,大部分网友表示STM32自带的硬件IIC存在bug,读写时很容易卡死。自己在调试的时候也出现卡死的情况,最后一点一点调试,也还是调通了。本文将记录自己调试STM32硬件IIC从机的一些心得体会。硬件IIC主机通信见另一篇文章:传送门 。 硬件平台:STM32F205 软件平台:keil v5 函数库:标准库 硬件IIC从机初始化 下面看下STM32中IIC的相应设置。 首先是IIC的管脚配置。 /*---------IIC1---------------*/ uint8_t Buffer_Rx_IIC1 ;//接收缓存 uint8_t Rx_Idx_IIC1=0;//接收计数 ui
[单片机]
<font color='red'>STM32</font>——硬件IIC从机通信
STM32系统嘀嗒定时器实现1ms中断事件
int main() { //系统定时器实现周期性1000hz中断事件,即1ms SysTick_Config(SystemCoreClock / 1000); } void SysTick_Handler(void) { static uint32_t cnt=0; cnt++;//记500次之后,=500ms,点灯 if(cnt =500) { cnt=0; 灯亮; } } 最大的定时时间: 如果是168MHZ, 2^24 ÷ 168000000=99.86ms
[单片机]
stm32通过SPI与adc124s021通信读取ad
/** * 配置用于操作ADC124S21的模拟SPI GPIO端口 */ static void U11ADC124S021_GPIO_init() { SPI_InitTypeDef SPI_InitStructure; //定义SPI结构体 GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO结构体 //使能SPI1时钟、GPIOA及GPIOC口时钟、引脚复用功能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOC | R
[单片机]
STM32 测量交流电压的方法
关于STM32测量交流电的一种方法. 关于交流电压测量的难点有以下几点:1.电压过大,比如市电220V,2.交流电和直流电区别很大,例如值一直在变不稳定.3.交流电压存在负值,STM32 的AD模块没法测量.4.STM32读取的电压值是瞬时值和交流电的有效值还要转换. 针对以上几点:可以采取合适的硬件设计和算法设计解决.采用电流互感器将电压从高变低,采用直流电压叠加的方式将整体的交流波形抬升,抬升到最低都大于零.至于读取到的数值采用均方根的算法算出交流有效值.另外还要注意一点是采样周期的设置. 电路设计: 这个硬件电路设计很完善.还有一种: 第二种电路结构更简单,但是运放采用的是用于测量交流信号的MCP
[单片机]
<font color='red'>STM32</font> 测量交流电压的方法
STM32】HAL STM32CubeMX教程十一---DMA (串口DMA发送接收)
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 知识概括: 通过本篇博客您将学到: DMA工作原理 STM32CubeMX创建DMA例程 HAL库定时器DMA函数库 注意:关于cubemx的DMA配置,在DMA原理介绍中全部都有所讲解,如果有哪里不懂,请仔细阅读原理详解部分。 DMA的基本介绍 什么是DMA (DM
[单片机]
【<font color='red'>STM32</font>】HAL<font color='red'>库</font> STM32CubeMX教程十一---DMA (串口DMA发送接收)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved