发新帖我要提问
12
返回列表
打印
[STM32F1]

急!STM32F105RC编译报错:lr未定义

[复制链接]
楼主: 无为之益
手机看帖
扫描二维码
随时随地手机跟帖
21
无为之益|  楼主 | 2016-10-10 09:57 | 只看该作者 回帖奖励 |倒序浏览
yklstudent 发表于 2016-10-9 16:04
keil下的不是这样的嘛;
void HardFault_Handler(void)
{

我这个stm32f10x_it.c文件是采用CoIDE下的,因为具体项目用到很多中断应用。就变成这样的了

使用特权

评论回复
22
无为之益|  楼主 | 2016-10-10 10:00 | 只看该作者
xmshao 发表于 2016-10-9 17:16
问题应该出在不同环境下文件交织在一起了。

参考6楼建议,基于MDK先建立个编译OK的模板工程,然后将自己的 ...

谢谢,我考虑一下

使用特权

评论回复
23
无为之益|  楼主 | 2016-10-10 10:01 | 只看该作者
Xflyan 发表于 2016-10-9 21:34
汇编的移植都是平台相关的,你把这段汇编COPY到一个 .s文件下去编译试试,看看有没有出错 ...


谢谢提供思路。我这个汇编已经改成keil平台下的了,CoIDE下的不完全这样

使用特权

评论回复
24
无为之益|  楼主 | 2016-10-10 10:02 | 只看该作者
皈依 发表于 2016-10-9 21:44
不同的平台编译的文件不一样哦

是的

使用特权

评论回复
25
无为之益|  楼主 | 2016-10-10 10:04 | 只看该作者
john_lee 发表于 2016-10-9 22:17
你说 lr 只在启动文件中出现,但 stm32f10x_it.c 文件中怎么也有?这个文件是 CoIDE 带来的? lr 是 r14 寄 ...

报错在stm32f10x_it.c 文件中,另外搜索到只有启动文件出现过一次,就是整个项目中只有 2个地方 用到它。我把它改成r14也不行,以前试过。谢谢你

使用特权

评论回复
26
无为之益|  楼主 | 2016-10-10 10:07 | 只看该作者
john_lee 发表于 2016-10-9 22:24
要是我的话,我会**用 GCC,要移植的话也是反过来移植(MDK->GCC),我觉得 GCC 比 MDK 好多了,不知道你 ...

因为我做的功能只是整个产品的一部分功能,要和其他的工程师程序一致比较好。所以被要求改成 keil。
另外,CoIDE环境我也不熟悉,遇到问题,可以请教交流的也少

使用特权

评论回复
27
songchenping| | 2016-10-10 10:27 | 只看该作者
相信KEIL都有各自厂商对应芯片的工程模板。

使用特权

评论回复
28
无为之益|  楼主 | 2016-10-10 16:35 | 只看该作者
xmshao 发表于 2016-10-9 17:16
问题应该出在不同环境下文件交织在一起了。

参考6楼建议,基于MDK先建立个编译OK的模板工程,然后将自己的 ...

我今天新建了一个项目空模板,先编译通过后,把源代码全部copy过来,结果还是只剩下这么一个error,无语

使用特权

评论回复
29
无为之益|  楼主 | 2016-10-10 16:36 | 只看该作者
songchenping 发表于 2016-10-10 10:27
相信KEIL都有各自厂商对应芯片的工程模板。

工程模板的建立操作是没问题的,这个会

使用特权

评论回复
30
xmshao| | 2016-10-11 17:52 | 只看该作者
无为之益 发表于 2016-10-10 16:35
我今天新建了一个项目空模板,先编译通过后,把源代码全部copy过来,结果还是只剩下这么一个error,无语 ...

你没有把那个COIDE的启动文件拷过来吧。
你的源代码有嵌入汇编语句吗?

使用特权

评论回复
31
无为之益|  楼主 | 2016-10-12 09:36 | 只看该作者
本帖最后由 无为之益 于 2016-10-12 09:44 编辑
xmshao 发表于 2016-10-11 17:52
你没有把那个COIDE的启动文件拷过来吧。
你的源代码有嵌入汇编语句吗?

我把CoIDE下的stm32f10x_it.c文件中的硬错误中断屏蔽掉了
/*void HardFault_Handler(void)
{
        { __asm volatile(        " tst lr, #4 \n"
                                                " ite eq \n"
                                                " mrseq r0, msp \n"
                                                " mrsne r0, psp \n"
                                                " ldr r1, [r0, #24] \n"
                                                " ldr r2, handler2_address_const \n"
                                                " bx r2 \n"
                                                " handler2_address_const: .word pop_registers_from_fault_stack \n" );
        //Go to infinite loop when Hard Fault exception occurs
        }
  // Go to infinite loop when Hard Fault exception occurs
  while (1)
  {
  }
}*/
把启动文件(是keil下的)startup_stm32f10x_cl.S中对应的程序改成如下:
HardFault_Handler\
                PROC
              ;  EXPORT  HardFault_Handler          [WEAK]
              ; B       .
                IMPORT pop_registers_from_fault_stack  
                TST LR, #4  
                ITE EQ  
                MRSEQ R0, MSP  
                MRSNE R0, PSP  
             ;   LDR R1, [R0, #24]
             ;   LDR R2, _handler2_address
             ;   BX R2
;_handler2_address:        
                B pop_registers_from_fault_stack
                ENDP

编译后没有再报lr的错误了(还有其他几个错误,今天应该都能改好,因为是不同格式引起重复定义报错)。
我不知道ARM汇编的程序标号怎么写,所以源代码中的这3句给屏蔽掉了,否则报错
  ;   LDR R1, [R0, #24]
             ;   LDR R2, _handler2_address
             ;   BX R2
;_handler2_address:        
也就是说,我可能没有完全正确移植吧。请教你这几句该如何正确书写呢?谢谢 !
备注:其实就是 ;   LDR R2, _handler2_address
;_handler2_address:  这2句报错


使用特权

评论回复
32
江成88| | 2017-3-22 19:55 | 只看该作者
ARM启动文件分为gcc 的还有iar 的还有mdk的,你只要将COIDE的启动文件换成MDK的启动文件就好了。在固件库中有的。 至于这样hard default 的话,直接用mdk 中的就行了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则