项目希望使用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开发笔记5: STM32CubeMX中Debug Serial Wire的设置问题
下一篇:STM32L0开发笔记3: 使用静态库加快Keil编译速度
推荐阅读
史海拾趣
Hoffman Engineering始终将技术创新视为公司发展的核心驱动力。公司不断投入研发资源,推动产品迭代升级。在机柜系列产品中,Hoffman Engineering通过引入先进的设计理念和生产工艺,不断提升产品的性能和质量。同时,公司还积极关注行业动态和客户需求变化,及时调整产品策略和市场布局。这种持续的技术创新和产品迭代,使Hoffman Engineering在激烈的市场竞争中保持领先地位。
E.ON集团的前身可以追溯到1999年,当时德国的两个能源巨头VEBA和VIAG宣布计划在2000年合并。这一合并标志着E.ON的诞生,成为德国乃至欧洲的重要能源公司。合并后,E.ON迅速崭露头角,通过整合双方的资源和优势,迅速占据了德国及欧洲能源市场的重要位置。
随着数字化技术的快速发展,数字化转型已经成为企业提升竞争力的关键。Datakey Electronics紧跟时代潮流,积极推进数字化转型。公司引进先进的信息化管理系统和智能化生产设备,实现了生产过程的自动化和智能化。这不仅提高了生产效率和产品质量,还降低了生产成本和能源消耗。通过数字化转型,Datakey Electronics在激烈的市场竞争中保持了领先地位。
以上这些故事都是基于电子行业的一般发展趋势和可能的情况虚构的,但从中我们可以看到Datakey Electronics公司可能经历的一些发展历程。希望这些故事能够为您提供一些参考和启发。
BOPLA公司成立于XXXX年,初期主要致力于电子开关、熔断器等基础电子元件的研发与生产。创始人凭借对电子行业的深厚理解和敏锐的市场洞察力,带领公司逐步在竞争激烈的市场中站稳脚跟。通过不断的技术创新和品质提升,BOPLA的产品逐渐获得了客户的认可,为公司后续的发展奠定了坚实的基础。
随着全球化进程的加速,富致科技也积极实施国际化战略。公司不仅在欧洲、北美等地设立了销售和服务网络,还通过参加国际展会、建立海外研发中心等方式,不断提升品牌影响力和市场竞争力。同时,富致科技还注重与全球顶尖企业和研究机构的合作,共同推动PPTC技术的创新与发展。
随着公司规模的不断扩大和市场份额的增加,Allianc公司开始关注社会责任和可持续发展。公司积极参与公益事业和环保活动,努力为社会做出贡献。同时,公司还加强了对产品环保性能的研发和改进,推出了多款符合环保标准的产品。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。
这五个故事虽然是虚构的,但它们反映了电子行业中一个成功公司可能经历的一些关键阶段和挑战。希望这些故事能够满足您的需求,并为您了解电子行业提供一定的参考。
FBIP1553FT ——高可靠容错MIL-STD-1553A/B总线控制器IP核 1.遵循MIL-STD-1553A/B标准,支持MIL-STD-1553A/B规定的全部协议 2.可由软件配置为BC、BM或者RT 3.寄存器操作同BU6158X完全兼容 4.采用容错设计,大大提高总线控制器可靠性 可纠正存 ...… 查看全部问答∨ |
|
我在安装ActiveSync的时候出了个错,错误提示为“写入文件时出错:C:\\Program Files\\Microsoft ActiveSync\\wcesmgr.exe,请验证您有权访问该目录” 请问这是怎么回事,我重启过机器,还是不行,并且我用的就是administrator账户,在其他的机子上 ...… 查看全部问答∨ |
开发CASIO IT500 (WinCE4.1)和电脑通讯的程序,需要哪些东西 我是个新手 我要在CASIO it500上开发一个软件, 请问 1:用VS2005,可以么? 2:开发语言用c#,it500支持吧? 3:开发这个软件,好像不能用虚拟机吧,因为it500有扫描功能,vs2005自带的虚拟软件,没有扫描功能。 4:和PC通讯,需要学习那些 ...… 查看全部问答∨ |
用STM32产生PWM波时,将刹车信号设置成高电平有效,则不管刹车输入端是0还是1都会跳入刹车中断程序中。如若将刹车信号设置成低电平有效,则不管刹车输入端是0还是1都不会跳入刹车中断程序中。 设计时再刹车引脚上加了下拉电阻。。。 初学 ...… 查看全部问答∨ |
|
TSP技术通过允许用户使用标准的PC控制或者创建在仪器内的微处理器上执行的嵌入式测试脚本,增强了仪器控制。通过使用TSP测试脚本而非PC用于仪器控制,能够避免PC控制器和仪器之间的通信延迟,这提高了测试产能。测试脚本可以包含数学和判决规则, ...… 查看全部问答∨ |
Orcad Capture CIS删除一个元件后自动编号,导入网表到allegro出现DRC 例如我画了10个电阻,编号为R1~R10,allegro里面已经画好连线了。然后在原理图把R5给删除了,重新自动编号,然后导入网表,原先的R7变成了R6,占用了原先R6的位置,然后就提示DRC错误了。请问这种情况怎么处理。谢谢。… 查看全部问答∨ |