① 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」准備打開一個燒錄文件。