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

发布者:collectors最新更新时间: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驱动  报错问题 引用地址:STM32开发笔记17: 解决使用--CPP11编译USB驱动报错问题

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

推荐阅读最新更新时间:2024-11-18 23:15

STM32时钟分解与解析
  学习STM32的同学知道,STM32有好多时钟,如32.768Khz,8Mhz,被时钟树搞迷糊了,下面一一解析。   HSE:高速外部时钟信号(4--16Mhz 常用的为8Mhz)   HSI:高速内部时钟信号(8Mhz)   LSI:低速内部时钟信号(在30kHz和60kHz之间,约40Khz)   LSE:低速外部时钟信号(32.768Khz)   这些时钟到底有什么用呢?大致可以分为两块:   1、系统时钟:   系统时钟主要有下面三种时钟源可提供,其中PLL时钟源有HSI(高速内部时钟)或HSE(高速外部时钟)提供   (1) HSI(高速内部时钟)振荡器时钟   (2)HSE(高速外部时钟)振荡器时钟   (3)P
[单片机]
stm32电机驱动与测速
  通过实验发现,定时器的一个通道控制一个pwm信号。   PWM驱动电机不需要中断。   ① timer.h:   #ifndef __TIMER_H   #define __TIMER_H   #include “sys.h”   void TIM3_PWM_Init(u16 arr,u16 psc);   #endif   ② timer.c:   #include “timer.h”   #include “led.h”   void TIM3_PWM_Init(u16 arr,u16 psc)   {   GPIO_InitTypeDef GPIO_InitStructure;   TIM_TimeBaseInitT
[单片机]
基于STM32数据采集器的设计
  数据采集技术在工业、航天、军事等方面具有很强的实用性,随着现代科技发展,数据采集技术在众多领域得到了广泛的应用和发展。同时对数据采集器的精度、抗干扰能力、安全和通信兼容等方面提出了更高的要求。基于上述要求提出了一种基于STM32F101 的数据采集器的设计方案,该数据采集器使用MODBUS 协议作为RS485 通信标准规约,信号调理电路与STM32F101 的AD 采样通道之间均采用硬件隔离保护,可同时采样3 路DC0-5V 电压信号、3 路DC4-20mA 电流信号和6 路开关量输入信号,实验证明本数据采集器具有较高的测量精度,符合工业现场应用需求。   信号采集主要包括电压信号、电流信号、频率信号以及开关量信号,随着现代
[单片机]
基于<font color='red'>STM32</font>数据采集器的设计
STM32开发环境(3)----下载调试
下载调试 STM32 程序下载主要有两种方法:串口和JLINK。串口下载也可以扩展为USB,JLINK支持JTAG、 SWD。 STM32 的串口下载一般是通过串口 1 下载的,使用USB下载其实也是应用这种方式。只是要在PC端下载USB转串口的驱动,在硬件端加一片USB转串口的片子。USB转串口的片子常用的是CH340,在PC端下端其驱动程序就可。另外还需使用STM32串口下载软件,受正点原子影响我使用FLYMCU,这个软件好用、易用,打开就能知道怎么用。该软件可以在 www.mcuisp.com 免费下载。 特别提醒:不要选择使用 RamIsp,否则,可能没法正常下载。 需要在线调试时,JTAG
[单片机]
<font color='red'>STM32</font>开发环境(3)----下载调试
详解STM32单片机堆栈
学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。 对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区: 栈区(stack) 堆区(Heap) 全局区(static) 文字常亮区程序代码区 程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。 栈是从高到低分配,堆是从低到高分配。 普通单片机与STM32单片机中堆栈的区别 普通单片机启动时,不需要用b
[单片机]
详解<font color='red'>STM32</font>单片机堆栈
STM32串口通信printf重定向方法
在源程序中加入如下代码,包含“stdio.h”。 默认使用USART1,确认串口已经初始化成功、 #pragma import(__use_no_semihosting) _sys_exit(int x) { x = x; } struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; /*
[单片机]
基于STM32的NB-IoT模块驱动
一、概述 目前这个NB-IoT在国内还是比较火的,最近刚好使用了一款NB-IoT模块。将驱动程序贡献给大家。希望能对用到的朋友有点帮助。 二、NB-IoT模块介绍 本次采用的是有人物联网公司的WHNB75模块。(支持电信网络)WH-NB75 是基于 WH-NB73 模块开发出来的 DIP 封装的模块产品,该产品能够更方便的嵌入到客户产品中。WH-NB75 是我们 NB75 模块系列的一个总称,针对不同运营商网络有不同的模块型号对应。请在选购模块时注意选择支持当地运营商的模块。稳恒正在基于海思 Hi2115 芯片打造支持全频段的 NB 模组 WH-NB71,到时候可以一款模块支持多家运营商的网络。下表为不同型号产品对应的运营商。
[单片机]
STM32 CAN模块使用详解
STM32 CAN模块使用详解.重点介绍以STM32F103E系列芯片为基础介绍CAN 总线的使用方法。CAN 总线在控制领域使用的非常广泛,如今大多数CPU芯片外围都扩展CAN接口。 1. 硬件基础 CAN总线工作需要两根数据线,RX和TX,即为输入总线和输出总线。一般CPU与外界通信需要接一个驱动芯片(这点很像UART接口),常用的CAN芯片主要有:SN65VHD230、PCA82C250T等,本系统使用SN65VHD230作为CAN接口芯片。而CPU提供的CAN接口为CAN_L和CAN_H。 2. 软件设计 在进行软件设计时,我们首先来看这样的一个结构体: typedef struct { uint32_t StdId;
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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