stm32错误解释o.axf: Error: L60E: Symbol GPIO_InitStructure multiply defined (by httpd.o and main.o

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32错误解释o.axf: Error: L60E: Symbol GPIO_InitStructure multiply defined (by httpd.o and main.o相关的知识,希望对你有一定的参考价值。

什么意思,,,一定采纳。。。
。跪求解释。。。o.axf: Error: L6200E: Symbol GPIO_InitStructure multiply defined (by httpd.o and main.o).

udp_demo.c函数中的实参变量设置的是"unsigned char *" 形式,而strcpy(Udp_buff,uip_appdata)程序声明和定义中设置的是"char *restrict"类型,两者不一致。

你去程序当中,将他俩设置成一个类型再编译。

意思说的是:“无符号字符*”类型和参数“char *restrict”的类型是不兼容的。

STM32是基于ARM® Cortex® M 处理器内核的 32位闪存微控制器,为MCU用户开辟了一个全新的自由开发空间,并提供了各种易于上手的软硬件辅助工具。

STM32 MCU融高性能、实时性、数字信号处理、低功耗、低电压于一身,同时保持高集成度和开发简易的特点。

业内最强大的产品阵容,基于工业标准的处理器,大量的软硬件开发工具,让STM32单片机成为各类中小项目和完整平台解决方案的理想选择。按内核架构分为不同产品系列。

参考技术A GPIO_InitStructure 变量在httpd和main文件下重复定义。应该时在httpd.c和main.c文件下同时定义了名字为“GPIO_InitStructure”的全局变量。
解决方法:1修改变量名字,2全局变量改为局部变量或静态全部变量。
参考技术B “GPIO_InitStructure” 这个定义了多次,在httpd.c文件和main.c文件里都定义了。。。。希望对你有用本回答被提问者采纳

STMicro 是不是错误地解释了“影子寄存器”一词?

【中文标题】STMicro 是不是错误地解释了“影子寄存器”一词?【英文标题】:Does STMicro wrongly interpret the term "shadow register"?STMicro 是否错误地解释了“影子寄存器”一词? 【发布时间】:2017-06-08 08:14:48 【问题描述】:

我使用 STM32 系列微控制器,更具体地说是 STM32F7 系列。目前我正在研究通用计时器的使用。

关于双缓冲寄存器。

微控制器有时会使用双缓冲寄存器。这样,软件就可以对寄存器进行写入和读取,而不会造成麻烦。下图说明:

              buffered register:           active register:
                 --------------             --------------
                |   REGX_BUF   | <-------> |    REGX      |
                 --------------             --------------
                      |                           |
                      |                           |
                   SOFTWARE                    HARDWARE

         The software interacts        Updates to and from the
         only with the buffered        active register take place
         register.                     at specific moments (when it
                                       is 'safe').

         synonyms:                     synonyms:
           - buffered register            - active register
           - preload register
           - shadow register (?)

上图中REGX_BUFREGX 都有几个术语。

通常注册REGX被称为“活动注册”。 寄存器REGX_BUF 有时称为“缓冲寄存器”。其他术语是“预加载寄存器”和“影子寄存器 (?)”。

解释了混乱。

不幸的是,“影子寄存器”一词令人困惑。从我在互联网上的几个来源阅读的内容来看,它指的是REGX_BUF。但在 STM32F746 微控制器的参考手册 RM0385 和 STM32F767 微控制器的 RM0410 中,我偶然发现了对“影子寄存器”这个术语的完全相反的解释。它不会引用REGX_BUF,而是引用REGX。 这是参考手册中的图片:

RM0385 -> chapter 23 General-purpose timers -> 23.3.2 Counter modes -> Fig 199

RM0410 -> Chapter 26 General-purpose timers -> 26.3.2 Counter modes -> Fig 244

这个数字让我很困惑。是我对“影子寄存器”一词的理解有误,还是意法半导体在编写本参考手册时犯了错误?

【问题讨论】:

到底是什么问题? “X 的影子寄存器”是指“影子”或复制“X”值的寄存器。这张图准确地表明,影子寄存器跟随“自动预加载”的值,有一点时间延迟 从我在几个来源中看到的,“影子寄存器”是“预加载寄存器”的同义词:这是与软件交互的寄存器。 --- “活动寄存器”是与硬件交互的寄存器。 STMicro 手册中的图将术语“影子寄存器”解释为“预加载寄存器”的同义词,而是“活动寄存器”的同义词。所以我很困惑。 electronics.stackexchange.com/questions/86032/… 我知道,我已经阅读了这个问题。正是这个问题将术语“影子寄存器”等同于“预加载寄存器”。所以这与 STMicro 手册的做法相反。 【参考方案1】:

问题在于术语“影子寄存器”没有特定的和架构独立的含义。

例如,ARM 架构有一组通用寄存器,您可以写入和读取 (R0 - R12)。但是,如果进入中断处理程序上下文,R8 - R12 就会切换到“影子寄存器”。这意味着您仍然可以像在普通程序中一样对它们进行寻址,但是您访问的寄存器与您在普通程序中使用的 R8 - R12 完全不同。它们是专用的中断处理资源,因此您不必像往常一样处理保存和恢复寄存器。

一些 PIC 微控制器允许您对引脚 I/O 写入和读取同一地址,但实际上,您写入的缓冲区与读取的缓冲区不同,因为写入引脚不一定会改变它们的立即声明。此配置允许架构在等待更改引脚状态时缓冲您的写入请求。这些额外的缓冲区有时也称为影子寄存器,看起来与您的示例相似。使用您的示例中给出的术语,我想这将被称为“预加载寄存器”。

通常,该术语用于指代您可以以相同方式处理的多个硬件资源。其中哪个是“真实”寄存器,哪个是“影子”寄存器在架构和供应商之间并不一致,最终也可能不是很重要。

【讨论】:

非常感谢。这个答案澄清了这个问题:-)【参考方案2】:

实际上 ST 定义了它的标准:(General Timer Cookbook 的第 14 页)

活动寄存器实例(也称为影子寄存器实例):它的内容是 定时器外设逻辑用于生成定时器通道输出波形。 预加载寄存器实例:这是软件访问的寄存器实例 当相关寄存器的预加载功能启用时。

原始文档为 ST AN4776 Application note - 可以找到here

【讨论】:

【参考方案3】:

我已经总结了以上所有的问题和答案: 微控制器有时会使用双缓冲寄存器。这样,软件就可以对寄存器进行写入和读取,而不会造成麻烦。下图说明:

             buffered register:           active register:
             --------------             --------------
            |   REGX_BUF   | <-------> |    REGX      |
             --------------             --------------
                  |                           |
                  |                           |
               SOFTWARE                    HARDWARE

     The software interacts        Updates to and from the
     only with the buffered        active register take place
     register.                     at specific moments (when it
                                   is 'safe').

     synonyms:                     synonyms:
       - buffered register            - active register
       - preload register
       - shadow register (?)

在某些手册中,“影子寄存器”是“预加载寄存器”的同义词:这是与软件交互的寄存器。 --- “活动寄存器”是与硬件交互的寄存器。 STMicro 手册中的图将术语“影子寄存器”解释为“预加载寄存器”的同义词,而是“活动寄存器”的同义词。 但是,ST 定义了它的标准:(General Timer Cookbook 第 14 页)

    活动寄存器实例(也称为影子寄存器实例):其内容被定时器外设逻辑用于生成定时器通道输出波形。 预加载寄存器实例:这是当相关寄存器的预加载功能启用时软件访问的寄存器实例。

所以,问题在于术语“影子寄存器”没有特定的和架构独立的含义。通常,该术语用于指代可以以相同方式寻址的多个硬件资源。其中哪个是“真实”寄存器,哪个是“影子”寄存器在架构和供应商之间并不一致,最终也可能不是很重要。

【讨论】:

您好,Narcissus,感谢您的回答。由于我不是微控制器架构方面的专家,因此我不太了解此答案中添加的独特之处。也许如果您在顶部突出显示了独特的方面。例如“我认为将以前的答案整合成更易于理解的东西会很有用。”或者“我认为以前的答案错过了一个有价值的观点。”

以上是关于stm32错误解释o.axf: Error: L60E: Symbol GPIO_InitStructure multiply defined (by httpd.o and main.o的主要内容,如果未能解决你的问题,请参考以下文章

stm32编译时出现 error: #35: #error directive: "Please select first the target STM32F10x device used

System Workbench STM32 Eclipse 上的 ERROR_DOWNLOAD_TASK_START_ISSUE

keil编译STM32工程时 #error directive: "Please select first the target STM32F10x device used in your

uVision Keil STM32调试“***错误57:非法地址(0x08000000)”时出错

STM32编译错误,初学者求指点

修复可能由于 STM32 Nucleo-F334R8 上的 malloc 导致的内存覆盖错误