摘要:壓擺率就是電平跳變所需要的時間,比如從到需要多少時間,時間越小波形就越陡,說明壓擺率越高反之,時間越多波形就越緩,壓擺率就越低。
研究IMX6UL GPIO 原理前先回憶一下STM32GPIO配置流程,其主要分為4個步驟:
下面我們學(xué)習(xí) IMX6UL 的 GPIO 原理也是按照這樣的流程來學(xué)習(xí)
學(xué)習(xí)前先了解一下 IMX 的命名方式,在以前學(xué)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 官方文檔
IO 復(fù)用是通過一個寄存器來控制的,這里我以 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位對應(yīng)具體模式,具體有以下幾個:
MUX_MODE | 復(fù)用模式 |
---|---|
0000 | ALT0 復(fù)用為 IIC2_SCL |
0001 | ALT1 復(fù)用為 GPT1_CAPTURE1 |
0010 | ALT2 復(fù)用為 ANATOP_OTG1_ID |
0011 | ALT3 復(fù)用為 ENET1_REF_CLK1 |
0100 | ALT4 復(fù)用為 MQS_RIGHT |
0101 | ALT5 復(fù)用為 GPIO1_IO00 |
0110 | ALT6 復(fù)用為 ENET1_1588_EVENT0_IN |
0111 | ALT7 復(fù)用為 SRC_SYSTEM_RESET |
1000 | ALT8 復(fù)用為 WDOG3_WDOG_B |
SION 的控制功能如下:
SION | 功能 |
---|---|
0 | IO輸入路徑按照復(fù)用的模式來 |
1 | IO輸入路徑強(qiáng)制按照GPIO1——IO00來 |
以上就是 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00
的復(fù)用寄存器一個簡單的介紹,不同的 IO 他的復(fù)用寄存器不完全相同,需要根據(jù)手冊具體去查詢
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.2 講述的是 IO 口的復(fù)用配置寄存器,但 IO 的具體工作配置還有另外一個寄存器進(jìn)行控制,繼續(xù)以 GPIO1 組的 IO00 為例子;具體 IO 工作配置寄存器由 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00 控制,該寄存器如下:
其不同位控制的 IO 配置功能不同,需要結(jié)合 IO 的工作原理圖來理解,上 IO 原理圖:
寄存器分析:
HYS(bit16): 對應(yīng)圖中 HYS,用來使能遲滯比較器,在 IO 輸入時有效,可以用來對輸入波形進(jìn)行處理,關(guān)于遲滯比較器可以看這篇文章 : 遲滯比較器;HYS 為 0 的時候禁止遲滯比較器,為 1 的時候使能遲滯比較器
PUS(bit15:14): 圖中的 PUS,用來設(shè)置上下拉電阻的:
位 | 功能 |
---|---|
00 | 100k 下拉 |
01 | 47k 上拉 |
10 | 100k 上拉 |
11 | 22k 上拉 |
PUE(bit13): 上圖沒有顯示,當(dāng) IO 作為輸入的時候,這個位用來設(shè)置 IO 是使用上下拉還是使用狀態(tài)保持器。為 0 的時候使用狀態(tài)保持器,當(dāng)為 1 的時候使用上下拉。
狀態(tài)保持器在 IO 作為輸入的時候才有用,當(dāng)外部電路斷電以后此 IO 口可以保持住之前狀態(tài)。
PKE(bit12): 對應(yīng)圖中的 PKE,此位用來使能或者禁止上下拉或者狀態(tài)保持器功能,為 0 時禁止上下拉/狀態(tài)保持器,為 1 時使能上下拉和狀態(tài)保持器。
ODE(bit11): 對應(yīng)圖中的 ODE,當(dāng) IO 作為輸出的時候,此位用來禁止或者使能開路輸出,此位為 0 的時候禁止開路輸出,當(dāng)此位為 1 的時候就使能開路輸出功能。
SPEED(bit7:6): 對應(yīng)圖中的 SPEED,當(dāng) IO 用作輸出的時候,此位用來設(shè)置 IO 速度
位設(shè)置 | 速度 |
---|---|
00 | 低速 50M |
01 | 中速 100M |
10 | 中速 100M |
11 | 最大速度 200M |
DSE(bit5:3): 對應(yīng)圖中 DSE,當(dāng) IO 用作輸出的時候用來設(shè)置 IO 的驅(qū)動能力, 總共有 8 個可選選項(xiàng),如表所示:
(3.3V 下 R0 是 260Ω,1.8V 下 R0 是 150Ω,接 DDR 的時候是 240Ω)
位設(shè)置 | 速度 |
---|---|
000 | 輸出驅(qū)動關(guān)閉 |
001 | R0 **** |
010 | R0/2 |
011 | R0/3 |
100 | R0/4 |
101 | R0/5 |
110 | R0/6 |
111 | R0/7 |
SRE(bit0): 對應(yīng)圖中的 SRE,設(shè)置壓擺率,當(dāng)此位為 0 的時候是低壓擺率,當(dāng)為 1 的時候是高壓擺率。
壓擺率就是 IO 電平跳變所需要的時間,比如從 0 到 1 需要多少時 間,時間越小波形就越陡,說明壓擺率越高;反之,時間越多波形就越緩,壓擺率就越低。高速信號壓擺率要高,速度快;而要考慮電磁兼容性的話壓擺率要低
壓擺率參考文章:運(yùn)放壓擺率
1.2 和 1.3 講了IO 的復(fù)用與功能寄存器配置,1.4 小節(jié)分析 IO 眾多復(fù)用里面的一種 GPIO 的具體配置
首先看一下 GPIO 的結(jié)構(gòu)圖:
結(jié)構(gòu)中可以看到 IOMUXC 里面有 SW_MUX_CTL_PAD_* 和 SW_PAD_CTL_PAD__* 兩個寄存器用于配置 IO;而多帶帶的 GPIO 配置則是另外 8 個 GPIO 自己的寄存器進(jìn)行配置;
這 8 個寄存器介紹如下:
首先看 GPIOx_DR 數(shù)據(jù)寄存器,由翻譯可以看到,DR 寄存器在 IO 的模式設(shè)置為 GPIO 且 GPIO 的輸入輸出方向確定好后,輸出狀態(tài)時 DR 寄存器里面的位可以控制 GPIO 的輸出值,輸入時則存儲輸入的狀態(tài)值,通過讀取可以獲取 GPIO 狀態(tài),比如當(dāng) GPIO1_IO00 引腳接地,那么 GPIO1.DR 的 bit0 就是 0
GPIOx_IR 方向寄存器,結(jié)構(gòu)如下:
GPIO_GDIR 作為方向控制,每個位指定了一位信號的方向,此寄存器用來設(shè)置某個 IO 的工作方向,是輸入還是輸出。同 樣的,每個 IO 對應(yīng)一個位,如果要設(shè)置 GPIO 為輸入的話就設(shè)置相應(yīng)的位為 0,如果要設(shè)置為輸出的話就設(shè)置為 1
PSR 寄存器: GPIO 的狀態(tài)寄存器
PSR 寄存器也是一個 GPIO 對應(yīng)一個位,讀取相應(yīng)的位即可獲取對應(yīng)的 GPIO 的狀態(tài),也就是 GPIO 的高低電平值,功能和輸入狀態(tài)下的 DR 寄存器一樣
ICR1和ICR2 是中斷控制寄存器, ICR1用于配置低16個GPIO, ICR2 用于配置高 16 個 GPIO,以 ICR1 為例子:寄存器結(jié)構(gòu)如下:
兩位一組控制一個 GPIO 的中斷,和 STM32 的中斷類似,每一組可配置的選線如下:
位設(shè)置 | 速度 |
---|---|
00 | 低電平觸發(fā) |
01 | 高電平觸發(fā) |
10 | 上升沿觸發(fā) |
11 | 下降沿觸發(fā) |
比如要設(shè)置 GPIO1_IO15 為上升沿觸發(fā)中斷,那么使用 GPIO1.ICR1=2<<30 就可以設(shè)置
IMR : 中斷屏蔽寄存器,一個 GPIO 對應(yīng)一個位,IMR 寄存器用來控制 GPIO 的中斷禁止和使能,1 對應(yīng)中斷使能,0 則是禁止
**ISR 是中斷狀態(tài)寄存器 ** :一個 GPIO 對應(yīng)一個位,只要某個 GPIO 的中斷發(fā)生,那么 ISR 中相應(yīng)的位就會被置 1,通過讀取值判斷中斷有沒有發(fā)生
注意:處理完中斷以后,必須清除中斷標(biāo)志位,清除方法就是向 ISR 中相應(yīng)的位寫 1 清零
EDGE_SEL 寄存器用來設(shè)置邊沿中斷,該寄存器會覆蓋 ICR1 和 ICR2 的設(shè)置,同樣是一 個 GPIO 對應(yīng)一個位。如果相應(yīng)的位被置 1,那么就相當(dāng)與設(shè)置了對應(yīng)的 GPIO 是上升沿和下降 沿(雙邊沿)觸發(fā),寄存器如下
I.MX6U 有復(fù)雜的時鐘系統(tǒng),每個外設(shè)的時鐘都可以獨(dú)立的使能或禁止,這樣可以關(guān)閉掉不使用的外設(shè)時鐘,起到 省電的目的,時鐘系統(tǒng)后面學(xué)習(xí)到在分析,當(dāng)前先研究 IO 時鐘如何使能
時鐘系統(tǒng)有關(guān)的模塊叫做 Clock Controller Module(CCM) ,其中控制時鐘使能的寄存器為CCM_CCGR0~CCM_CCGR6 這 7 個寄存器,這 7 個寄存器控制著 I.MX6U 的所有外設(shè)時鐘開關(guān),CCM_CCGR0 結(jié)構(gòu)體如圖:
每 2 位控制一個外設(shè)的時鐘,控制功能如下:
位設(shè)置 | 時鐘控制 |
---|---|
00 | 所有模式下都關(guān)閉外設(shè)時鐘。 |
01 | 只有在運(yùn)行模式下打開外設(shè)時鐘,等待模式和停止模式下均關(guān)閉外設(shè)時鐘。 |
10 | 未使用(保留位)。 |
11 | 除了停止模式以外,其他所有模式下時鐘都打開。 |
要使能對應(yīng)的時鐘只要置位對應(yīng)的時鐘控制位就行!
正點(diǎn)原子阿爾法LED燈原理圖如下:
LED0 接到了 GPIO_3 上,GPIO_3 就是 GPIO1_IO03
程序編寫按照下面的流程進(jìn)行編寫:
配置 CCM 的 CCGR0-6 寄存器,開啟所有時鐘
讀取立即數(shù)到 R0 、 R1,通過寄存器間接尋址將 R1 的值賦值給目標(biāo)地址
ldr r0, =0X020C4068 # CCGR0ldr r1, =0XFFFFFFFF str r1, [r0] ldr r0, =0X020C406C # CCGR1str r1, [r0]ldr r0, =0X020C4070 # CCGR2str r1, [r0]ldr r0, =0X020C4074 # CCGR3str r1, [r0]ldr r0, =0X020C4078 # CCGR4str r1, [r0]ldr r0, =0X020C407C # CCGR5str r1, [r0]ldr r0, =0X020C4080 # CCGR6str r1, [r0]
ldr r0, =0X020E0068 # 將寄存器 SW_MUX_GPIO1_IO03_BASE 地址加載到 r0 中l(wèi)dr r1, =0X5 str r1,[r0] # 設(shè)置寄存器 SW_MUX_GPIO1_IO03_BASE 的 MODE 為5
# 模式配置# bit 16:0 HYS關(guān)閉# bit [15:14]: 00 默認(rèn)下拉# bit [13]: 0 kepper功能# bit [12]: 1 pull/keeper使能# bit [11]: 0 關(guān)閉開路輸出# bit [7:6]: 10 速度100Mhz# bit [5:3]: 110 R0/6驅(qū)動能力# bit [0]: 0 低轉(zhuǎn)換率# 寄存器 SW_PAD_GPIO1_IO03_BASEldr r0, =0X020E02F4 ldr r1, =0X10B0str r1,[r0]
# 寄存器GPIO1_GDIRldr r0, =0X0209C004# 配置為輸出模式ldr r1, =0X0000008 str r1,[r0]
# 寄存器GPIO1_DRldr r0, =0X0209C000# 輸出低電平ldr r1, =0 str r1,[r0]
在開頭添加一個全局入口聲明代碼
.global _start_start# 需要運(yùn)行的代碼
結(jié)尾加一個死循環(huán),防止程序結(jié)束
loop: b loop
編譯使用 makefile 進(jìn)行編譯鏈接得到 .elf 文件,之后轉(zhuǎn)化為 .bin 文件,通過 imxdownload 到 sd 下插到開發(fā)板上進(jìn)行 SD 啟動,具體步驟可以參考我之前的文章: Linux驅(qū)動開發(fā):I.MX6UL 程序編譯下載(SD卡)
下載程序后,LED 燈點(diǎn)亮
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/118979.html
摘要:可是在現(xiàn)實(shí)操作過程中總有一種方式出現(xiàn)問題,這就不得不提到現(xiàn)實(shí)情況下單片機(jī)的驅(qū)動能力對實(shí)驗(yàn)結(jié)果的影響。但是在現(xiàn)實(shí)中由于單片機(jī)驅(qū)動能力的影響往往第一種是無法點(diǎn)亮燈的。 一、LED燈與單片機(jī)的連接方式 ? ? ? ? ?在proteus仿真中,無論LED燈是負(fù)極連接IO端口,正極通過電阻連接VCC...
摘要:轉(zhuǎn),通過調(diào)節(jié)外置的電阻,能控制高亮度燈的驅(qū)動電流,使燈亮度達(dá)到預(yù)期恒定亮度,流過高亮度燈的電流可從幾毫安到安培變化。 12V轉(zhuǎn)3.3VLED驅(qū)動芯片AH2030是一款高效率,穩(wěn)定可靠的高亮度 LED燈驅(qū)動控制 IC ,內(nèi)置高精度比較器,off-time控制電路,恒流驅(qū)動控制電路等,特別適合大...
摘要:單片機(jī)入門指南本文基于常神文章基礎(chǔ)上將單片機(jī)入門部分進(jìn)行細(xì)化盡可能細(xì)節(jié)做到可實(shí)施性先引用一下常神的文章首先假設(shè)大家已經(jīng)對高中物理的電路部分有所了解。單片機(jī),如,是一種根據(jù)程序控制引腳高低電平的可編程器件,有些場合又將這種行為稱作嵌入式。 ...
摘要:大信刷抖音時,偶然蹦出了聯(lián)盛德物聯(lián)開發(fā)板這個廣告。板子做的很精致,毫米厚的板子,平滑的板邊緣,亮紫色和鍍金的過孔透露著高檔品質(zhì),同時收到售后支持的加好友,在售后支持指導(dǎo)下加入了聯(lián)盛德官方的開發(fā)群里,開始了開發(fā)測試工作。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...
摘要:前言芯片接口占用管腳數(shù)量比以太網(wǎng)的少,版線布局可更精簡。網(wǎng)卡芯片介紹接口網(wǎng)卡芯片是為方物聯(lián)網(wǎng)行業(yè)進(jìn)以太網(wǎng)通信而開發(fā)出的解決方案。此應(yīng)用可用于監(jiān)控家庭物聯(lián)網(wǎng)網(wǎng)關(guān)搭建等。 前言 ????DM9051NP芯片?SPI接口占用管腳數(shù)量比以太網(wǎng)PHY的RMII/MII少,PCBA版線布局可更精簡。...
閱讀 1605·2021-09-23 11:31
閱讀 920·2021-09-23 11:22
閱讀 1336·2021-09-22 15:41
閱讀 4062·2021-09-03 10:28
閱讀 2906·2019-08-30 15:55
閱讀 3536·2019-08-30 15:55
閱讀 1941·2019-08-30 15:44
閱讀 2712·2019-08-30 13:50