前言
參數:cortex-A7? 698Mhz? ?flash? 8GB? ? RAM? 512M DDR3
2個100M網口? 單核
初期:
一、安裝完虛擬機之后,第一步先設置文件之間可以相互拷貝復制,以及通過CRT連接到虛擬機等
折磨死人了啊啊啊啊啊啊
1、關于SSH怎么安裝指令都有,然后啟動SSH服務就行,查看等
入坑點:1.window下一定要看有沒有網絡適配器VM8這樣的,并且和主機,以及虛擬機三者在同一網絡下,如果沒有適配器,卸載重裝,刪除注冊表
2.NAT無法連接,必須橋接模式,然后查看ip地址必須是同一網段內的
3.設置網絡編輯器
4.一定虛擬機和window下相互ping通才行,然后CRT登錄Ubuntu的ip地址,以及用戶名就行了
二、第二個折磨死人的就是SAMBA,虛擬機映射到window了
參考:第四課:安裝samba映射網絡磁盤到本地_云服務器samba如何映射到本地-CSDN博客
其中靜態路由,最后啟用工作站那么起始都不需要,
配置文件可以這樣寫:無論是ubuntu的登錄名還是文件名都是dzc? ?
創建添加的samba的用戶名也是dzc密碼1,這個就是最后有個網絡憑證需要登錄的用戶名和密碼
還有一點,一定要使用橋接的方式,兩者之間也要ping通
防火墻要關掉,實在不行可以卸載重裝
還有一種方式就是使用僅主機模式,適用于同一臺電腦主機和虛擬機共享連接
第一步選擇VM1的主機模式
然后配置虛擬網絡編輯器
主機虛擬網卡配置
最后看主機和虛擬機之間能不能相互ping通,然后就可以登錄SECURE CRT 和SMBA了。
三、取任一個ubuntu軟件,第一步是交叉編譯工具安裝
第二步創建文件夾? ?拷貝過去之后,解壓文件? ?tar -xvf?
sudo cp gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ -f
添加環境變量:
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
設置完之后重啟生效,檢查版本號
第二步是安裝VSCODE :建議下載最新版
插件安裝
找到設置,字體,中文,不要使能預覽
下面的USB是串口,要用跳線帽修改
不建議使用引腳復用,會增加設備樹,很麻煩。
中期:準備上手
匯編學習:
.text? 代碼段
.data 初始化的數據段
.bss 未初始化的數據段
.rodata? 只讀數據段
__start:? 默認標號入口
匯編也可以寫函數
常用的匯編指令:
MOV指令:把一個寄存器拷貝到另一個寄存器中,或者將一個立即數傳遞到寄存器中,后面傳遞到前面。
MVO RO,R1
MRS指令:用于將特殊寄存器如CPSR,傳遞到普通的寄存器中,MRS R0,CPSR
MSR指令:用于將普通寄存器傳遞到特殊寄存器中,MSR CPSR, R0
BX是返回指令
存儲器訪問指令:LDR 指令,從存儲器加載數據到Rx中,LDR也可以把立即數加載到Rx中,LDR加載立即數的時候要用 = 不是 #?
常用的就是讀取CPU的寄存器值? LDR R0, = 0X0209C004? ? LDR R1, [R0]
STR 指令,就是將數據寫入存儲器中,比如LDR R0, 0X0209C004? LDR R1, = 0X20000002
STR R1, [R0]? 把R1的值寫入到R0所保存的地址中
壓棧和出棧指令:
PUSH {R0~R3, R12} @將 R0~R3 和 R12 壓棧
PUSH {LR}
?
出棧順序
POP {LR}
POP {R0~R3,R12}
?
跳轉指令:
如B,BL,BX,BLX等
直接向PC寄存器寫入數據
算數運算命令:
邏輯運算命令:
熟悉數據手冊和寄存器
1、先看原理圖找到對應使用的GPIO以及功能,然后手冊中在IOMUXC_SW_MUX_XX中先找到當前引腳,比如GPIO1_IO3,這個是他的復用寄存器,然后找到地址20E_0068h,寄存器表可以看出只有低5位有效,復用為普通的gpio的話就配置成0101,也就是0x05,(如果想配置成其他IIC或者USB功能配成其他數字)。/
2、然后要使能時鐘,找到時鐘標題,CCM,找到CCGR0-CCGR6,一般都是要全部使能就行,找到這7個寄存器組的地址,然后分別使能為0xFFFFFFFF。
比如地址是20C_4068h? ?通過STR 寫入0xFFFFFFFF,其他6個寄存器也一樣
3、然后是電氣寄存器,在手冊中找IOMUXC_SW_PAD_XX,由低位到高位依次是:
SRE:壓擺率? ? 默認為低,當需要高速IO時候,置1
DSE:設置IO的驅動能力? ?0表示輸出驅動關閉,為1看手冊,分母越大驅動能力越強
SPEED:設置IO速度,00 50M? 01 100M? 11 200M
ODE:開路輸出? ? 0關閉開漏,? 1打開開漏
PKE,上下拉保持? ? ? 0? 上拉保持? ? 1關閉上下拉
PUE設置狀態保持, 0 保持? 1上啦
PUS設置上下拉電阻, 00 100K? ? 11 22K
HYS:用不到,使能遲滯比較器
4、這幾個寄存器都找到之后,記錄地址,后面寫匯編初始化要用,然后就是配置GPIO功能,
找到Purpose Input/Output (GPIO)? GPIO的寄存器組? 看標題? 找到GPIO data register
注意:GPIO只是IO眾多復用的一個小配置,當你選擇把IO配置成GPIO后還需要,另外配置GPIO的一些功能,DR、 GDIR、 PSR、 ICR1、 ICR2、 EDGE_SEL、 IMR 和 ISR這八種寄存器
其中,一共5組,這里用GPIO1? 設置GPIO1_DR
數據寄存器DR??比如要設置 GPIO1_IO00 輸出高電平,那么就應該設置 GPIO1.DR=1
如果是輸入,那么就是讀取電平狀態
GDIR:設置IO的輸入還是輸出? 輸入0? 輸出1
PSR:功能和輸入狀態下的 DR 寄存器一樣
ICR1和ICR2這兩個寄存器,都是中斷控制寄存器, ICR1用于配置低16個GPIO, ICR2 用于配置高 16 個 GPIO
IMR用來控制GPIO的中斷禁止和使能,使能1,禁止0
ISR:中斷狀態寄存器,只要某個GPIO中斷發生,ISR相應位就是1,處理完中斷要清楚
EDGE_SEL 寄存器,這是邊沿選擇寄存器,會覆蓋ICR1和ICR2,無論設置多少都是雙邊沿觸發
這里控制LED,只需要設置DR和GDIR就行了。
LED實驗:引腳是IO3 GPIO1
對于Linux也就是cortex-A系列的開發,基本都要先寫匯編代碼,初始化外設部分
部分需要匯編初始化DDR,然后把指針SP指向DDR。
?如何查看對應的引腳和寄存器配置,Linux的引腳和電氣屬性是單獨兩個寄存器
引腳看這幾位就行
開發步驟:(如上)
先寫匯編程序:示例如下
.global _start @LED IO GPIO1—3
_start:@先初始化時鐘ldr r0, = 0x020c4068 @ccgr0ldr r1, = 0xffffffffstr r1, [r0] @數據寫入ldr r0, = 0x020c406C @CCM_CCGR1str r1, [r0]ldr r0, = 0x020c4070 @CCM_CCGR2str r1, [r0]ldr r0, = 0x020c4074 @CCM_CCGR3str r1, [r0]ldr r0, = 0x020c4078 @CCM_CCGR4str r1, [r0]ldr r0, = 0x020c407C @CCM_CCGR5str r1, [r0]ldr r0, = 0x020c4080 @CCM_CCGR6str r1, [r0]@配置復用寄存器屬性ldr r0, = 0x020E0068 ldr r1, = 0x05str r1, [r0]@配置電氣屬性
/*bit0 壓擺率
bit5:3 110 R0/6 驅動能力
bit7:6 10 100M
bit11 0 關閉
bit12 1 時能 pull
bit13
bit15:14 00 100k 下拉
bit16*/ldr r0, = 0x020E02F4ldr r1, = 0x10b0str r1, [r0]@設置gpio功能
/*找到gpio的基地址
bit 0 就是 io0 bit1就是io1 bit2就是io2 bit3就是io3
gpio1_dr 209_C000
gpio1_gdir 209_C004
gpio1_psr 209_C008
*/ldr r0, = 0x0209C004 @設置GDIR為輸出ldr r1, = 0x8str r1, [r0]/*打開LED*/ldr r0, = 0x0209C000 @設置dr為輸出ldr r1, = 0x0str r1, [r0]loop:b loop
然后寫驅動編譯程序:
把.c.s文件變成.o文件,先把匯編 變成目標文件
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
將所有的.o文件鏈接為elf格式的可執行文件,本實驗鏈接的起始地址是 0x87800000? ? ?(就是代碼運行的起始地址)可以指向內部的RAM也可以指向外部的DDR核心板中,
arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
將elf文件轉為bin文件,在32中,是可以直接把flash中的代碼拷貝到RAM中運行的,cortex-A的不能直接拷貝,需要把bin文件拷貝到SD卡中,然后放到設備的flash中運行。
arm-linux-gnueabihf-objcopy -O binary -g -S led.elf ?led.bin
將elf文件轉為匯編,反匯編,這樣RAM就可以識別了,RAM只認那15個寄存器
程序燒錄部分
32可以直接把代碼燒錄到內部flash中,cortex沒有內部flash,需要借助SD卡,EMMC,NAND,NOR,SPI flash等方式啟動,
1.需要把SD卡掛載到虛擬機中
2. 把F:\百度網盤下載\資料2\【正點原子】阿爾法Linux開發板(A盤)-基礎資料\05、開發工具\02、Ubuntu下裸機燒寫軟件 路徑下的??imxdownload文件拷貝到 編譯文件夾中,給權限
然后執行命令格式? ls /dev/sd* -l? 查看硬盤路徑? ? 插拔確認SD卡路徑
如果發現U盤或SD卡始終連接不到虛擬機,可以試著修改.vmx文件的
執行操作后,會把bin文件生成為load.imx文件
撥碼開關設置為SD卡啟動,重啟,點亮LED