① stm32写程序.c文件名能是中文吗
这个和芯片无关,主要看编译器。目前KEIL、IAR之类的主流编译器都能够支持中文,但是并不建议使用中文命名源文件。
② STM32请教!为什么使用Keil编译.asm 文件出现
CODE SPACE MEMORY OVERLAP
1.代码段地址重复了,生成的代码超过了编译器最大限制,或是你重复使用了相同的地址.
UNRESOLVED EXTERNAL SYMBOL
SYMBOL: ?C_START
2.你文件保存的扩展名是不是.ASM的,或是你仔细的检查一下,是不是标号写错了或是忘写了.主程序出问题的可能性比较大,看警告你就知道了
,实在不行你把程序通过消息发过来,我给你看一下,看不到程序具体问题出在哪不好说.
③ kiel tutinstm32文件能编译吗
可以。
STM32是ARM7核,而KEIL是ARM旗下的,KEIL只是一个开发环境,支持什_还需要下载相应的编译器,你原来如果是学51的,肯定有C51编译器,但是你需要去官网下载KEIL MDK就是所说的RVMDK,就是ARM的编译器,包含STM32,然后安装,然后看着教程打开KEIL选择相应的芯片来建立工程就行了,不过需要破解。
一般在STM32工程使用Keil编译之后,keil的build output窗口中会出现如图所示的输出信息,其中会显示code_笮。_O-data、RW-data、ZI-data大小。ARM程序的组成(ARM系统中正在执行的程序,而非保存在ROM中的BIN映像文件,请注意区别):一个ARM程序包含3个部分:RO,RW和ZI,RO是程序中的指令和常量;RW是程序中已经初始化的变量;ZI是程序中未经初始化的变量;以上3点可以理解为:RO就是readonly,RW就是read/write,ZI就是zeroARM映像文件的组成:所谓的ARM映像文件就是烧录到ROM中的BIN文件,也称为Image文件,以下用Image文件来替代。Image文件包含了RO和RW数据,之所以Image文件不包含ZI数据,那是因为ZI数据都是0,没必要包含,运行之前将ZI数据数据所在的区域清零即可,包含进去反而浪费存储空间补充一个问题:Q:为什么Image必须O,RW?A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样无中生有的。
④ stm32数据类型
学C语言得当时候老师应该有说过,int在不同的编译器所占的字节是不同的,比如TC int就是2字节,VC就是4字节。STM32是32位机,int占4字节。
typedef signed __int64 int64_t; 从字面上就能理解意思,long int。 __int64是宏或者typedef定义过的符号
⑤ 使用keil5编译stm32,头文件core_cmFunc.h中,是预定义__CC_ARM,还是__GNUC__
编译的时候,可能是那个地方定义了__CC_ARM, 预编译指令执行了#if defined ( __CC_ARM )下面的代码,没有执行#elif defined ( __GNUC__ )下面的代码;
#if ...
...
#elif ..
...
是条件预编译,只执行其中的一个分支
⑥ stm32 数据类型谁能详细讲解一下
singned char是有符号字符型吧,范围应该是-127~127。怎么会是long呢?
long int 和char在51是可以用的,楼主请注意,数据类型只和编译器有关,基本上和单片机没有关系,只不过了解了单片机的位宽,可以有助于提高程序的效率。
如51是八位单片机,在做unsigned long 符号处理时,需要分为八位一个步骤处理四次。
而STM32是32位单片机,在处理unsigned long 时不需要分开处理。
另一个,STM32存在访问对齐,8位的数据存储占用的内存并不一定是8位,使用C语言编程时这些操作都由编译器自动处理,楼主可以使用联合体来验证。
⑦ stm32中 .c和.h文件是什么关系
本质上没有任何区别。 只不过一般:.h文件是头文件,内含函数声明、宏定义、结构体定义等内容
.c文件是程序文件,内含函数实现,变量定义等内容。而且是什么后缀也没有关系,只不过编译器会默认对某些后缀的文件采取某些动作。你可以强制编译器把任何后缀的文件都当作c文件来编。
编译器在编译时是以C文件为单位进行的,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译,连接器是以目标文件为单位。
它将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件,在PC上的程序开发,一般都有一个main函数,这是各个编译器的约定,当然,你如果自己写连接器脚本的话,可以不用main函数作为程序入口。(main .c文件 目标文件 可执行文件)
(7)stm32编译文件格式扩展阅读
main函数为标准C/C++的程序入口,编译器会先找到该函数所在的文件。
假定编译程序编译myproj.c(其中含main())时,发现它include了mylib.h(其中声明了函数voidtest()),那么此时编译器将按照事先设定的路径(Include路径列表及代码文件所在的路径)查找与之同名的实现文件(扩展名为.cpp或.c,此例中为mylib.c)。
如果找到该文件,并在其中找到该函数(此例中为voidtest())的实现代码,则继续编译;如果在指定目录找不到实现文件,或者在该文件及后续的各include文件中未找到实现代码。
则返回一个编译错误.其实include的过程完全可以"看成"是一个文件拼接的过程,将声明和实现分别写在头文件及C文件中,或者将二者同时写在头文件中,理论上没有本质的区别。
⑧ 关于stm32f1ox.h头文件启动代码与编译器里的宏定义
stm32f107vc属于互联性器件,他的启动文件应该是.cl。对于启动文件有ji个, .ld .md .hd .cl .xl rbt6选用的是md 可以在keil c++ 宏定义那边说明STM32F10X_CL, 或者在stm32f10x。h中找到 #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) #define STM32F10X_MD #endif 如果用的是rbt6 如上,如果用的是107 将cl打开 同时我们会看到我们启用了外部的25M晶振, 外部时钟频率选择 #if !defined HSE_VALUE #ifdef STM32F10X_CL #define HSE_VALUE ((uint32_t)25000000) #else #define HSE_VALUE ((uint32_t)8000000) #endif #endif 最后将.cl启动文件添加到工作组中。
⑨ STM32编译出来的hex文件大于512KB 怎么破
hex文件内包含地址长度等信息描述,与bin文件是不同的,如果bin文件超过512才烧不进去
以前我做了一个stm32的bootloader,可以通过CAN总线升级STM32F10x的程序,当初为了支持HEX格式的文件
专门研究了一下hex的结构,并写了一些解析代码,去掉多余的部分,这是经验之谈
至于差多少,你可以编译一个bin文件看看就知道了
如果使用keil,输出那里勾上bin选项就可以了
⑩ STM32程序编译出现错误,请各位帮忙
STM32程序编译出现错误,是设置错误造成的,解决方法如下:
1、首先打开STM32 ST-LINK Utility,依次选择“File ->Open File...”或者按快捷键“CTRL + O”准备打开一个烧录文件。