接上文:歡迎關注逗比小憨憨
上文講到armlink等文件在keil MDK安裝路徑中:E:\keilmdk5Setup\ARM\ARMCC\Bin
為其配置環境變量,步驟:
1,右鍵 "此電腦(或我的電腦)"
2, 找到 "相關設置" 中的 "高級系統設置"
3,點擊 "高級系統設置",出現如下界面
4,點擊 "環境變量",在用戶變量一欄中找到名為 “Path” 的變量,若沒有該變量,則新建一個。編輯“Path”變量,在它的變量值中輸入工具鏈的路徑。
5,點擊確定
6,驗證:"win + R" ,在彈出對話框中輸入 "cmd" , 然后輸入 "armlink" ,若跳出提示信息則說明環境變量配置好。
若提示 "不是內部名外部命令 ,也不是可運行的程序…" 信息,說明路徑不對,請重新配置環境變量,并確認該工作目錄下有編譯工具鏈。
備注說明:
這個過程本質就是讓命令行(讀法:hang)通過 “Path” 路徑找到 “armlink.exe” 程序運行,默認運行“armlink.exe”時它會輸出自己的幫助信息,這就是工具鏈的調用過程,MDK在編譯程序時,本質上就是調用這些工具鏈進行相應的操作,只是它集成為 GUI,相對于命令行對用戶更友好。
配置好后,我們可以使用這些文件進行編譯(armcc),鏈接(armlink)文件了。
比如:我們在命令行中輸入 "armcc",可以查看其用法,用法格式:armcc [options] fifile1 fifile2 …
options:此選項有很多,比如我們查看可以支持的cpu版本,輸入:armcc -cpu=list 出現如下信息:
備注:此命令的用法其實和gcc的用法差不多,可以類比學習。
打開keil MDK 的 Options for Targe->c/c++ 菜單,可看到 keil MDK 對編譯器的控制命令,如下圖所示:
在Compiler control string中有如下字符串:
--c99 -c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I ../CORE -I ../STM32F10x_StdPeriph_Driver/inc -I ../APP/led -I ../APP/button -I ../BIT_Operation -I ../CORE -I ../delay -I ../APP/timer -I ../USART -I ../APP/pwm -I ../APP/capture -I ../APP/ADC -I ../APP/I_temperature -I ../APP/LCD1602 -I ../APP/iwdg -I ../APP/AT24C0X -I ../APP/MPU60X0 -I ../APP/DHT11 -I ../APP/DHT11_2 -I ../APP/myiic
-IC:/Users/PC/Desktop/STM32F103C8T6/program/STM32F103C8T6升級版/USER/RTE
-IE:/keilmdk5Setup/Keil/STM32F1xx_DFP/2.3.0/Device/Include
-IE:/keilmdk5Setup/ARM/CMSIS/Include
-D__UVISION_VERSION="521" -DSTM32F10X_MD -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER
-o .\obj\*.o --omf_browse .\obj\*.crf --depend .\obj\*.d
從上述可知,keil MDK在編譯工程中的C/C++文件時,使用的是“armcc” 進行編譯的,并且使用了上述提供的參數,這些參數詳細講解在 MDK 的幫助手冊《ARM Development Tools》 中
對 Compiler control string中的字符串進行解釋:
-c99 :表示啟用C99源代碼的編譯
--cpu Cortex-M3: 表示cpu版本是Cortex-M3 (我們課程中使用的單片機型號是STM32F103C8T6,它就是Cortex-M3的內核)
-g: 表示生成調試信息,如果我們需要使用相應的工具進行程序調試,這點很重要
-O0:表示優化等級為0,(因為我們在編寫程序時,會出現很多冗余代碼,指定優化等級后,編譯器會進行優化)
備注:一般是有四種優化等級,分別是:O0,O1,O2,O3,數字越大優化等級越大
--apcs=interwork: 生成有或沒有ARM/Thumb交互支持的代碼。默認值為/nointerwork,
ARMv5T及更高版本除外,默認值為/interwork。
--split_sections :為源文件中的每個函數生成一個ELF節。輸出節的名稱與生成該節的函數的名稱相同,但帶有i.前綴。
-I:表示指定頭文件路徑
-Dname[(parm-list)][=def]:定義相應的宏
-o:表示輸出文件,-o .\obj\*.o:表示輸出所有的.o文件到工程文件中的/obj/目錄中
--omf_browse:支持生成和存儲源瀏覽器信息。--omf_browse .\obj\*.crf:生成的所有.crf文件
存放到工程文件中的/obj/目錄中
--depend:在編譯期間將makefile依賴項行寫入文件。
--depend .\obj\*.d:要輸出的依賴項文件的名稱,在/obj/目錄中可以查找到
-I ../CORE -I ../STM32F10x_StdPeriph_Driver/inc -I ../APP/led -I ../APP/button -I ../BIT_Operation -I ../CORE -I ../delay -I ../APP/timer -I ../USART -I ../APP/pwm -I ../APP/capture -I ../APP/ADC -I ../APP/I_temperature -I ../APP/LCD1602 -I ../APP/iwdg -I ../APP/AT24C0X -I ../APP/MPU60X0 -I ../APP/DHT11 -I ../APP/DHT11_2 -I ../APP/myiic
-IC:/Users/PC/Desktop/STM32F103C8T6/program/STM32F103C8T6升級版/USER/RTE
-IE:/keilmdk5Setup/Keil/STM32F1xx_DFP/2.3.0/Device/Include
-IE:/keilmdk5Setup/ARM/CMSIS/Include
(注意:每個人的這里不一樣,主要看大家在工程中包含了哪些頭文件)
這些就是我們在編譯工程,編譯器將這些路徑中查找相應的頭文件(.h文件),我們從課程可以知道,每次寫程序時,都要新建一個.c和.h文件,并且還要進行.h頭文件路徑的包含,上述就是我們包含頭文件路徑后,軟件為我們自動加上的頭文件路徑(其中有一部分是軟件自動要包含的頭文件路徑,比如-IE:/keilmdk5Setup/ARM/CMSIS/Include,這些是一些系統頭文件的路徑,比如“stdio.h”)
-D__UVISION_VERSION="521" :定義一個宏__UVISION_VERSION,它的值是521
此宏是MDK軟件自動定義的,表示我們使用的軟件版本是5.21版本
-DSTM32F10X_MD :定義一個宏,STM32F10X_MD,表示FLASH容量是中容量
中容量范圍。大家去《STM32零基礎入門第一階段視頻中的庫函數工程模板建立那幾節視頻》
-DUSE_STDPERIPH_DRIVER:定義一個宏,USE_STDPERIPH_DRIVER,表示程序中使用標準庫
大家去《STM32零基礎入門第一階段視頻中的庫函數工程模板建立那幾節視頻》
對于上述定義的宏:
回顧(STM32課程中,建立庫函數工程文件那一節),我們在新建庫函數工程模板時,Options for Targe -> c/c++ -> Define中寫入了這個字符串:STM32F10X_MD,USE_STDPERIPH_DRIVER
-o .\obj\*.o --omf_browse .\obj\*.crf --depend .\obj\*.d:
打開我們的STM32工程模板,在obj目錄中可以查看到很多.o,.crf,.d文件
armasm.exe 是匯編器,它把匯編文件編譯成 .o文件。與 armcc 類似,MDK 對 armasm 的調用選項可在“Option for Target->Asm”頁面進行配置。
對Assembler control string中字符串進行解釋:
--cpu Cortex-M3 -g --apcs=interwork
-I C:\Users\PC\Desktop\STM32F103C8T6\program\STM32F103C8T6升級版\USER\RTE
-I E:\keilmdk5Setup\Keil\STM32F1xx_DFP\2.3.0\Device\Include
-I E:\keilmdk5Setup\ARM\CMSIS\Include
--pd "__UVISION_VERSION SETA 521" --pd "STM32F10X_MD SETA 1" --list ".\obj\*.lst" --xref -o "*.o" --depend "*.d"
下面這些語句和armcc中的解釋一樣
--cpu Cortex-M3 -g --apcs=interwork
-I C:\Users\PC\Desktop\STM32F103C8T6\program\STM32F103C8T6升級版\USER\RTE
-I E:\keilmdk5Setup\Keil\STM32F1xx_DFP\2.3.0\Device\Include
-I E:\keilmdk5Setup\ARM\CMSIS\Include
--pd "__UVISION_VERSION SETA 521"
: --predefine命令行選項的同義詞。表示指示armasm預執行SETA、SETL或SETS指令之一。
--pd "STM32F10X_MD SETA 1"
:-predefine命令行選項的同義詞。表示指示armasm預執行SETA、SETL或SETS指令之一。
--list ".\obj\*.lst":指示匯編程序將匯編程序生成的匯編語言的詳細列表輸出到文件中。
--xref -o "*.o" :指示匯編程序列出符號的交叉引用信息,
包括它們在宏內部和外部的定義位置和使用位置。-o:表示輸出文件
--depend "*.d":將makefile依賴項行寫入文件。源文件依賴項列表適用于make實用程序。
SETA、SETL和SETS指令設置局部或全局變量的值。
__UVISION_VERSION SETA 521:表示定義一個局部或全局變量__UVISION_VERSION,它的值是521,
注意,這條語句__UVISION_VERSION SETA 521必須使用引號括起來
armlink.exe 是鏈接器,它把各個.o文件鏈接組合在一起生成 ELF 格式的 AXF文件,AXF 文件是可執行的,下載器把該文件中的指令代碼下載到芯片后,該芯片就能運行程序了;利用 armlink 還可以控制程序存儲到指定的 ROM 或 RAM 地址。在 MDK 中可在“Option for Target->Linker”頁面配置 armlink 選項。
對Linker control string中字符串進行解釋
--cpu Cortex-M3 *.o
--ro-base 0x08000000 --entry 0x08000000 --rw-base 0x20000000 --entry Reset_Handler --first __Vectors --strict --summary_stderr --info summarysizes --map --xref --callgraph --symbols
--info sizes --info totals --info unused --info veneers
--list ".\obj\doubixiaohanhan.map"
-o .\obj\doubixiaohanhan.axf
--cpu Cortex-M3 *.o :內核版本Cortex-M3,鏈接所有生成的.o文件
--ro-base 0x08000000 :在指定地址設置包含RO-data輸出部分的區域的加載和執行地址。
備注:語法格式:--ro_base=address
該地址必須字對齊,也就是4字節對齊
--rw-base 0x20000000 :在指定地址設置包含RW-data輸出部分的區域的執行地址。
--entry :指定輸入段與輸入點
語法:--entry=location
location可以是:
1,可以是數字,比如--entry 0x08000000
2,可以是符號,比如 --entry Reset_Handler
--first __Vectors :將選定的輸入節首先放置在其執行區域中。
例如,這可以將包含向量表的部分放在image的第一位。
--strict :指示鏈接器執行其他一致性檢查,例如可能導致失敗的報告條件。
--summary_stderr :
--info :列出image信息。
--map :啟用內存映射的打印。
--xref :列出輸入部分之間的所有交叉引用。
--callgraph :創建一個包含函數靜態調用圖的文件。調用圖為image中的所有函數提供定義和參考信息
--symbols :啟用鏈接步驟中使用的每個本地和全局符號及其值的列表。最終輸出會放在.map文件里面
--list ".\obj\doubixiaohanhan.map" :將診斷輸出重定向到文件。
-o .\obj\doubixiaohanhan.axf :輸出最終的.axf文件
對Linker control string中字符串進行解釋:
--cpu Cortex-M3 *.o
--strict --scatter ".\obj\doubixiaohanhan.sct"
--summary_stderr --info summarysizes --map --xref --callgraph --symbols
--info sizes --info totals --info unused --info veneers
--list ".\obj\doubixiaohanhan.map"
-o .\obj\doubixiaohanhan.axf
--scatter ".\obj\doubixiaohanhan.sct":按照分散加載文件的描述創建map文件
doubixiaohanhan.map文件內容如下:
Component: ARM Compiler 5.06 update 3 (build 300) Tool: armlink [4d35c9]
==============================================================================
Section Cross References
main.o(i.main) refers to misc.o(i.NVIC_PriorityGroupConfig) for NVIC_PriorityGroupConfig
main.o(i.main) refers to delay.o(i.delay_init) for delay_init
main.o(i.main) refers to usart.o(i.Usart1_Init) for Usart1_Init
因篇幅太長,部分省略
startup_stm32f10x_md.o(.text) refers to startup_stm32f10x_md.o(STACK) for Stack_Mem
myiic.o(i.myiic_ack) refers to myiic.o(i.myiic_delay) for myiic_delay
myiic.o(i.myiic_delay) refers to delay.o(i.delay_us) for delay_us
因篇幅太長,部分省略
defsig_other.o(.text) refers to defsig_general.o(.text) for __default_signal_display
==============================================================================
Removing Unused input sections from the image.
Removing main.o(.bss), (100 bytes).
Removing main.o(.data), (4 bytes).
Removing misc.o(i.NVIC_SetVectorTable), (20 bytes).
ing stm32f10x_adc.o(i.ADC_GetITStatus), (36 bytes).
因篇幅太長,部分省略
Removing stm32f10x_tim.o(i.TIM_SelectCOM), (24 bytes).
Removing stm32f10x_tim.o(i.TIM_SelectHallSensor), (24 bytes).
Removing stm32f10x_tim.o(i.TIM_SelectInputTrigger), (18 bytes).
452 unused section(s) (total 18286 bytes) removed from the image.
==============================================================================
Image Symbol Table
Local Symbols
Symbol Name Value Ov Type Size Object(Section)
../clib/angel/boardlib.s 0x00000000 Number 0 boardinit1.o ABSOLUTE
../clib/angel/boardlib.s 0x00000000 Number 0 boardinit2.o ABSOLUTE
因篇幅太長,部分省略
.ARM.Collect$$rtexit$$00000004 0x0800018a Section 6 rtexit2.o(.ARM.Collect$$rtexit$$00000004)
.text 0x08000190 Section 60 startup_stm32f10x_md.o(.text)
.text 0x080001cc Section 2 use_no_semi_2.o(.text)
.text 0x080001d0 Section 0 noretval__2printf.o(.text)
.text 0x080001e8 Section 0 __printf.o(.text)
.text 0x08000250 Section 0 _printf_dec.o(.text)
因篇幅太長,部分省略
fac_ms 0x20000034 Data 4 delay.o(.data)
.data 0x20000038 Section 8 usart.o(.data)
sta 0x20000038 Data 4 usart.o(.data)
.bss 0x20000040 Section 100 usart.o(.bss)
usart1_data 0x20000040 Data 100 usart.o(.bss)
.bss 0x200000a4 Section 96 libspace.o(.bss)
HEAP 0x20000108 Section 0 startup_stm32f10x_md.o(HEAP)
STACK 0x20000108 Section 512 startup_stm32f10x_md.o(STACK)
Heap_Mem 0x20000108 Data 0 startup_stm32f10x_md.o(HEAP)
Stack_Mem 0x20000108 Data 512 startup_stm32f10x_md.o(STACK)
__initial_sp 0x20000308 Data 0 startup_stm32f10x_md.o(STACK)
Global Symbols
Symbol Name Value Ov Type Size Object(Section)
BuildAttributes$$THM_ISAv4$P$D$K$B$S$PE$A:L22UL41UL21$X:L11$S22US41US21$IEEE1$IW$USESV6$~STKCKD$USESV7$~SHL$OSPACE$ROPI$EBA8$UX$STANDARDLIB$REQ8$PRES8$EABIv2 0x00000000 Number 0 anon$$obj.o ABSOLUTE
__ARM_use_no_argv 0x00000000 Number 0 main.o ABSOLUTE
__ARM_exceptions_init - Undefined Weak Reference
__alloca_initialize - Undefined Weak Reference
__arm_preinit_ - Undefined Weak Reference
__cpp_initialize__aeabi_ - Undefined Weak Reference
因篇幅太長,部分省略
my_at24c0x_init 0x08000c85 Thumb Code 8 at24c0x.o(i.my_at24c0x_init)
my_at24c0x_read_byte 0x08000c8d Thumb Code 18 at24c0x.o(i.my_at24c0x_read_byte)
因篇幅太長,部分省略
__libspace_start 0x200000a4 Data 96 libspace.o(.bss)
__temporary_stack_top$libspace 0x20000104 Data 0 libspace.o(.bss)
==============================================================================
Memory Map of the image
Image Entry point : 0x080000ed
Load Region LR_IROM1 (Base: 0x08000000, Size: 0x0000107c, Max: 0x00010000, ABSOLUTE)
Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x0000103c, Max: 0x00010000, ABSOLUTE)
Base Addr Size Type Attr Idx E Section Name Object
0x08000000 0x000000ec Data RO 3047 RESET startup_stm32f10x_md.o
0x080000ec 0x00000008 Code RO 3255 * !!!main c_w.l(__main.o)
0x080000f4 0x00000034 Code RO 3423 !!!scatter c_w.l(__scatter.o)
0x08000128 0x0000001a Code RO 3425 !!handler_copy c_w.l(__scatter_copy.o)
0x08000142 0x00000002 PAD
因篇幅太長,部分省略
0x08000186 0x00000000 Code RO 3349 .ARM.Collect$$rtexit$$00000002 c_w.l(rtexit2.o)
因篇幅太長,部分省略
0x08000ca0 0x00000070 Code RO 3121 i.my_at24c0x_test at24c0x.o
0x08000d10 0x00000012 Code RO 3122 i.my_at24c0x_write_byte at24c0x.o
0x08000d22 0x0000000c Code RO 3053 i.myiic_delay myiic.o
0x08000d2e 0x00000002 PAD
0x08000d30 0x00000050 Code RO 3054 i.myiic_init myiic.o
0x08000d80 0x00000050 Code RO 3055 i.myiic_noack myiic.o
0x08000dd0 0x00000068 Code RO 3056 i.myiic_read_byte myiic.o
0x08000e38 0x0000004c Code RO 3057 i.myiic_start myiic.o
0x08000e84 0x0000004c Code RO 3058 i.myiic_stop myiic.o
0x08000ed0 0x0000007c Code RO 3059 i.myiic_wait_ack myiic.o
0x08000f4c 0x0000005c Code RO 3060 i.myiic_write_byte myiic.o
0x08000fa8 0x00000042 Code RO 3061 i.sensor_common_read_byte myiic.o
0x08000fea 0x00000030 Code RO 3062 i.sensor_common_write_byte myiic.o
0x0800101a 0x00000002 PAD
0x0800101c 0x00000020 Data RO 3421 Region$$Table anon$$obj.o
Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00000308, Max: 0x00005000, ABSOLUTE)
Base Addr Size Type Attr Idx E Section Name Object
0x20000000 0x00000014 Data RW 1516 .data stm32f10x_rcc.o
0x20000014 0x00000014 Data RW 3004 .data system_stm32f10x.o
0x20000028 0x00000006 Data RW 3124 .data at24c0x.o
0x2000002e 0x00000002 PAD
0x20000030 0x00000008 Data RW 3155 .data delay.o
0x20000038 0x00000008 Data RW 3183 .data usart.o
0x20000040 0x00000064 Zero RW 3182 .bss usart.o
0x200000a4 0x00000060 Zero RW 3299 .bss c_w.l(libspace.o)
0x20000104 0x00000004 PAD
0x20000108 0x00000000 Zero RW 3046 HEAP startup_stm32f10x_md.o
0x20000108 0x00000200 Zero RW 3045 STACK startup_stm32f10x_md.o
==============================================================================
Image component sizes
Code (inc. data) RO Data RW Data ZI Data Debug Object Name
156 20 0 6 0 2451 at24c0x.o
0 0 0 0 0 32 core_cm3.o
236 32 0 8 0 1759 delay.o
40 0 0 0 0 231995 main.o
172 22 0 0 0 2169 misc.o
758 104 0 0 0 5346 myiic.o
60 22 236 0 512 808 startup_stm32f10x_md.o
282 0 0 0 0 2583 stm32f10x_gpio.o
244 26 0 20 0 3969 stm32f10x_rcc.o
446 6 0 0 0 6397 stm32f10x_usart.o
328 28 0 20 0 2185 system_stm32f10x.o
360 26 0 8 100 4056 usart.o
----------------------------------------------------------------------
3092 286 268 64 612 263750 Object Totals
0 0 32 0 0 0 (incl. Generated)
10 0 0 2 0 0 (incl. Padding)
----------------------------------------------------------------------
Code (inc. data) RO Data RW Data ZI Data Debug Library Member Name
8 0 0 0 0 68 __main.o
104 0 0 0 0 84 __printf.o
0 0 0 0 0 0 __rtentry.o
12 0 0 0 0 0 __rtentry2.o
6 0 0 0 0 0 __rtentry4.o
52 8 0 0 0 0 __scatter.o
26 0 0 0 0 0 __scatter_copy.o
28 0 0 0 0 0 __scatter_zi.o
48 6 0 0 0 96 _printf_char_common.o
36 4 0 0 0 80 _printf_char_file.o
6 0 0 0 0 0 _printf_d.o
120 16 0 0 0 92 _printf_dec.o
178 0 0 0 0 88 _printf_intcommon.o
0 0 0 0 0 0 _printf_percent.o
4 0 0 0 0 0 _printf_percent_end.o
18 0 0 0 0 80 exit.o
8 0 0 0 0 68 ferror.o
6 0 0 0 0 152 heapauxi.o
2 0 0 0 0 0 libinit.o
2 0 0 0 0 0 libinit2.o
2 0 0 0 0 0 libshutdown.o
2 0 0 0 0 0 libshutdown2.o
8 4 0 0 96 68 libspace.o
24 4 0 0 0 84 noretval__2printf.o
2 0 0 0 0 0 rtexit.o
10 0 0 0 0 0 rtexit2.o
74 0 0 0 0 80 sys_stackheap_outer.o
2 0 0 0 0 68 use_no_semi.o
2 0 0 0 0 68 use_no_semi_2.o
----------------------------------------------------------------------
796 42 0 0 100 1176 Library Totals
6 0 0 0 4 0 (incl. Padding)
----------------------------------------------------------------------
Code (inc. data) RO Data RW Data ZI Data Debug Library Name
790 42 0 0 96 1176 c_w.l
----------------------------------------------------------------------
796 42 0 0 100 1176 Library Totals
----------------------------------------------------------------------
==============================================================================
Code (inc. data) RO Data RW Data ZI Data Debug
3888 328 268 64 712 262582 Grand Totals
3888 328 268 64 712 262582 ELF Image Totals
3888 328 268 64 0 0 ROM Totals
==============================================================================
Total RO Size (Code + RO Data) 4156 ( 4.06kB)
Total RW Size (RW Data + ZI Data) 776 ( 0.76kB)
Total ROM Size (Code + RO Data + RW Data) 4220 ( 4.12kB)
==============================================================================
doubixiaohanhan.sct中的內容:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00010000 { ; load region size_region
ER_IROM1 0x08000000 0x00010000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00005000 { ; RW data
.ANY (+RW +ZI)
}
}
備注:鏈接器默認是根據芯片類型的存儲器分布來生成程序的,該存儲器分布被記錄在工程里的.sct文件中,若有特殊需要的話可自行編輯該文件,改變鏈接器的鏈接方式。
擴展知識點:在鏈接的過程中,會用到一個描述文件,用來指定鏈接時的行為。這個描述文件叫做鏈接文件,如linux下的.ld文件,keil中的分散加載文件(.sct文件)
此文還沒寫完,待更新。。。。。。
#頭條創作挑戰賽#
引:
封控期間,找出家里的macbook,重新安裝了win10,在安裝MDK的時候,遇到以下情況,上網找到一些資料,最終總結如下,方便遇到相似問題的同學可以順利解決。
一、遇到的問題
用KEIL for ARM MDK 5.38版本,這個應該是最新的版本,打開之前的工程,編譯之后,會遇到編譯不成功的情況。
'Default Compiler Version 5'這樣的提示,KEIL的版本越高,向下兼容可能會出現問題,發現這個問題對于5.37版本就已經出現了,老劉應該很久沒有更新的原因。遇到問題,就開始解決問題。
二、解決問題
我們需要下載補丁包,來讓新的MDK向下兼容,這個補丁包的名稱是:
ARM Compiler_506_Windows_x86_b960.zip
老劉為了方便大家下載,已經放到了網盤上,共享給大家,鏈接如下:
鏈 接:https://pan.baidu.com/s/1t3T8TIhpUfIViNMjxYKXjQ
提取碼:YTLL
從網盤上下載之后,得到壓縮包,進行解壓縮:
找到Installer文件夾下的Setup.exe進行安裝
三、安裝及配置
雙擊Setup.exe之后,進行安裝,前提是已經安裝完MDK5.38.
Next
勾選 I accept the terms in the License Agreement選項,并next。
在這里注意安裝的目錄,老劉把這個文件放到了MDK文件夾中,按照如下形式設置:
C:\Keil_v5\ARM\ARM_Compiler_5.06u7\
Next
Install
等待安裝完成
Finish
設置MDK軟件,跟著老劉的步伐:
Project --> Manage --> Project Items...
我們選擇選項卡的Folders/Extensions,并進行setup。
選擇我們安裝后的目錄文件。
設置完成之后,我們在options for Target中選擇Target選項卡。然后在ARM Compiler中選擇剛剛安裝的補丁包。
四、測試
我們打開工程文件,進行測試,重新編譯之后。
發現,已經順利通過了。至此,安裝完成。
歡迎關注我的公眾號“數獨機”,可以點擊在看、給個小紅心點個贊。