你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32使用MDK开发中的一些常见问题

[复制链接]
pwdzsj 发布时间:2015-10-18 15:48

解决:keil报错invalid redeclaration of type name "s32"

答案:一般在Target Options C/C++选项卡里的Include Paths 里要添加几个固定的头文件路径,

..\CMSIS\CM3\CoreSupport
# `$ U7 j$ K9 l..\CMSIS\CM3\DeviceSupport\ST\STM32F10x& b1 H, ^) P! g
..\STM32F10x_StdPeriph_Driver\inc
0 }5 `9 j0 f# z) a7 \/ R6 ~..\user\inc

& k; [' m2 @* L* C  k

是头文件路径问题,KEIL只要有一个头文件找不到,就会自已从本身的INC文件夹找头文件,结果就会出现以上错提示。把老版的头文件改为STM32F10X.H.

新的库已经把.CONF.MAP.TYPE都已经去掉整合到STM32F10X.H当中
' f8 s1 ~8 G2 P1 U2 Z


7 g- A( q5 Y) g) L% z% R


9 r8 @/ Y# U" R# Q- a

工程中包含了老版本的头文件,包含stm32f10x_lib.h这个文件 ,将该头文件改为STM32F10X.H.

- D' ~' q8 L, z8 M, ]8 h3 d
2.STM32_TEST.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o).
此问题错误提示已经十分清楚的告诉你错在哪里了,Undefined symbol SystemInit ,翻译过来就是:SystemInit 这个符号没有定义,随后的小括号告诉你了,是在startup_stm32f10x_md.o这个文件里面被提及的,这个.o文件在工程里面并没有,它是一个在编译的时候根据.c/.s文件生成的。所以我们只需要找到工程里面的.s或者.c即可,这里对应这个名字的就是startup_stm32f10x_md.s了。6 ]$ W; ~: c- c. @9 b/ z3 k' F) N* U

: Q% U( T9 q) ?# o# E' \8 k: I- f: G   在此文件里面可以找到SystemInit的所在:+ W) P& K! O5 M/ m8 O
Reset_Handler    PROC4 r$ E# B1 L! n6 R
                 EXPORT  Reset_Handler             [WEAK]; B" Z/ H0 J  n, M. X
     IMPORT  __main
7 I3 I! E! B8 s6 K+ j5 Q     IMPORT  SystemInit1 }% G  L' i. [, M& n5 j
                 LDR     R0, =SystemInit
  Y, S9 R1 W& T* O0 n7 n1 A4 P3 ?                 BLX     R0  Z- A* Y7 l! L% x
                 LDR     R0, =__main
; G( @4 x; `& H; c( x8 K1 _! [                 BX      R05 C) T. M! t3 S  g9 I$ U
                 ENDP/ e2 A5 _) A# V' D) \* V
  
原来在复位中断服务函数里面,调用了SystemInit这个函数,而这个函数在.s文件里面没有定义。
9 d6 p& s: d; O- `, _/ P    所以解决的办法有两个。6 \" e2 I# g4 t; ~/ N
   1,在外部(其他任何.c文件里面)定义SystemInit这个函数,哪怕是个空函数也可以。
& z  X5 ?" k, n$ b' Q0 ?$ ~   2,把                4 [, s! X2 V+ L& f" n! h4 m4 D  Q% ~; D
                 LDR     R0, =SystemInit# O3 g7 e2 X7 C% \' w5 ^
                 BLX     R0

. m" h- V0 N9 W3 g      这两句话去掉。
(当使用Libraries里面的startup文件时,出现的问题。我采用的1解决办法,顺利解决问题)
) g' l4 j7 R. j3 N- O
3.。。HardFault_Handler的调试 最简单的办法:
; l: b& r& I5 A3 f; K9 j. A( l- @* _. n
在进入HardFault_Handler之后,根据堆栈指针查看堆栈,找到堆栈中最新的函数返回地址,到这个地址上去加断点,一步步根据汇编执行代码。很快就能找到出错原因,大多数是数组溢出,或者是指针初始化的问题。
出现此问题,肯定是堆栈溢出和数组越界。
(有时可能是因为。s启动文件,对stack和heap设置的太小,需要自己手动设置变大,就不会出现此问题。我就是将
原来的0x400和0x200增大到0x2000和0x2000)
(今天经过高人指点,对于此问题又找到原因:潜入式库函数里的malloc,没有垃圾回收机制,因为我是裸奔,没有
系统支持,所以malloc对内存并没有明确的机制,也就是说,他分配的内存很可能是有问题的,造成溢出等。所以原来
。s文件默认的堆栈大小,都很小,很容易就溢出。 现在只需将malloc函数申请的内存,使用数组代替,即可。)

9 A! S- X+ M( \% x8 c' G. h) a# M6 ~
4.问题 "No Cortex-M Device found in JTAG chain"或“Emulator has been changed or re-enumerated!”
原因:烧录的程序关闭了JTAg功能,复用了JTAG的接口,导致JTAG不能正常使用。这事,就需要使用串口下载一个
程序,此程序没有关闭JTAG即可,然后就可以正常重新使用JTAG。

. C5 L  C8 t# [; p$ `. n7 _: m7 l
5.问题:void SystemInit(void)不能写函数,写在这里面的函数都不反应
原因:
6. 问题: 中断方式接收USART,进入中断出不来了
解决: 配置串口时,只写USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
不打开TXE,发送中断,即可。这样进入中断,判断FLAG,就不会出现错误。
收藏 1 评论4 发布时间:2015-10-18 15:48

举报

4个回答
与非社区小虫 回答时间:2015-10-18 17:21:41
多谢分享 blank0.png
你好我好大家好! 回答时间:2015-10-18 18:21:20
disheng4688 回答时间:2015-10-19 08:29:10
多谢分享  
Cux 回答时间:2015-10-19 23:32:22
多谢分享  

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版