娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

ARM裸機開發:I.MX6U 啟動方式

發布者:PeacefulSoul最新更新時間:2024-09-02 來源: cnblogs關鍵字:ARM  裸機開發  I  啟動方式 手機看文章 掃描二維碼
隨時隨地手機看文章

一、硬件平臺:

正點原子I.MX6U阿爾法開發板

_533488159_IMG_20210803_235508_1628006109000_xg_0

二、啟動方式選擇

I.MX6U 支持多種啟動方式以及啟動設備,比如可以從 SD/EMMC、NAND Flash、QSPI Flash 等啟動。用戶可以根據實際情況,選擇合適的啟動設備。

芯片上電以后,芯片會根據 BOOT_MODE[1:0] 的設置來選擇 BOOT 方式, BOOT_MODE[1:0] 的值有兩者控制方式

  1. eFUSE(熔絲) 控制電平:修改 eFUSE 的方式通過熔斷對應的熔絲修改電平,該方式只能修改一次(不推薦)

  2. 修改 BOOT_MODE[1:0] 對應的 GPIO 高低電平來選擇啟動方式

I.MX6U 使用的是控制 IO 電平來控制啟動方式,原理圖上位置如下:

20211023214859

BOOT_MODE[1:0] 與啟動方式關系:

BOOT_MODE[1:0]BOOT 類型
00從FUSE 啟動
01串行下載
10內部BOOT 模式
11保留

一般我們使用 01 和 10 啟動方式

2.1 串行下載

BOOT_MODE[1:0] 為 01;

串行下載:可以通過 USB 或者 UART 將代碼下載到板子上的外置存儲設備中,比如載串行下載模式下,我們可以使用 OTG1 這個 USB 口向開發板上的 SD/EMMC、NAND 等存儲設備下載代碼

2.2 內部BOOT模式

BOOT_MODE[1:0] 為 10;

此模式下,芯片會執 行內部的 boot ROM 代碼,這段 boot ROM 代碼會進行部分硬件初始化,然后從 boot 設 備(就是存放代碼的設備、比如 SD/EMMC、NAND)中將代碼拷貝出來復制到指定的 RAM 中, 一般是 DDR

2.3 BOOT ROM初始化內容

在內部 BOOT 模式下,芯片執行 BOOT ROM 初始化內容,BOOT ROM 如何執行呢?

首先 BOOT ROM 代碼先初始化時鐘,按下下圖初始化各個時鐘總線的分配器

20211023220743

同時內部 boot ROM 為了加快執行速度會打開 MMU(內存管理單元) 和 Cache(緩存),下載鏡像的時候 L1 ICache(1級指令緩存) 會打 開,驗證鏡像的時候 L1 DCache、L2 Cache 和 MMU 都會打開。一旦鏡像驗證完成,boot ROM 就會關閉 L1 DCache、L2 Cache 和 MMU

之后中斷向量偏移會被設置到 boot ROM 的起始位置,當 boot ROM 啟動了用戶代碼以后就可以重新設置中斷向量偏移了

2.4 內部BOOT啟動設備

當 BOOT_MODE 設置為內部 BOOT 模式以后,可以從以下設備中啟動:

  • 接到 EIM 接口的 CS0 上的 16 位 NOR Flash

  • 接到 EIM 接口的 CS0 上的 NAND Flash

  • 接到 GPMI 接口上的 MLC/SLC NAND Flash,NAND Flash 頁大小支持 2KByte、4KByte 和 8KByte,8 位寬。

  • Quad SPI Flash。

  • 接到 USDHC 接口上的 SD/MMC/eSD/SDXC/eMMC 等設備。

  • SPI 接口的 EEPROM

關于啟動設備的選擇,I.MX 6U 同樣提供了 eFUSE 和 GPIO 量種配置方式,常用的是 GPIO 選擇啟動設備

啟動設備是通過 BOOT_CFG1[7:0]、BOOT_CFG2[7:0]和 BOOT_CFG4[7:0]這 24 個配置 IO,這 24 個配置 IO 剛好對應著 LCD 的 24 根數據線 LCD_DATA0~LCDDATA23,當啟動完成以后這 24 個 IO 就可以 作為 LCD 的數據線使用。這 24 根線和 BOOT_MODE1、BOOT_MODE0 共同組成了 I.MX6U 的啟動選擇引腳

雖然有 24 個 IO,但是實際需要調整的只有那幾個 IO,其它的 IO 全部下拉 接地即可,如下圖,大部分 IO 一直保持下拉接地,只有幾個 IO (BOOT_CFG2[7:0]和 BOOT_CFG1[7:0])需要我們關注:

20211023223523

IO 與啟動設備的關系如下圖:

20211023223713

各個模式間切換時,許多 IO 是基本保持不變的,所以進一步簡化,只需要 LCD_DATA3 ~ LCDDATA7、LCD_DATA11 這 6 個 IO 也被引出來了,其中 LCD_DATA11 就 是 BOOT_CFG2[3],LCD_DATA3~LCD_DATA7 就是 BOOT_CFG1[3]~BOOT_CFG1[7]

20211023223928

對應的設備模式如下:

20211023224114

所以 I.MX6U 開發板從 SD 卡、EMMC、NAND 啟動 的時候撥碼開關各個位設置方式如表

image.png

三、鏡像燒寫

學習 STM32 的時候我們可以直接將編譯生成的.bin 文件燒寫到 STM32 內部 flash 里面,但 I.MX6U 不能直接燒寫編譯生成的.bin 文件,我們需要在.bin 文件前面添加一些頭信息構成 滿足 I.MX6U 需求的最終可燒寫文件

I.MX6U 的最終可燒寫文件組成如下:

  • Image vector table,簡稱 IVT,IVT 里面包含了一系列的地址信息,這些地址信息在 ROM 中按照固定的地址存放著

  • Boot data,啟動數據,包含了鏡像要拷貝到哪個地址,拷貝的大小是多少等等

  • Device configuration data,簡稱 DCD,設備配置信息,重點是 DDR3 的初始化配置

  • 用戶代碼可執行文件,比如 led.bin

所以燒寫文件的最終組成為: IVT + Boot data + DCD + usr.bin;其中 IVT + Boot data + DCD 大小為3KB

IVT 包含了鏡像程序的入口點、指向 DCD 的指 針和一些用作其它用途的指針。內部 Boot ROM 要求 IVT 應該放到指定的位置,不同的啟動設備位置不同,而 IVT 在整個 load.imx 的最前面,其實就相當于要求 imx 文件在燒寫的時候應該燒寫到存儲設備的指定位置去。整個位置都是相對于存儲設備的起始地址的偏移

20211024122618

3.1 IVT + Boot data 存放內容:

20211024123412

header:

20211024123520

Tag 為一個字節長度,固定為 0XD1,Length 是兩個字節,保存著 IVT 長度,大端格式(高字節保存在低地址)最后的 Version 是一個字節,為 0X40 或者 0X41

entry:入口地址,也就是鏡像第一行指令所在的位置。 0X87800000 就是我們的鏈接地址

reserved1:保留位

dcd:DCD 地址,鏡像地址為 0X87800000,IVT+Boot Data+DCD 整個大小為 3KByte。因此 .imx 文件的起始地址就是 0X87800000-0XC00=0X877FF400

Boot Data:boot 地址,header 里面已經設置了 IVT 大小是 32 個 字節,其結構如下:

20211024123650

  • start 整個 load.imx 的起始地址,包括前面 1KByte 的地址偏移。

  • length 鏡像大小,這里設置 2MByte。鏡像大小不能超過 2MByte。

  • plugin 插件

self: IVT 復制到 DDR 中以后的首地址

csf: CSF 地址

reserved2:保留,未使用

3.2 DCD數據

復位以后,I.MX6U 片內的所有寄存器都會復位為默認值,但是這些默認值往往不是我們想要的值,有些外設我們必須在使用之前初始化它。為此 I.MX6U 提出了一個 DCD (Device Config Data) 的概念,和 IVT、Boot Data 一樣,DCD 也是添加到 load.imx 里面的,緊跟在 IVT 和 Boot Data 后面,IVT 里面也指定了 DCD 的位置。

DCD 其實就是 I.MX6U 寄存器地址和對應的配置信息集合,Boot ROM 會使用這些寄存器地址和配置集合來初始化相應的寄存器,比如 開啟某些外設的時鐘、初始化 DDR 等等。DCD 區域不能超過 1768Byte !

DCD 里面的初始化配置主要包括三方面:

  1. 設置 CCGR0~CCGR6 這 7 個外設時鐘使能寄存器,默認打開所有的外設時鐘

  2. 配置 DDR3 所用的所有 IO

  3. 配置 MMDC 控制器,初始化 DDR3


關鍵字:ARM  裸機開發  I  啟動方式 引用地址:ARM裸機開發:I.MX6U 啟動方式

上一篇:ARM裸機開發:C語言點亮LED
下一篇:s3c2410 MMU

推薦閱讀最新更新時間:2025-06-04 06:12

arm-linux-gcc 裸機程序開發(一)
以前開發arm裸機程序都是在ADS1.2開發環境下編譯和調試的。剛開始時初學嵌入式好多東西不懂,選擇這個開發環境的理由,一是資料多的,mini2440開發板上提供了很多例程可以參考,網上幾乎所有arm裸機程序都是基于ADS1.2開發的。二是開發環境友善,雖然后來感覺ADS1.2有點難用,但畢竟是IDE的環境,對初學者來說總比命令行的方式更加直觀與方便。隨著學習的深入,感覺它就像傻瓜相機一樣,雖然好用但屏蔽了很多內容,影響了我們深入理解代碼編譯以及鏈接的細節。而且ADS對于程序的開發沒有GNU工具鏈靈活。這段時間因為需要,又要編寫一些arm裸機程序。自己已經用Linux習慣了,不想再切回windows下工作了。所以,最近對linux
[單片機]
jz2440裸機開發與分析: 點亮LED燈之匯編語言
LED原理圖及2440寄存器說明 匯編語言編寫控制LED燈 .text /*.text部分是處理器開始執行代碼的地方,指定了后續編譯出來的內容放在代碼段*/ .global _start; /*.global關鍵字用來讓一個符號對鏈接器可見,可以供其他鏈接對象模塊使用;*/ /* 告訴編譯器后續跟的是一個全局可見的名字*/ /*.global _start讓_start符號成為可見的標識符,*/ /*這樣鏈接器就知道跳轉到程序中的什么地方并開始執行程序*/ _start: /*_start是一個函數的起始地址,也是編譯、鏈接后程序的起始地址*/ ldr r0, =0x
[單片機]
jz2440<font color='red'>裸機</font><font color='red'>開發</font>與分析: 點亮LED燈之匯編語言
第007課 裸機開發步驟和工具使用(SourceInght NotePad++使用)
001節_裸機開發步驟簡介 回憶大學在VC6.0上面學習C語言,操作大致流程如下: x86平臺,Windows應用程序:建立工程/項目,編輯源碼,編譯代碼(編譯器:VC6.0),運行。 在Ubuntu上學習C語言,操作大致流程如下: x86平臺,Ubuntu應用程序:編輯源碼,編譯代碼(編譯器:gcc),運行。 兩者是幾乎一致的。 名詞解釋: gcc: gcc是linux系統下主要的編譯軟件, gcc的全稱是GNU編譯器套件(GNU Compiler Collection), 除了可以編譯c語言開發的程序外,還可以開發C++、Java等多個語言的程序。 GCC的初衷是為GNU操作系統專門編寫的一款編譯器。
[單片機]
一起學mini2440裸機開發(十)mini2440外部中斷實驗
我今天一整天都在試著將TQ2440的那種處理中斷的方法(即安裝中斷向量表)移植到MDK中的mini2440,但是一直沒成功,這種方法一直沒成功,后來又想,還是先從最簡單的開始吧,就是不利用中斷向量表,直接像利用51單片機那樣的中斷一樣使用它,但是也沒成功。考慮到程序跑飛的可能性,將程序利用MDK中的Download功能下載到了Nor Flash中去,竟然行了,想了想原因,明白是怎么回事了。我原來是利用jlink調試的方法,這種調試方式是直接將程序放到了SDRAM的0x3000 0000處,如果發生中斷后,比如發生了普通中斷IRQ,那么PC指針被強制設為0x0000 0018,而我的程序是放在了0x3000 0000處,在地址0x
[單片機]
一起學mini2440<font color='red'>裸機</font><font color='red'>開發</font>(十)mini2440外部中斷實驗
雷神EM-i,讓吉利成為電混梯隊頭部玩家
新能源插混技術研發的初衷,就是為了讓車實現“可油可電”的運行方式,并且跑得更遠、續航更長、油耗更低。 因此,從這一角度來說,新能源插混車,就是介于傳統燃油車與電動車之間的一種新能源汽車。而且從行業的整體發展趨勢來看,插混車有一個必然發展路徑,那就是越來越貼近于純電動,盡可能減少內燃機的存在感。 當各大車企設立了這一發展目標后,都在試圖用技術的更新迭代,去達成這一目標。 在24年年初,比亞迪推出了第五代DM技術,通過更高效的電驅、更高熱效率的內燃機,實現了“續航超2000Km、油耗2字頭”的非凡成就。 其實在比亞迪樹立了電混系統的榜樣之后,同為頭部自主車企的吉利,也在想辦法用技術再次超越。并在10月底,發布了全
[汽車電子]
雷神EM-<font color='red'>i</font>,讓吉利成為電混梯隊頭部玩家
【51單片機】I/O口
總結 P0:無內置上拉電阻漏極開路雙向I/O口,可作為高阻抗輸入端使用。P0口做普通 I/O 時,需外接10KΩ上拉電阻。作低8位地址/數據總線時,不用外接上拉電阻。 P1 ~ P3:內置上拉電阻的雙向I/O口,各端口緩沖器可接收、輸出4個TTL門電路。 P0 ~ P3做輸入端時必須將P0 ~ P3口先置1。使內部場效應管截止,從而不影響輸入電平。 P0 ~ P3均可位操作。 下面的圖個樂,沒基礎的看這玩意就是揮刀自宮 1. P0 1個輸出鎖存器(D型觸發器) 2個三態緩沖器(控制讀引腳或讀鎖存器) 1個輸出驅動電路(1對場效應晶體管FET構成) 1個輸出控制端(1個與門、1個反相器、1個轉換開關MUX組成) 1.
[單片機]
【51單片機】<font color='red'>I</font>/O口
I2C與SPI的區別是什么 速率對比
I2C 與 SPI 對比 功能 I2C SPI 線數 2(SDA,SCL) 4(MOSI,MISO,SCLK,CS) 主機數量 =1 ==1 類型 半雙工 全雙工 回應機制 yes no 速度 =3.4Mbps high 應用 重要數據 大量數據 流控 yes no 設備地址 yes no 常規用途 命令 數據 I2C 和 SPI 的速率如下: I2C模式 速度 標準 100KHz 快速 400KHz 快速+ 1MHz 高速 3.4MHz SPI 速率:幾十 MHz 甚至上百 MHz,速度取決于 CPU 的 SPI 控制器和時鐘 clock STM32F103 的 SPI
[單片機]
stm32所有I/O和控制引腳的電流能力
疑問 :所有I/O和控制引腳上的總注入電流(4) ±25 照這句話 理解如果點個 10mA的光耦 那只能點 2只半了??那這個電流也太小了點吧? 答案:在注2中給出了注入電流的定義:當VIN VDD時,有一個正向注入電流;當VIN VSS時,有一個反向注入電流。 從這個定義可以看出,注入電流與正常的輸出電流和正常的入地的吸收(Sink)電流是不同的。注入電流是當VIN VDD時或當VIN VSS時才會出現,而正常的時候是不會有注入電流的。 正常的輸出電流和正常的入地的吸收(Sink)電流的極限值分別是:I VDD 和I VSS ,它們分別有150mA。 請注意,這個表里的參數是極限值,即如果任何一個參數超過了這里列
[單片機]
stm32所有<font color='red'>I</font>/O和控制引腳的電流能力
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 大英县| 胶州市| 罗平县| 兰考县| 曲松县| 奉新县| 东宁县| 五常市| 河北省| 怀化市| 喜德县| 贵州省| 新宁县| 乐山市| 上饶县| 舟山市| 大荔县| 锡林郭勒盟| 太仓市| 康平县| 扎兰屯市| 辉南县| 重庆市| 安溪县| 沈丘县| 邹平县| 盐边县| 淄博市| 通城县| 汕尾市| 温宿县| 铜梁县| 福州市| 托克逊县| 汉沽区| 昭觉县| 安丘市| 原平市| 咸阳市| 平南县| 天台县|