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

发布者:DazzlingSmile最新更新时间:2019-06-13 来源: eefocus关键字:stm32  MDK开发  常见问题 手机看文章 扫描二维码
随时随地手机看文章

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

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


..CMSISCM3CoreSupport

..CMSISCM3DeviceSupportSTSTM32F10x

..STM32F10x_StdPeriph_Driverinc

..userinc


 


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


新的库已经把.CONF.MAP.TYPE都已经去掉整合到STM32F10X.H当中


 


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


 


 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了。


   在此文件里面可以找到SystemInit的所在:

Reset_Handler    PROC

                 EXPORT  Reset_Handler             [WEAK]

     IMPORT  __main

     IMPORT  SystemInit

                 LDR     R0, =SystemInit

                 BLX     R0

                 LDR     R0, =__main

                 BX      R0

                 ENDP

   原来在复位中断服务函数里面,调用了SystemInit这个函数,而这个函数在.s文件里面没有定义。

    所以解决的办法有两个。

   1,在外部(其他任何.c文件里面)定义SystemInit这个函数,哪怕是个空函数也可以。

   2,把                

                 LDR     R0, =SystemInit

                 BLX     R0

      这两句话去掉。


(当使用Libraries里面的startup文件时,出现的问题。我采用的1解决办法,顺利解决问题)


 


3.。。HardFault_Handler的调试 最简单的办法:



在进入HardFault_Handler之后,根据堆栈指针查看堆栈,找到堆栈中最新的函数返回地址,到这个地址上去加断点,一步步根据汇编执行代码。很快就能找到出错原因,大多数是数组溢出,或者是指针初始化的问题。


出现此问题,肯定是堆栈溢出和数组越界。


(有时可能是因为。s启动文件,对stack和heap设置的太小,需要自己手动设置变大,就不会出现此问题。我就是将


原来的0x400和0x200增大到0x2000和0x2000)


(今天经过高人指点,对于此问题又找到原因:潜入式库函数里的malloc,没有垃圾回收机制,因为我是裸奔,没有


系统支持,所以malloc对内存并没有明确的机制,也就是说,他分配的内存很可能是有问题的,造成溢出等。所以原来


。s文件默认的堆栈大小,都很小,很容易就溢出。 现在只需将malloc函数申请的内存,使用数组代替,即可。)


 


4.问题 "No Cortex-M Device found in JTAG chain"或“Emulator has been changed or re-enumerated!”


原因:烧录的程序关闭了JTAg功能,复用了JTAG的接口,导致JTAG不能正常使用。这事,就需要使用串口下载一个


程序,此程序没有关闭JTAG即可,然后就可以正常重新使用JTAG。


 


 5.问题:void SystemInit(void)不能写函数,写在这里面的函数都不反应


原因:


6. 问题: 中断方式接收USART,进入中断出不来了


解决: 配置串口时,只写USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 


不打开TXE,发送中断,即可。这样进入中断,判断FLAG,就不会出现错误。


关键字:stm32  MDK开发  常见问题 引用地址:stm32使用MDK开发中的一些常见问题

上一篇:使用STM32控制无源蜂鸣器发声播放音乐(STM32_07)
下一篇:关于STM32的CPU的使用率~裸机不带系统

推荐阅读最新更新时间:2024-11-11 17:45

STM32 系统架构
简介:这里所讲的 STM32 系统架构主要针对的 STM32F103 这些非互联型芯片。STM32 主系统主要由四个驱动单元和四个被动单元构成。 四个驱动单元是: 内核DCode总线;系统总线;通用DMA1;通用DMA2; 四被动单元是: AHB到APB的桥:连接所有的APB设备;内部FlASH闪存;内部SRAM;FSMC; 下面我们具体看一下图中几个总线的知识: ①ICode总线:该总线将M3内核指令总线和闪存指令接口相连,指令的预取在该总线上面完成。 ②DCode总线:该总线将M3内核的DCode总线与闪存存储器的数据接口相连接,常量加载和调试访问在该总线上面完成。 ③系统总线:该总线连
[单片机]
<font color='red'>STM32</font> 系统架构
SD NAND在STM32应用上的保姆级教程
SD NAND与正点原子精英板的连接 由于正点原子精英板没有SD NAND接口,只有TF卡接口,所以SD NAND需要用到转接板来连接。 SD NAND正常运行现象 本次实验的程序是正点原子的SD卡实验例程,先用读卡器把SD NAND接到电脑上,并复制一个文件进去,再插到开发板上; 用送的数据线连接USB UART接口,下载好程序,打开电脑上的串口助手,按下KEY0,即可读取到数据, 具体实验步骤和现象可以看例程文件夹中的readme, 另外LED-DS0闪烁也表示SD NAND芯片在正常运行, SD NAND芯片用的是MK-米客方德的工业级芯片MKDV1GIL-AS;MK-米客方德家还有其他各种型号的SD NAN
[单片机]
SD NAND在<font color='red'>STM32</font>应用上的保姆级教程
GD32单片机STM32远程下载手机程序升级固件下载局域网网页升级工具
GD32、STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 GD32/STM32单片机的在线下载通常需要以下几种方式完成: 1、使用ST/GD提供的串口下载工具,本地完成固件的升级下载。 2、自行完成系统BootLoader的编写,将系统程序分为BootLoader和APP两个部分,BootLoader完成固件升级。 3、使用STM32/GD固件服务器,完成固件的升级,固件服务器https://simplewifi.taobao.com/ 几种方式各有优缺点: 使用ST提供的方法进行固件升级,方法简单,不需要额外的开发。但是,只能本地完成STM32单片机的升级。
[单片机]
GD32单片机<font color='red'>STM32</font>远程下载手机程序升级固件下载局域网网页升级工具
STM32的SYSTICK详解
什么是SYSTICK: 这是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。 作用: 在单任务引用程序中,因为其架构就决定了它执行任务的串行性,这就引出一个问题:当某个任务出现问题时,就会牵连到后续的任务,进而导致整个系统崩溃。要解决这个问题,可以使用实时操作系统(RTOS). 因为RTOS以并行的架构处理任务,单一任务的崩溃并不会牵连到整个系统。这样用户出于可靠性的考虑可能就会基于RTOS来设计自己的应用程序。这样SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供一个有
[单片机]
<font color='red'>STM32</font>的SYSTICK详解
STM32掌机教程4,STM32驱动OLED屏幕
屏幕显示英文字符   有个屏幕,掌机的可玩性可以大大增强,打地鼠玩腻了,可以玩个贪吃蛇,俄罗斯方块,以及其他需要开动想象力的游戏。并且,以前总是玩别人的游戏,现在可以自己写游戏,岂不美哉。   后来我感觉0.96的OLED屏幕太小了,搞个更大的全彩屏,换成STM32F4系列单片机,跑个ucos,运行NES模拟器,然后我是不是就能拳打任天堂,脚踢PSP了?哈哈哈   打地鼠的游戏,可以显示生命值,得分,关卡或难度。所以要定义几个变量。 //main.c //默认参数 #define LIFE_NUM 3 // 默认几条命 //全局变量定义 u8 life = LIFE_NUM; //生命 u32 score =
[单片机]
<font color='red'>STM32</font>掌机教程4,<font color='red'>STM32</font>驱动OLED屏幕
STM32 stdint.h简略翻译
一定要看: 由于本人英语水平有限,且初学STM32,在翻译过程中出现错误,遗漏,不当之处在所难免,因此希望各位若发现错误请麻烦抖抖你的手指,敲出我的错误,本人非常渴望您的指正,以免害己害人! 看本文注意点: 文中 1, #ifdef __cplusplus #undef __CLIBNS #ifndef __STDINT_DECLS等等宏的使用请看我的另一篇收集整理的博客《比较全面的宏定义解析》 2,本文 不求功能解释,只对文中进行字面翻译,应该说还是比较容易理解其功能的 3,需要源文件的 请到http://download.csdn.net/detail/you1314520me/6392445
[单片机]
<font color='red'>STM32</font> stdint.h简略翻译
STM32温度传感器的使用和计算
STM32内置一个温度传感器,通过ADC_IN16这个通道可以读出温度传感器的电压。在STM32的技术参考手册中给出了一个计算公式: Temperature (in ℃) = {(V25 - VSENSE) / Avg_Slope} + 25 公式中的Vsense就是在ADC_IN16读到的数值。Avg_Slope就是温度与ADC数值转换的斜率。 设想一个XY坐标,X轴为ADC的电压读数,Y轴为温度,两轴之间有一条直线代表了温度与转换电压的关系;在这条直线上如果X轴电压为V25时,Y轴即为25℃;当读出的电压是其它数值时,即读出的电压是Vsense时,使用这个公式就可以得到温度的数值。 在STM32F103xx
[单片机]
stm32的VCC/VDD/VSS/VEE
先看一下stm32vet6的引脚图吧 电路设计以及PCB制作中,经常碰见电源符号:VCC、 VDD、VEE、VSS,他们具有什么样的关系那?   一、解释   VCC:C=circuit 表示电路的意思, 即接入电路的电压   VDD:D=device 表示器件的意思, 即器件内部的工作电压;   VSS:S=series 表示公共连接的意思,通常指电路公共接地端电压 VEE:负电压供电;场效应管的源极(S)   二、说明   1、对于数字电路来说,VCC是电路的供电电压,VDD是芯片的工作电压(通常Vcc Vdd),VSS是接地点。     例如,对于ARM单片机来说,其供电电压VCC一般为5V,一般经过稳压模块
[单片机]
<font color='red'>stm32</font>的VCC/VDD/VSS/VEE
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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