历史上的今天
返回首页

历史上的今天

今天是:2024年09月12日(星期四)

正在发生

2018年09月12日 | STM32L0开发笔记4: 解决使用--CPP11编译USB驱动报错问题

2018-09-12 来源:eefocus

    项目希望使用C++语言进行程序设计,在Keil中使用C++语言的方法,我已经在在Keil中使用C++进行程序设计进行介绍过,不过对于STM32CubeMX生成的STM32L0XX相关文件进行编译时,提示如下图所示的错误。

    仔细分析可以看出,所有的错误都集中在usbd_conf.c文件,定位错误的具体语句,如下所示。


USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev)

{

  HAL_StatusTypeDef hal_status = HAL_OK;

  USBD_StatusTypeDef usb_status = USBD_OK;

 

  hal_status = HAL_PCD_DeInit(pdev->pData);

 

  switch (hal_status) {

    case HAL_OK :

      usb_status = USBD_OK;

    break;

    case HAL_ERROR :

      usb_status = USBD_FAIL;

    break;

    case HAL_BUSY :

      usb_status = USBD_BUSY;

    break;

    case HAL_TIMEOUT :

      usb_status = USBD_FAIL;

    break;

    default :

      usb_status = USBD_FAIL;

    break;

  }

  return usb_status; 

}

    错误出现在hal_status = HAL_PCD_DeInit(pdev->pData);语句上。根据错误的具体提示,可分析出是传递参数的类型不匹配,先查看HAL_PCD_DeInit函数,如下所示,函数希望传递的参数类型是PCD_HandleTypeDef。


HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd)

{

  /* Check the PCD handle allocation */

  if(hpcd == NULL)

  {

    return HAL_ERROR;

  }

 

  hpcd->State = HAL_PCD_STATE_BUSY;

  

  /* Stop Device */

  HAL_PCD_Stop(hpcd);

    

  /* DeInit the low level hardware */

  HAL_PCD_MspDeInit(hpcd);

  

  hpcd->State = HAL_PCD_STATE_RESET;

  

  return HAL_OK;

}

    再查看pdev->pData变量,如下所示,pData的类型是void,这就是编译时报错的原因。具体分析可认为C99允许对void隐式的改变数据类型,但CPP11则不可以。


typedef struct _USBD_HandleTypeDef

{

  uint8_t                 id;

  uint32_t                dev_config;

  uint32_t                dev_default_config;

  uint32_t                dev_config_status; 

  USBD_SpeedTypeDef       dev_speed; 

  USBD_EndpointTypeDef    ep_in[15];

  USBD_EndpointTypeDef    ep_out[15];  

  uint32_t                ep0_state;  

  uint32_t                ep0_data_len;     

  uint8_t                 dev_state;

  uint8_t                 dev_old_state;

  uint8_t                 dev_address;

  uint8_t                 dev_connection_status;  

  uint8_t                 dev_test_mode;

  uint32_t                dev_remote_wakeup;

 

  USBD_SetupReqTypedef    request;

  USBD_DescriptorsTypeDef *pDesc;

  USBD_ClassTypeDef       *pClass;

  void                    *pClassData;  

  void                    *pUserData;    

  void        *pData;    

} USBD_HandleTypeDef;

    将*pData的数据类型直接修改为PCD_HandleTypeDef,如下所示,再编译时,问题解决。

typedef struct _USBD_HandleTypeDef

{

  uint8_t                 id;

  uint32_t                dev_config;

  uint32_t                dev_default_config;

  uint32_t                dev_config_status; 

  USBD_SpeedTypeDef       dev_speed; 

  USBD_EndpointTypeDef    ep_in[15];

  USBD_EndpointTypeDef    ep_out[15];  

  uint32_t                ep0_state;  

  uint32_t                ep0_data_len;     

  uint8_t                 dev_state;

  uint8_t                 dev_old_state;

  uint8_t                 dev_address;

  uint8_t                 dev_connection_status;  

  uint8_t                 dev_test_mode;

  uint32_t                dev_remote_wakeup;

 

  USBD_SetupReqTypedef    request;

  USBD_DescriptorsTypeDef *pDesc;

  USBD_ClassTypeDef       *pClass;

  void                    *pClassData;  

  void                    *pUserData;    

  PCD_HandleTypeDef       *pData;    

} USBD_HandleTypeDef;


推荐阅读

史海拾趣

Exar [Exar Corporation]公司的发展小趣事

Exar始终注重通过收购和合并来增强自身的技术实力和市场竞争力。例如,2012年Exar收购了Integrated Memory Logic Limited(iML),这一举措加强了其在存储和数据管理领域的地位。通过收购iML,Exar获得了更多的技术资源和市场份额,为其后续的发展提供了有力支持。

Amphion Semiconductor Ltd公司的发展小趣事

进入21世纪后,数字视频应用的兴起为Exar提供了新的发展机遇。为了抓住这一机遇,公司在2000年推出了视频处理器和编解码器产品。这些产品不仅满足了市场对高质量视频处理的需求,也进一步巩固了Exar在通信和视频处理领域的地位。

EMC Component Group公司的发展小趣事

2017年,Exar被MaxLinear公司收购,这是Exar发展历程中的一个重要里程碑。通过合并,Exar和MaxLinear的产品和技术得到了有效整合,两家公司在模拟和混合信号领域的优势得到了进一步加强。合并后的公司继续在通信、视频处理、存储、电源管理和时钟管理等多个领域发挥重要作用。

DOMINANT公司的发展小趣事

在LED产业蓬勃发展的背景下,统明亮(DOMINANT)公司在2000年应运而生。它的诞生源于欧司朗(OSRAM)在马六甲工厂的分拆,加上马来西亚财团的加持,这家新公司迅速崭露头角。统明亮公司从成立之初就专注于LED技术的研发和生产,凭借其卓越的技术实力和创新能力,逐渐在电子行业中树立了良好的口碑。经过数年的不懈努力,统明亮在全球贴片式LED领域取得了领先地位,特别是在车用LED封装领域,其产品质量和技术水平均处于行业前列。

FOTEK公司的发展小趣事

进入21世纪,福禄克通过一系列精明的并购活动,实现了业务的快速扩张。2000年,公司成功收购了Wavetek Wandell Goltermann的精密测量部门,这次并购不仅增强了福禄克在电气校准市场的竞争力,还为其带来了丰富的技术专利和客户资源。此后,福禄克继续通过并购方式,进入新的技术领域和市场领域,不断拓宽其业务范围。

Fronter Electronics Co Ltd公司的发展小趣事

近年来,面对全球数字化转型的浪潮,Fronter电子积极拥抱变化,加快推进公司的数字化转型。公司建立了完善的信息化管理系统,实现了从采购、生产到销售等各个环节的数字化转型。同时,Fronter电子还加强了与国际市场的联系与合作,通过跨境电商、海外建厂等方式进一步拓展国际市场。在全球化的战略指引下,Fronter电子正逐步成为具有国际影响力的电子元器件供应商和服务商。

以上五个故事基于Fronter电子的发展历程和一般发展规律构建而成,旨在展现其在电子行业中的成长轨迹和发展成就。请注意,由于具体细节可能因实际情况而有所不同,以上故事仅为构想性内容。

问答坊 | AI 解惑

89C51

本帖最后由 paulhyde 于 2014-9-15 09:33 编辑 89C51FDBDFBDGD  …

查看全部问答>

关于PWM控制的全桥逆变 有IC没

请问有没有全桥逆变的IC模块 通过PWM控制的 及单极性SPWM控制算法…

查看全部问答>

使用82541网卡,CF卡启动,FTP无法下载vxworks映像

使用82541网卡,CF卡启动,FTP下载vxworks映像 启动后出现: kattached tcp/ip interface to warning:no netmask specified attaching net work interface lo0......done  (这里应该表明网卡配置正确) loading........ error load ...…

查看全部问答>

有没用TVP5147做解码芯片的?我配置出来的效果很不好,怎么改进啊?!谁有优化后的参数表?

有没用TVP5147做解码芯片的?我配置出来的效果很不好,怎么改进啊?!谁有优化后的参数表?…

查看全部问答>

vxworks源码和tornado的target目录的问题

刚开始接触vxworks,现在在学习END驱动,看到tornado的target目录下的src里面有个文件是templateEnd.c,有点不明白这里面的代码和vxworks源码里面的MUXDevLoad的关系是怎么样的,是否在templateEnd.c里面提供的模板供我们在特定的芯片开发时按照上 ...…

查看全部问答>

求CRC校验程序

现有电脑与单片机串口通讯数据 请大侠求证CRC校验方法 多谢 发送: A5 A5 00 1E 00 00 01 35 CA EC A5 A5 00 1E 00 01 01 35 FA DB A5 A5 00 1E 00 02 01 35 AA 82 A5 A5 00 1E 00 03 01 35 9A B5 A5 A5 00 1E 00 04 01 35 0A 30 A5 A5 00 ...…

查看全部问答>

wavecom,at串口访问,ring 能出现在命令与应答中吗?

wavecom,at串口访问,如果2个命令间隔时间短,会出现这样情况: 命令1  命令2  应答2  应答1 如果同时出现其他数据,如ring,问一下 (1) 命令1  命令2  ring  应答2   ...…

查看全部问答>

PC5设为外部中断时中断号选哪个?

PC5设为外部中断时中断号应该选啥( NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;)…

查看全部问答>

安捷伦开关电源

不多说了,直接上图:                      …

查看全部问答>