OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6987|回复: 7

STM32F429 虚拟串口跑飞求助

[复制链接]

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2021-6-8 23:09:30 | 显示全部楼层 |阅读模式
80金钱
本帖最后由 y284858 于 2021-6-8 23:30 编辑


      STM32F429 虚拟串口通过Securecrt使用xmodem协议接收文件程序跑飞
虚拟串口测试原样返回电脑端发送数据正常,但是在我尝试使用它通过xmodem协议来下载文件时程序跑飞,进入HardFault_Handler 函数。
我多次实验后发现第一包可以正常接受校验,跑飞发生在返回第一包接受成功,准备接受第二包时。
我开始怀疑是xmodem协议处理问题,在删除xmodem协议,只在每次收到数据后返回xmodem接受成功字符以维持xmodem协议运行,但是依然会在接受到第二包数据时跑飞。
我对USB协议不了解,百度也没有搜索到解决办法,希望各位大佬能帮忙找一下使哪里的问题,谢谢!
虚拟串口.zip (798.56 KB, 下载次数: 10)

最佳答案

查看完整内容[请看2#楼]

解决了,问题出在项目设置上,需要将Target设置中的Use MicroLIB选项去掉,否则在写Flash时会出现硬件错误,我尝试在不修改的情况下,在主函数中直接调用写flash函数,操作正常。怀疑是Use MicroLIB库堆栈溢出。总结出现问题的原因有三个: 1、 USB读取函数没有做防溢出处理。 2、 项目设置中使用了Use MicroLIB库 3、 串口助手Xmodem超时设置太短(100ms),导致flash写速度跟不上。通过更改加长超时时间(如1s)和优化flash写 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
 楼主| 发表于 2021-6-8 23:09:31 | 显示全部楼层
本帖最后由 y284858 于 2021-8-16 11:58 编辑

解决了,问题出在项目设置上,需要将Target设置中的Use MicroLIB选项去掉,否则在写Flash时会出现硬件错误,我尝试在不修改的情况下,在主函数中直接调用写flash函数,操作正常。怀疑是Use MicroLIB库堆栈溢出。总结出现问题的原因有三个:
1、 USB读取函数没有做防溢出处理。
2、 项目设置中使用了Use MicroLIB库
3、 串口助手Xmodem超时设置太短(100ms),导致flash写速度跟不上。通过更改加长超时时间(如1s)和优化flash写函数可以解决。
回复

使用道具 举报

0

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2019-9-19
在线时间
119 小时
发表于 2021-6-9 12:29:30 | 显示全部楼层
帮顶  
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
 楼主| 发表于 2021-6-9 14:34:09 | 显示全部楼层

谢谢你了  
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-6-9 23:19:14 | 显示全部楼层
仿真找问题
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
 楼主| 发表于 2021-6-10 11:51:55 | 显示全部楼层
本帖最后由 y284858 于 2021-6-10 13:28 编辑



之前仿真会在usb协议里面跑飞,我尝试修改了发送、接收数据处理函数,对缓存读写做了限制之后,目前测试没有跑飞现象。
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{                                                        
  /* USER CODE BEGIN 6 */                                
  void USB_RxCtrl(uint8_t * Buf, uint32_t * Len);        
  USB_RxCtrl(Buf, Len);                                 
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);         
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);                 
  return (USBD_OK);                                      
  /* USER CODE END 6 */                                 
}                                                        
                                                                                             
void USB_RxCtrl(uint8_t *Buf, uint32_t *Len)            
{                                                        
    u32 number = 0;                                      
    while (number < *Len)                                
    {                                                   
        USB_RxData[temp.rxlen] = Buf[number];            
        number++;                                       
        temp.rxlen++;                                    
        if (temp.rxlen >= USB_RX_BUF_NUMBER)            
        {                                                
            temp.rxlen = 0;                              
        }                                                
    }                                                   
}                                                        

//超时断帧
void HAL_IncTick(void)                  
{                                       
    if (temp.rxlen)                     
    {                                    
        static u32 old = 0;              
        static u8 cnt = 0;               
        if (old != temp.rxlen)           
        {                                
            old = temp.rxlen;            
            cnt = 0;                     
        }                                
        else                             
        {                                
            if (!temp.flag && cnt++ > 1)
            {                           
                temp.flag = 1;           
            }                           
        }                                
    }                                    
    uwTick += uwTickFreq;               
}                                       


//发送处理

u8 USBSend(u8 *data, u16 len)                             
{                                                         
  u16 i = 0;                                             
  u8 TimeoutCnt = 0;                                      
  uint8_t result = USBD_OK;                              
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)hUsbDeviceFS.pClassData;
  do                                                                              
  {                                                                                
    while (hcdc->TxState != 0)                                                     
    {                                                                              
      HAL_Delay(1);                                                               
      if (TimeoutCnt++ > 10)                                                      
      { //如果10ms还没有发送完成返回失败                                             
        return USBD_BUSY;                                                         
      }                                                                           
    }                                                                              
    TimeoutCnt = 0;                                                               
    for (i = 0; i < len && i < APP_TX_DATA_SIZE; i++)                              
    {                                                                              
      UserTxBufferFS[i] = data[i];                                                
    }                                                                              
    result = CDC_Transmit_FS(UserTxBufferFS, i);                                   
    len -= i;                                                                     
    data += i;                                                                     
  } while (len);                                                                  
  return result;                                                                  
}                                                                                 



现在变成接受第一包数据之后usb没有再接收到数据,发送数据正常,重启电脑端串口工具后可以再次接收到USB数据。

目前没有发现原因,后续计划将数据处理从超时断帧修改为数据流处理。目前先搁置实现其他功能了。



回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-6-10 23:39:45 | 显示全部楼层
y284858 发表于 2021-6-10 11:51

之前仿真会在usb协议里面跑飞,我尝试修改了发送、接收数据处理函数,对缓存读写做了限 ...

继续努力
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
 楼主| 发表于 2021-6-11 14:31:05 | 显示全部楼层

谢谢原子哥,现在没空高搞了,只有过几天在抽时间调试看了,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 06:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表