ARM裸機開發:匯編LED燈實驗(I.MX6UL芯片)

      網友投稿 814 2025-03-31

      文章目錄

      ARM裸機開發:匯編LED燈實驗(I.MX6UL芯片)

      一、I.MX6UL的GPIO原理

      1.1 I.MX6UL IO命名

      1.2 I.MX6UL IO復用

      1.3 I.MX6UL IO配置

      1.4 I.MX6UL GPIO配置

      1.5 I.MX6UL時鐘使能

      二、開發板原理圖

      三、程序編寫

      四、編譯下載

      五、實驗現象

      ARM裸機開發:匯編LED燈實驗(I.MX6UL芯片)

      一、I.MX6UL的GPIO原理

      研究IMX6UL GPIO 原理前先回憶一下STM32GPIO配置流程,其主要分為4個步驟:

      使能指定 GPIO 的時鐘。

      初始化 GPIO,如輸出功能、上拉、速度等

      是否開啟 IO 復用將IO作為其它外設 引腳使用

      設置初始輸出的電平高低

      下面我們學習 IMX6UL 的 GPIO 原理也是按照這樣的流程來學習

      1.1 I.MX6UL IO命名

      學習前先了解一下 IMX 的命名方式,在以前學STM32時他的 IO 口是按照一組一組來命名的,如PA是一組,一組里面有16個 IO 口即 PA0-PA15;而在 IMX6UL里面命名方式則大不一樣,I.MX6UL 的 IO 主要分為兩類:SNVS 域IO和通用 IO

      SNVC域 IO 命名: IOMUXC_SNVC_SW_MUX_CTL_PAD_XX_XX,后面的 XX_XX 就是 GPIO 命名, 比如:BOOT_MODE0 等等

      通用 IO 命名: IOMUXC_SW_MUX_CTL_PAD_XX_XX,后面的 XX_XX 就是 GPIO 命名, 比如:GPIO1_IO01、UART1_TX_DATA、JTAG_MOD 等等

      具體IO文檔可以參考 IMX6UL 官方文檔

      1.2 I.MX6UL IO復用

      IO 復用是通過一個寄存器來控制的,這里我以 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00 為例子,翻閱手冊可以看到一個 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO01 的32位寄存器,寄存器如下:

      可以看到寄存器的地址為 20E_005CH 低5位用于模式控制分為 SION 和 MUX_MODE,其他的則是保留位

      MUX_MODE 的0到3位對應具體模式,具體有以下幾個:

      SION 的控制功能如下:

      以上就是 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00 的復用寄存器一個簡單的介紹,不同的 IO 他的復用寄存器不完全相同,需要根據手冊具體去查詢

      I.MX6U 的 GPIO 一共有 5 組:GPIO1、GPIO2、GPIO3、GPIO4 和 GPIO5, 其中 GPIO1 有 32 個 IO,GPIO2 有 22 個 IO,GPIO3 有 29 個 IO、GPIO4 有 29 個 IO,GPIO5 有 12 個 IO,一共有 124 個 GPIO

      1.3 I.MX6UL IO配置

      1.2 講述的是 IO 口的復用配置寄存器,但 IO 的具體工作配置還有另外一個寄存器進行控制,繼續以 GPIO1 組的 IO00 為例子;具體 IO 工作配置寄存器由 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00 控制,該寄存器如下:

      其不同位控制的 IO 配置功能不同,需要結合 IO 的工作原理圖來理解,上 IO 原理圖:

      寄存器分析:

      HYS(bit16): 對應圖中 HYS,用來使能遲滯比較器,在 IO 輸入時有效,可以用來對輸入波形進行處理,關于遲滯比較器可以看這篇文章 : 遲滯比較器;HYS 為 0 的時候禁止遲滯比較器,為 1 的時候使能遲滯比較器

      PUS(bit15:14): 圖中的 PUS,用來設置上下拉電阻的:

      PUE(bit13): 上圖沒有顯示,當 IO 作為輸入的時候,這個位用來設置 IO 是使用上下拉還是使用狀態保持器。為 0 的時候使用狀態保持器,當為 1 的時候使用上下拉。

      狀態保持器在 IO 作為輸入的時候才有用,當外部電路斷電以后此 IO 口可以保持住之前狀態。

      PKE(bit12): 對應圖中的 PKE,此位用來使能或者禁止上下拉或者狀態保持器功能,為 0 時禁止上下拉/狀態保持器,為 1 時使能上下拉和狀態保持器。

      ODE(bit11): 對應圖中的 ODE,當 IO 作為輸出的時候,此位用來禁止或者使能開路輸出,此位為 0 的時候禁止開路輸出,當此位為 1 的時候就使能開路輸出功能。

      SPEED(bit7:6): 對應圖中的 SPEED,當 IO 用作輸出的時候,此位用來設置 IO 速度

      DSE(bit5:3): 對應圖中 DSE,當 IO 用作輸出的時候用來設置 IO 的驅動能力, 總共有 8 個可選選項,如表所示:

      (3.3V 下 R0 是 260Ω,1.8V 下 R0 是 150Ω,接 DDR 的時候是 240Ω)

      SRE(bit0): 對應圖中的 SRE,設置壓擺率,當此位為 0 的時候是低壓擺率,當為 1 的時候是高壓擺率。

      壓擺率就是 IO 電平跳變所需要的時間,比如從 0 到 1 需要多少時 間,時間越小波形就越陡,說明壓擺率越高;反之,時間越多波形就越緩,壓擺率就越低。高速信號壓擺率要高,速度快;而要考慮電磁兼容性的話壓擺率要低

      壓擺率參考文章:運放壓擺率

      1.4 I.MX6UL GPIO配置

      1.2 和 1.3 講了IO 的復用與功能寄存器配置,1.4 小節分析 IO 眾多復用里面的一種 GPIO 的具體配置

      首先看一下 GPIO 的結構圖:

      結構中可以看到 IOMUXC 里面有 SW_MUX_CTL_PAD_* 和 SW_PAD_CTL_PAD__* 兩個寄存器用于配置 IO;而單獨的 GPIO 配置則是另外 8 個 GPIO 自己的寄存器進行配置;

      這 8 個寄存器介紹如下:

      首先看 GPIOx_DR 數據寄存器,由翻譯可以看到,DR 寄存器在 IO 的模式設置為 GPIO 且 GPIO 的輸入輸出方向確定好后,輸出狀態時 DR 寄存器里面的位可以控制 GPIO 的輸出值,輸入時則存儲輸入的狀態值,通過讀取可以獲取 GPIO 狀態,比如當 GPIO1_IO00 引腳接地,那么 GPIO1.DR 的 bit0 就是 0

      GPIOx_IR 方向寄存器,結構如下:

      GPIO_GDIR 作為方向控制,每個位指定了一位信號的方向,此寄存器用來設置某個 IO 的工作方向,是輸入還是輸出。同 樣的,每個 IO 對應一個位,如果要設置 GPIO 為輸入的話就設置相應的位為 0,如果要設置為輸出的話就設置為 1

      PSR 寄存器: GPIO 的狀態寄存器

      PSR 寄存器也是一個 GPIO 對應一個位,讀取相應的位即可獲取對應的 GPIO 的狀態,也就是 GPIO 的高低電平值,功能和輸入狀態下的 DR 寄存器一樣

      ICR1和ICR2 是中斷控制寄存器, ICR1用于配置低16個GPIO, ICR2 用于配置高 16 個 GPIO,以 ICR1 為例子:寄存器結構如下:

      兩位一組控制一個 GPIO 的中斷,和 STM32 的中斷類似,每一組可配置的選線如下:

      比如要設置 GPIO1_IO15 為上升沿觸發中斷,那么使用 GPIO1.ICR1=2<<30 就可以設置

      IMR : 中斷屏蔽寄存器,一個 GPIO 對應一個位,IMR 寄存器用來控制 GPIO 的中斷禁止和使能,1 對應中斷使能,0 則是禁止

      **ISR 是中斷狀態寄存器 ** :一個 GPIO 對應一個位,只要某個 GPIO 的中斷發生,那么 ISR 中相應的位就會被置 1,通過讀取值判斷中斷有沒有發生

      注意:處理完中斷以后,必須清除中斷標志位,清除方法就是向 ISR 中相應的位寫 1 清零

      EDGE_SEL 寄存器用來設置邊沿中斷,該寄存器會覆蓋 ICR1 和 ICR2 的設置,同樣是一 個 GPIO 對應一個位。如果相應的位被置 1,那么就相當與設置了對應的 GPIO 是上升沿和下降 沿(雙邊沿)觸發,寄存器如下

      1.5 I.MX6UL時鐘使能

      I.MX6U 有復雜的時鐘系統,每個外設的時鐘都可以獨立的使能或禁止,這樣可以關閉掉不使用的外設時鐘,起到 省電的目的,時鐘系統后面學習到在分析,當前先研究 IO 時鐘如何使能

      時鐘系統有關的模塊叫做 Clock Controller Module(CCM) ,其中控制時鐘使能的寄存器為CCM_CCGR0~CCM_CCGR6 這 7 個寄存器,這 7 個寄存器控制著 I.MX6U 的所有外設時鐘開關,CCM_CCGR0 結構體如圖:

      每 2 位控制一個外設的時鐘,控制功能如下:

      要使能對應的時鐘只要置位對應的時鐘控制位就行!

      二、開發板原理圖

      正點原子阿爾法LED燈原理圖如下:

      LED0 接到了 GPIO_3 上,GPIO_3 就是 GPIO1_IO03

      三、程序編寫

      程序編寫按照下面的流程進行編寫:

      使能IO時鐘

      設置IO復用功能

      配置IO運行功能

      配置具體GPIO寄存器

      設置輸入輸出

      使能IO時鐘

      配置 CCM 的 CCGR0-6 寄存器,開啟所有時鐘

      讀取立即數到 R0 、 R1,通過寄存器間接尋址將 R1 的值賦值給目標地址

      ldr r0, =0X020C4068 # CCGR0 ldr r1, =0XFFFFFFFF str r1, [r0] ldr r0, =0X020C406C # CCGR1 str r1, [r0] ldr r0, =0X020C4070 # CCGR2 str r1, [r0] ldr r0, =0X020C4074 # CCGR3 str r1, [r0] ldr r0, =0X020C4078 # CCGR4 str r1, [r0] ldr r0, =0X020C407C # CCGR5 str r1, [r0] ldr r0, =0X020C4080 # CCGR6 str r1, [r0]

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      設置IO復用功能

      ldr r0, =0X020E0068 # 將寄存器 SW_MUX_GPIO1_IO03_BASE 地址加載到 r0 中 ldr r1, =0X5 str r1,[r0] # 設置寄存器 SW_MUX_GPIO1_IO03_BASE 的 MODE 為5

      1

      2

      3

      配置IO運行功能

      # 模式配置 # bit 16:0 HYS關閉 # bit [15:14]: 00 默認下拉 # bit [13]: 0 kepper功能 # bit [12]: 1 pull/keeper使能 # bit [11]: 0 關閉開路輸出 # bit [7:6]: 10 速度100Mhz # bit [5:3]: 110 R0/6驅動能力 # bit [0]: 0 低轉換率 # 寄存器 SW_PAD_GPIO1_IO03_BASE ldr r0, =0X020E02F4 ldr r1, =0X10B0 str r1,[r0]

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      配置具體GPIO寄存器

      # 寄存器GPIO1_GDIR ldr r0, =0X0209C004 # 配置為輸出模式 ldr r1, =0X0000008 str r1,[r0]

      1

      2

      3

      4

      5

      設置GPIO輸入輸出值

      # 寄存器GPIO1_DR ldr r0, =0X0209C000 # 輸出低電平 ldr r1, =0 str r1,[r0]

      1

      2

      3

      4

      5

      在開頭添加一個全局入口聲明代碼

      .global _start _start # 需要運行的代碼

      1

      2

      3

      4

      結尾加一個死循環,防止程序結束

      loop: b loop

      1

      2

      四、編譯下載

      ARM裸機開發:匯編LED燈實驗(I.MX6UL芯片)

      編譯使用 makefile 進行編譯鏈接得到 .elf 文件,之后轉化為 .bin 文件,通過 imxdownload 到 sd 下插到開發板上進行 SD 啟動,具體步驟可以參考我之前的文章: Linux驅動開發:I.MX6UL 程序編譯下載(SD卡)

      五、實驗現象

      下載程序后,LED 燈點亮

      ARM Linux 單片機 匯編語言

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:微軟正式宣布Office2016預覽版內測計劃(microsoft office2017)
      下一篇:輕松防止在單元格中鍵入特殊或某些字符
      相關文章
      在线看亚洲十八禁网站| 亚洲国产精久久久久久久| 亚洲午夜国产精品无卡| 亚洲av无码专区在线播放 | 久久精品国产精品亚洲艾| 国产成人精品久久亚洲| 日韩亚洲人成网站| 亚洲欧美综合精品成人导航| 亚洲精品91在线| 亚洲欧洲日韩综合| 亚洲成人动漫在线观看| 亚洲精品亚洲人成在线麻豆| 亚洲综合在线成人一区| 中文字幕亚洲精品资源网| 精品亚洲成a人片在线观看少妇| 亚洲人成电影在在线观看网色| 久久亚洲成a人片| 香蕉蕉亚亚洲aav综合| 亚洲AV中文无码字幕色三| 亚洲丁香色婷婷综合欲色啪| 久久久久久a亚洲欧洲AV| 亚洲欧洲日产国码久在线观看 | 亚洲最大中文字幕无码网站| 亚洲人成色在线观看| 亚洲av无码一区二区三区在线播放 | 亚洲av乱码一区二区三区香蕉| 亚洲国产日韩精品| 亚洲乱妇熟女爽到高潮的片| 亚洲妇女无套内射精| 老子影院午夜伦不卡亚洲| 亚洲国产精品不卡毛片a在线| 国产精品亚洲w码日韩中文| 国产AV无码专区亚洲AWWW | 亚洲中文字幕无码中文| 豆国产96在线|亚洲| 亚洲男人第一无码aⅴ网站 | 国产亚洲精品AA片在线观看不加载| 亚洲综合图色40p| 图图资源网亚洲综合网站| 亚洲日本视频在线观看| 亚洲色成人四虎在线观看|