在使用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