STM32 VCP PC端安装驱动失败的问题解决

本文介绍了解决STM32 USBVCP驱动中因内存分配不足导致的设备无法正常工作的问题。通过调整IAR环境中的heap大小及采用静态分配方式,解决了malloc内存不足引发的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在使用STM32 cube生成USB VCP代码后,电脑端安装了官方的1.3.1驱动(win7 64),运行程序电脑端显示一个黄色叹号,错误代码10,通讯不能进行。

  检查MCU代码除新加入的USB代码外没问题,程序除USB之外运行正常,长时间运行(7小时左右)无异常。电脑端更换1.1驱动,更换WIN7 32、XP系统错误一致。

  检查STM32生成的USB CDC类代码,在STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c文件中找到问题根源,也可以说在stm32f407xx_flash.icf的问题(IAR 7.4)。

  usbd_cdc.c文件第519行左右有如下代码:pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef)); 

  在usbd_conf.h中定义#define USBD_malloc               malloc ,之后转入IAR提供的stdlib文件中,该动态申请的代码是可以的,并不是一些人所说MCU不能malloc,只是在其申请的空间超过了IAR定义的默认heap空间,sizeof (USBD_CDC_HandleTypeDef) = 540,而在tm32f407xx_flash.icf中定义define symbol __ICFEDIT_size_heap__ = 0x200,也就是512,申请的空间大于分配的空间。将这个默认值修改为540正好也不能运行,原因是malloc会附带一些控制信息等参数,建议这个值修改到0x400以上,这样再编译运行就能正常通讯了,长时间测试没有出错。

  除了修改堆大小,还有一个比较好的方法是采用静态分配,但是这样会涉及到修改官方文件,个人是不愿意修改库、官方文件的,但是这个使用个malloc不仅需要我修改.icf文件,还给程序带来了额外5KByte的Code消耗,实在不值。

  静态分配就是在这个问题子程序static uint8_t  USBD_CDC_Init (USBD_HandleTypeDef *pdev,  uint8_t cfgidx)    前定义一个

  USBD_CDC_HandleTypeDef myMallocDefine;

  在519行把pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef)); 改成 pdev->pClassData = &myMallocDefine;问题解决。


  下面是使用malloc,静态分配,直接删除519问题行(做对比参考资源消耗,不能解决问题)的资源消耗

  malloc:        49 824 bytes of readonly  code memory     1 827 bytes of readonly  data memory     30 995 bytes of readwrite data memory

  静态分配:    44 732 bytes of readonly  code memory     1 827 bytes of readonly  data memory     31 047 bytes of readwrite data memory

  删除行:        44 732 bytes of readonly  code memory     1 827 bytes of readonly  data memory     30 507 bytes of readwrite data memory

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值