文章目錄
- 一、keil的安裝
- 二、一個基于STM32彙程式設計式的編寫
-
- 1.建立工程及配置環境
- 2.添加檔案
- 3.代碼編寫
- 4.編譯調試
- 三、分析Hex檔案
-
- 1.打開Hex檔案
- 2.擴充線性位址記錄
- 3.資料部分
- 4.檔案尾
- 總結
一、keil的安裝
這裡筆者以前安裝過了,但可以跟着連結https://blog.csdn.net/qq_45659777/article/details/120496577來
- 百度網盤分享下載下傳
mdk531安裝
連結:https://pan.baidu.com/s/1ttrDhv6kXgAvPiYINf9iGw
提取碼:1234
- 注冊器
連結:https://pan.baidu.com/s/1T11pBKpD6xc-cNmXBskcaw
提取碼:1234
- 支援包
連結:https://pan.baidu.com/s/1a7UDSVeLC4ktHNN9lV9oIA
提取碼:1234
- keil安裝
通過以上連結下載下傳mdk和注冊器,點選安裝mdk,根據提示自行更改軟體路徑和支援包路徑,填寫完注冊資訊後NEXT,等待安裝。安裝完成,點選Finish。
- 注冊
1.點選運作注冊器程式。
2.在桌面找到keil軟體圖示,點選右鍵,以管理者身份運作。
3.點選File–>Lincense Management–>Single-User Lincense,找到CID,複制CID中的内容填寫到注冊器的CID空白處,将注冊器中Target選擇為ARM,點選Generate,得到注冊碼。
4.将生成的注冊碼複制粘貼到Keil的New Lincense ID Code空白處,點選Add LIC,點選Close。
- 支援包安裝
點選運作下載下傳的支援包,NEXT開始安裝,安裝完成,點選Finish。
二、一個基于STM32彙程式設計式的編寫
1.建立工程及配置環境
- 打開keil5,在project中選擇new uvison project
2. 填寫檔案名,這裡讀者命名為LED
3. 配置環境,選擇使用的stm32晶片
4. 選擇運作環境,勾選CMSIS下的CORE和DEVICE下的STARTUP
2.添加檔案
1.在project的Target 1檔案下右鍵單擊Source Group 1選擇
Add New Item to Group
.
2.選擇Asm File (.s),填入源檔案名稱,然後點選Add
然後就可以看見檔案被建立成功,可以編入代碼
3.代碼編寫
輸入如下代碼
AREA MYDATA, DATA
AREA MYCODE, CODE
ENTRY
EXPORT __main
__main
MOV R0, #10
MOV R1, #11
MOV R2, #12
MOV R3, #13
;LDR R0, =func01
BL func01
;LDR R1, =func02
BL func02
BL func03
LDR LR, =func01
LDR PC, =func03
B .
func01
MOV R5, #05
BX LR
func02
MOV R6, #06
BX LR
func03
MOV R7, #07
MOV R8, #08
BX LR
-
條件設定
先點開晶振圖示,點選
,勾選Output
。Creat Hex File
然後點選Debug,勾選
Use Simulator
,然後将Dialog DLL改成
DARMSTM.DLL
,将Parameter改成之前選擇的
-pSTM32F103ZE
。
4.編譯調試
第一步,點選
rubuild
圖示進行編譯
編譯完成後發現并沒有錯誤,可以進行下一步開始調試
第二步,點選
Debug
圖示進行調試
最後,點選step over逐漸,發現R5,R6,R7,R8與程式設定一緻
三、分析Hex檔案
1.打開Hex檔案
在之前檔案的路徑下找到Hex檔案,選擇打開,我們這裡打開方式用的記事本
- 在前面我們做的需要在晶振圖示下勾選creat hex file的步驟,将會生成hex檔案
2.擴充線性位址記錄
hex檔案的第一排字元稱之為
擴充線性位址記錄
,也稱為32位位址記錄或HEX386記錄
在第一行資料:020000040800F2中,其實際表達為
0x02 0x00 0x00 0x04 0x08 0x00 0xf2
。
- 第一個位元組 0x02表示本行資料的長度;
- 第二、三位元組 0x00 0x00表示本行資料的起始位址;
- 第四位元組 0x04表示資料類型,用來辨別擴充線性位址的記錄,資料類型有:0x00、0x01、0x02、0x03、0x04、0x05
'00' Data Rrecord:用來記錄資料,HEX檔案的大部分記錄都是資料記錄
'01' End of File Record: 用來辨別檔案結束,放在檔案的最後,辨別HEX檔案的結尾
'02' Extended Segment Address Record: 用來辨別擴充段位址的記錄
'03' Start Segment Address Record:開始段位址記錄
'04' Extended Linear Address Record: 用來辨別擴充線性位址的記錄
'05' Start Linear Address Record:開始線性位址記錄
- 然後是資料,0x08 0x00是位址的高16位
- 最後一個位元組 0xf2為校驗和,計算方法為:
。01h + NOT (02h+ 00h+ 00h +04h +08h+00h)
當一個擴充線性位址記錄被讀取,存儲于資料域的擴充線性位址被儲存,它被應用于從 Intel HEX 檔案讀取來的随後的記錄 線性位址保持有效,直到它被另外一個擴充位址記錄所改變 通過把記錄當中的位址域與被移位的來自擴充線性位址記錄的位址資料相加獲得資料記錄的絕對存儲器位址
3.資料部分
Intel HEX 由任意數量的十六進制記錄組成。每個記錄包含 5 個域,它們按一定格式排列:llaaaatt[dd…]cc
每一組字母對應一個不同的域,每一個字母對應一個十六進制編碼的數字。每一個域由至少兩個十六進制編碼數字組成,它們構成一個位元組
内容 | 描述 |
---|---|
ll | 資料長度域,它代表記錄當中資料位元組(dd)的數量 |
: | 每個Intel HEX記錄都由冒号開頭 |
aaaa | 位址域,它代表記錄當中資料的起始位址 |
tt | 代表HEX記錄類型的域,它可能是以下資料當中的一個:00(資料記錄)、01(檔案結束記錄)、02(擴充段位址記錄)、04(擴充線性位址記錄) |
dd | 資料域,它代表一個位元組的資料。一個記錄可以有許多資料位元組.記錄當中資料位元組的數量必須和資料長度域(ll)中指定的數字相符 |
cc | 表示這個記錄的校驗和(校驗和的計算是通過将記錄當中所有十六進制編碼數字對的值相加,以256為模進行以下補足) |
4.檔案尾
在檔案最後一排,是一個檔案結束的标志 :00000001FF
。
這是一個END OF FILE RECORD,辨別檔案的結尾
内容 | 描述 |
---|---|
00 | 記錄的長度為0 |
0000 | LOAD OFFSET為0000 |
02 | TYPE=01 |
FF | 校驗和為FF |
總結
本文簡單介紹了keil的安裝注冊,在keil環境下編譯調試了一個基于stm32彙程式設計式的編寫,了解了Hex檔案格式及其前8個位元組内容含義。在這過程中遇到了許多困難,幸好在參考資料和詢問同學下,慢慢解決了。期待更進一步!
參考資料:https://blog.csdn.net/qq_45659777/article/details/120496577
https://blog.csdn.net/qq_43279579/article/details/108880667?utm_source=app
https://blog.csdn.net/ssj925319/article/details/108919862