主頁 >  其他 > Linux驅動開發:匯編LED燈實驗(I.MX6UL芯片)

Linux驅動開發:匯編LED燈實驗(I.MX6UL芯片)

2021-09-03 19:53:30 其他

文章目錄

  • Linux驅動開發:匯編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時鐘使能
    • 二、開發板原理圖
    • 三、程式撰寫
    • 四、編譯下載
    • 五、實驗現象

Linux驅動開發:匯編LED燈實驗(I.MX6UL芯片)

一、I.MX6UL的GPIO原理

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

  1. 使能指定 GPIO 的時鐘,
  2. 初始化 GPIO,如輸出功能、上拉、速度等
  3. 是否開啟 IO 復用將IO作為其它外設 引腳使用
  4. 設定初始輸出的電平高低

下面我們學習 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_IO01UART1_TX_DATAJTAG_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位對應具體模式,具體有以下幾個:

MUX_MODE復用模式
0000ALT0 復用為 IIC2_SCL
0001ALT1 復用為 GPT1_CAPTURE1
0010ALT2 復用為 ANATOP_OTG1_ID
0011ALT3 復用為 ENET1_REF_CLK1
0100ALT4 復用為 MQS_RIGHT
0101ALT5 復用為 GPIO1_IO00
0110ALT6 復用為 ENET1_1588_EVENT0_IN
0111ALT7 復用為 SRC_SYSTEM_RESET
1000ALT8 復用為 WDOG3_WDOG_B

SION 的控制功能如下:

SION功能
0IO輸入路徑按照復用的模式來
1IO輸入路徑強制按照GPIO1——IO00來

以上就是 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,用來設定上下拉電阻的:

功能
00100k 下拉
0147k 上拉
10100k 上拉
1122k 上拉

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 速度

位設定速度
00低速 50M
01中速 100M
10中速 100M
11最大速度 200M

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

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

位設定速度
000輸出驅動關閉
001R0 ****
010R0/2
011R0/3
100R0/4
101R0/5
110R0/6
111R0/7

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 的中斷類似,每一組可配置的選線如下:

位設定速度
00低電平觸發
01高電平觸發
10上升沿觸發
11下降沿觸發

比如要設定 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 位控制一個外設的時鐘,控制功能如下:

位設定時鐘控制
00所有模式下都關閉外設時鐘,
01只有在運行模式下打開外設時鐘,等待模式和停止模式下均關閉外設時鐘,
10未使用(保留位),
11除了停止模式以外,其他所有模式下時鐘都打開,

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

二、開發板原理圖

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

LED0 接到了 GPIO_3 上,GPIO_3 就是 GPIO1_IO03

三、程式撰寫

程式撰寫按照下面的流程進行撰寫:

  1. 使能IO時鐘
  2. 設定IO復用功能
  3. 配置IO運行功能
  4. 配置具體GPIO暫存器
  5. 設定輸入輸出
  • 使能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]
  • 設定IO復用功能
ldr r0, =0X020E0068	# 將暫存器 SW_MUX_GPIO1_IO03_BASE 地址加載到 r0 中
ldr r1, =0X5		
str r1,[r0]		# 設定暫存器 SW_MUX_GPIO1_IO03_BASE 的 MODE 為5
  • 配置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]
  • 配置具體GPIO暫存器
# 暫存器GPIO1_GDIR
ldr r0, =0X0209C004
# 配置為輸出模式
ldr r1, =0X0000008		
str r1,[r0]
  • 設定GPIO輸入輸出值
# 暫存器GPIO1_DR
ldr r0, =0X0209C000
# 輸出低電平
ldr r1, =0		
str r1,[r0]

在開頭添加一個全域入口宣告代碼

.global _start

_start
# 需要運行的代碼

結尾加一個死回圈,防止程式結束

loop:
	b loop 	

四、編譯下載

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

五、實驗現象

下載程式后,LED 燈點亮

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297214.html

標籤:其他

上一篇:單片機畢業設計 - 選題推薦 (二)

下一篇:【51單片機】??萬物互聯??一招搞定單片機(持續更新中......)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more