STM32开发笔记17: 解决使用--CPP11编译USB驱动报错问题

2019-07-17来源: eefocus关键字:STM32  CPP11编译  USB驱动  报错问题

单片机型号:STM32L053R8T6


    项目希望使用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;



关键字:STM32  CPP11编译  USB驱动  报错问题

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic468247.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32开发笔记18: STM32CubeMX中Debug Serial Wire的设置问题
下一篇:STM32开发笔记16: 使用静态库加快Keil编译速度

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

第8章 自己写库-构建库函数雏形—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx 中文参考手册》、《STM32F429规格书》虽然我们上面用寄存器点亮了 LED,乍看一下好像代码也很简单,但是我们别侥幸以后就可以一直用寄存器开发。在用寄存器点亮 LED 的时候,我们会发现 STM32 的寄存器都是 32 位的,每次配置的时候都要对照着《STM32F4xx参考手册》中寄存器的说明,然后根据说明对每个控制的寄存器位写入特定参数,因此在配置的时候非常容易出错,而且代码还很不好理解,不便于维护。所以学习 STM32 最好的方法是用软件库,然后在软件库的基础上了解底层,学习遍所有寄存器。8.1 什么是STM32函数库以上所说的软件库是指"STM32标准函数库",它是
发表于 2019-09-18
第8章 自己写库-构建库函数雏形—零死角玩转STM32-F429系列

第9章 初识STM32固件库—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx参考手册》、《STM32F4xx规格书》、《Cortex-M3权威指南》, STM32标准库帮助文档:《stm32f4xx_dsp_stdperiph_lib_um.chm》。在上一章中,我们构建了几个控制GPIO外设的函数,算是实现了函数库的雏形,但GPIO还有很多功能函数我们没有实现,而且STM32芯片不仅仅只有GPIO这一个外设。如果我们想要亲自完成这个函数库,工作量是非常巨大的。ST公司提供的标准软件库,包含了STM32芯片所有寄存器的控制操作,我们直接学习如何使用ST标准库,会极大地方便控制STM32芯片。9.1 CMSIS标准及库层次关系因为基于Cortex系列芯片采用的内核都是相同
发表于 2019-09-18
第9章 初识STM32固件库—零死角玩转STM32-F429系列

第14章 启动文件详解—零死角玩转STM32-F429系列

本章参考资料《STM32F4xx 中文参考手册》第十章-中断和事件:表 46. STM32F42xxx 和 STM32F43xxx 的向量表;MDK中的帮助手册—ARM Development Tools:用来查询ARM的汇编指令和编译器相关的指令。14.1 启动文件简介启动文件由汇编编写,是系统上电复位后第一个执行的程序。主要做了以下工作:1、初始化堆栈指针SP=_initial_sp2、初始化PC指针=Reset_Handler3、初始化中断向量表4、配置系统时钟5、调用C库函数_main初始化用户堆栈,从而最终调用main函数去到C的世界14.2 查找ARM汇编指令在讲解启动代码的时候,会涉及到ARM的汇编指令
发表于 2019-09-18
第14章 启动文件详解—零死角玩转STM32-F429系列

第15章 RCC—使用HSE/HSI配置时钟—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx中文参考手册》RCC章节。学习本章时,配合《STM32F4xx中文参考手册》RCC章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。RCC :reset clock control  复位和时钟控制器。本章我们主要讲解时钟部分,特别是要着重理解时钟树,理解了时钟树,F429的一切时钟的来龙去脉都会了如指掌。1.1 RCC主要作用—时钟部分设置系统时钟SYSCLK、设置AHB分频因子(决定HCLK等于多少)、设置APB2分频因子(决定PCLK2等于多少)、设置APB1分频因子(决定PCLK1等于多少)、设置各个外设的分频因子;控制AHB、APB2和APB1这三条总线时钟的开启、控制
发表于 2019-09-18
第15章 RCC—使用HSE/HSI配置时钟—零死角玩转STM32-F429系列

第16章 STM32中断应用概览—零死角玩转STM32-F429系列

本章参考资料《STM32F4xx 中文参考手册》第十章-中断和事件、《 ARM Cortex™-M4F 技术参考手册》-4.3 章节:NVIC和4.4章节:SCB—4.4.5的AIRCR。STM32中断非常强大,每个外设都可以产生中断,所以中断的讲解放在哪一个外设里面去讲都不合适,这里单独抽出一章来做一个总结性的介绍,这样在其他章节涉及到中断部分的知识我们就不用费很大的篇幅去讲解,只要示意性带过即可。本章如无特别说明,异常就是中断,中断就是异常,请不要刻意钻牛角尖较劲。16.1 异常类型F429在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。其中系统异常有10个,外部中断有91个。除了个别异常的优先级被定死外
发表于 2019-09-18
第16章 STM32中断应用概览—零死角玩转STM32-F429系列

第17章 EXTI—外部中断/事件控制器—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx中文参考手册》系统配置控制器以及中断和事件章节。上一章节我们已经详细介绍了NVIC,对STM32F4xx中断管理系统有个全局的了解,我们这章的内容是NVIC的实例应用,也是STM32F4xx控制器非常重要的一个资源。学习本章时,配合《STM32F4xx中文参考手册》系统配置控制器以及中断和事件章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。特别说明,本书内容是以STM32F42xxx系列控制器资源讲解。17.1 EXTI简介外部中断/事件控制器(EXTI)管理了控制器的23个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现
发表于 2019-09-18
第17章 EXTI—外部中断/事件控制器—零死角玩转STM32-F429系列

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved