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

发布者:哈哈哈33最新更新时间:2018-09-12 来源: eefocus关键字:STM32L0  编译  USB驱动 手机看文章 扫描二维码
随时随地手机看文章

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


关键字:STM32L0  编译  USB驱动 引用地址:STM32L0开发笔记4: 解决使用--CPP11编译USB驱动报错问题

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

推荐阅读最新更新时间:2024-03-16 16:13

用arm-linux-gcc.4.3.2交叉编译编译linux-3.0.1内核
1.我这里的内核是forlinx 的FORLINX_linux-3.0.1.tar.gz内核,把这个文件准备好(拷贝到 linux os 的forlinx文件夹下面),这个文件不小117M,用xftp花费了我20秒时间。 2.然后解压缩 命令tar zxf FORLINX_linux-3.0.1.tar.gz, 这里我看出来了已经解压缩成功了 在编译内核之前,我先安装一个工具可能会用到,那就是libncurses5方便使用make menuconfig 命令,执行命令即可:apt-get install libncurses5-dev 下面就是编译内核过程了,之前见别人编译的时间挺长的,我倒要看看需要多少时间。 执行命令
[单片机]
用arm-linux-gcc.4.3.2交叉<font color='red'>编译</font>器<font color='red'>编译</font>linux-3.0.1内核
STM32开发笔记74: STM32L0低功耗唤醒后的时钟选择
本文介绍STM32L0系列单片机低功耗唤醒后的时钟选择。 参看已有的低功耗例程,发现都使能了HSI时钟,一致没有深究其中的具体原因,今天把它搞明白了,现记录如下: 先看一下,使能低功耗的函数: void CTarget::EnableLowPower(void) { HAL_PWREx_EnableUltraLowPower(); HAL_PWREx_EnableFastWakeUp(); __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI); DisableAllIO(); } 第1句使能超低功耗,第2句使能快速唤醒,第3句选择唤醒后的主始终,第4
[单片机]
STM8在IAR创建工程后编译时出现Error[Li005]
STM8L在IAR中创建工程后,因为是新手,创建工程后编译出现以下错误: Error : no definition for GPIO_Init 原因是库文件添加不全,因只是用USART、I2C等功能,其余的库文件因不熟悉环境漏掉了关联的库文件导致编译错误。 如不太熟悉库文件,建议全部加载上。
[单片机]
Linux之ARM(IMX6U)裸机C语言LED驱动实验--驱动编写,编译
简介 在开始部分用汇编来初始化一下 C 语言环境,比如初始化 DDR、设置堆栈指针 SP 等等,当这些工作都做完以后就可以进入 C 语言环境,也就是运行 C 语言代码,一般都是进入 main 函数。所以我们有两部分文件要做: ①、汇编文件 汇编文件只是用来完成 C 语言环境搭建。 ②、C 语言文件 C 语言文件就是完成我们的业务层代码的,其实就是我们实际例程要完成的功能 1.汇编文件初始化C语言运行环境 设置处理器进入 SVC 模式 以前的 ARM 处理器有 7 种运行模型:User、FIQ、IRQ、Supervisor(SVC)、Abort、Undef和 System,其中 User 是非特权模式,其余 6 中都是特
[单片机]
Linux之ARM(IMX6U)裸机C语言LED驱动实验--驱动编写,<font color='red'>编译</font>
STM32的曼彻斯特编译码系统设计
引言 由于曼彻斯特(MancheSTer)编码具有传输时无直流分量,时钟提取方便等特点,被广泛地应用于以太网、车辆总线、工业总线中。现在工程上常用的曼彻斯特编译码芯片为HD-6408和HD-6409,但是这种芯片有一些不足。首先,该芯片在传输速率和每帧数据中的有效位数等方面都做了严格的限制。其次,使用该芯片需要增加额外的硬件电路,提高了系统成本。使用FPGA做曼彻斯特编译码成本高,而且开发周期长。本文提出了一种基于STM32F103RET6的编译码系统方案,利用了STM32F103RET6强大的定时器功能,采用灵活的编译码方式,传输速率和数据帧格式都可以根据需要完全自行定义。 STM32F103RET6自带DMA的功能使得
[单片机]
STM32的曼彻斯特<font color='red'>编译</font>码系统设计
基于MPC5744P的MACL和EB的开发编译和配置
摘要 本篇笔记主要记录基于MPC5744P的MACL和EB的开发编译和配置。 准备工作 准备好一个在EB下配置好的工程,这里以例程为例子来说明 安装配置好编译器GreenHills或者其他编译器,这里以GreenHills为例。 导入例程 打开EB工具,导入例程,点file- import 按照路径导入就可以。我这里已经导入 编译工程: 生成的配置代码在EB中配置的文件下,这里是工程的output文件夹。 这是根据AUTOSAR 4.0.3 生成的代码。将这些代码与上层代码编译就可以使用了,这里就与例程的应用代码一起使用命令行编译。 先看一下例程文件夹 工具链文件夹toolchains 包含 如果工
[单片机]
基于MPC5744P的MACL和EB的开发<font color='red'>编译</font>和配置
avr单片机的编译器介绍
avr的编译器比较多,avr studio、iccavr、cvavr、winavr、iar,开始用的是studio+winavr,好像大多数人都这样用,我后来做多文件编译感觉很不方便,好像要修改makefile。后来就用了iar,很好使,这个软件公认最方便,但也是收费最高,我们这些新手也就是捡一些以前的破解版用用。 iar可以生成各种可执行文件,比如ubrof .d90,可以在proteus仿真中进行源码级调试,很方便。 无论用哪种编译器,代码思想是一致的,移植时只要稍加修改即可。
[单片机]
avr单片机的<font color='red'>编译</font>器介绍
迎接纳米科技时代的到来  ARM推出先进嵌入式内存测试与修复系统
emBISTRx BIST/BISR解决方案全面优化内存子系统空间 并提供更高的芯片良率与测试品质   ARM 于今(24)日宣布推出新款先进emBISTRx 嵌入式内存测试与修复系统。该系统与ARM Advantage及Metro内存编译器紧密整合,而该两项内存编译器均为Artisan实体层IP系列中的一员。此款ARM推出的全工嵌入式内存子系统,整合了内建自我测试(Best-in-Self-Test, BIST)及内建自我修复(Best-in-Self-Repair, BISR)IP,使Advantage与Metro系列内存在迈入45纳米、65纳米及90纳米制程时,能提高整体芯片良率、降低芯片成本、提高获利
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved