你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32 USB CDC中诡异的堆栈设置问题

[复制链接]
潇潇雨歇pku 提问时间:2017-10-27 17:01 /
本帖最后由 潇潇雨歇pku 于 2017-10-31 08:45 编辑

芯片:STM32F401CB,有64kB ram
软件:cubemx生成的IAR工程
功能:mcu控制单片机采集i2c传感器数据,通过usb的virtual com port回传到PC(后期会在mcu本地处理)

问题1:接usb到pc后,可以在设备管理器中看到com口,但是串口助手无法打开。
尝试1:尝试修改iar堆栈大小
结果1:基本解决,可以传数据到PC,串口可以打开

为什么说基本解决呢,因为里边产生了更诡异的问题。
同样硬件3个样品,在A配置下,只有12能打开串口,3不能,在B配置下,3可以打开,12不能。
12.png 3.png
3个样品是同样的PCBA,芯片都是同一批次在mouser购买的,不存在假货的问题。买来放了大概2年。
由于芯片有64kB RAM,这么小的堆栈,绝对不存在撑爆ram的问题。
问题2:为什么3个芯片需要不同的配置?
问题3:为什么堆栈设置大了反而打开不串口了?设置小了打不开倒可以理解,大了打不开完全没道理啊?

之后又有了一个新的问题,别人拿我的程序做了改动,逻辑更复杂了,然后发现串口无法打开。
我这改堆栈已经轻车熟路了,心想可能随随便便就搞定了,结果又出了幺蛾子。
他的程序逻辑也就复杂了一点,结果堆栈都要设置到0x5000才可以打开串口。
5000.png
除此以外,还发现了更奇怪的问题。我查看map文件中的stack usage,stack用的其实很少:
stack usage.png
就是stack比较要设置的跟heap一样大才行,基本stack只用了那么点,也不能设置小了,哪怕是设置成0x4F00都不会,都会导致串口无法打开。
问题4:为什么stack使用很小的情况下,却必须设置很大?要跟heap一样大才可以工作?

与操作系统有关系,在win7下不会出问题。在win10下更新最新的驱动也可以。
收藏 评论10 发布时间:2017-10-27 17:01

举报

10个回答
uwyciw100 回答时间:2017-10-31 09:10:43
潇潇雨歇pku 发表于 2017-10-28 09:47
大神,我试过这个仿真。不知道为什么,在debug模式下,我在这里设置断点,总是运行不过来。不知道跟我的 ...

会不会和你工程的优化等级有关。我在IAR中,不开优化,是可以在这个判断中打断点的。堆分配到0X300,也是可以正常联接的(在电脑中,端口正常显示,还没试通信)。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

uwyciw100 回答时间:2017-10-27 17:34:23
直的是奇,之前一直调试F7的CDC,驱动上总是黄叹号。看了楼主的帖子,把堆的大小改大了(栈本来就比较大),结果居然好使了。什么原因还未知。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

qianfan 回答时间:2017-10-27 17:53:40
小的话这个地方分配内存失败,可以仿真跟一下。
pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef));
  
  if(pdev->pClassData == NULL)
  {
    ret = 1;
  }

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

潇潇雨歇pku 回答时间:2017-10-28 09:45:57
uwyciw100 发表于 2017-10-27 17:34
直的是奇,之前一直调试F7的CDC,驱动上总是黄叹号。看了楼主的帖子,把堆的大小改大了(栈本来就比较大) ...

因为usb有一个全局变量,是结构体,结构体成员很多都是指针,都是要malloc空间的,所以对堆的需求比较大。
潇潇雨歇pku 回答时间:2017-10-28 09:47:51
QianFan 发表于 2017-10-27 17:53
小的话这个地方分配内存失败,可以仿真跟一下。
pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_Handle ...

大神,我试过这个仿真。不知道为什么,在debug模式下,我在这里设置断点,总是运行不过来。不知道跟我的山寨下载器有没有关系。后来就放弃debug了……
潇潇雨歇pku 回答时间:2017-10-28 09:49:19
QianFan 发表于 2017-10-27 17:53
小的话这个地方分配内存失败,可以仿真跟一下。
pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_Handle ...

还有问题3可以帮忙看一下吗?堆栈必须要设置到某个值附近才可以,小了不行,太大了也不行。ram是64k的肯定够用的。
以及堆和栈必须设置一样大才可以运行,以前从来没有碰到过这种变态要求的。
qianfan 回答时间:2017-10-28 10:37:17
潇潇雨歇pku 发表于 2017-10-28 09:49
还有问题3可以帮忙看一下吗?堆栈必须要设置到某个值附近才可以,小了不行,太大了也不行。ram是64k的肯 ...

这种情况可能是其他的地方引起的吧。内存越界了?
qianfan 回答时间:2017-10-28 10:37:24
潇潇雨歇pku 发表于 2017-10-28 09:49
还有问题3可以帮忙看一下吗?堆栈必须要设置到某个值附近才可以,小了不行,太大了也不行。ram是64k的肯 ...

这种情况可能是其他的地方引起的吧。内存越界了?
潇潇雨歇pku 回答时间:2017-10-30 08:44:36
QianFan 发表于 2017-10-28 10:37
这种情况可能是其他的地方引起的吧。内存越界了?

初始程序是由cube生成的,就在main中增加了一个字符串,然后在while中发送这个字符串,应该没有内存越界的问题。
潇潇雨歇pku 回答时间:2017-10-31 13:40:58
uwyciw100 发表于 2017-10-31 09:10
会不会和你工程的优化等级有关。我在IAR中,不开优化,是可以在这个判断中打断点的。堆分配到0X300,也是 ...

最终发现是驱动问题。
在win10下要使用最新版驱动,win7下旧版驱动可以。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版