按鍵輸入實驗
#define gpioeout (*(volatile unsigned int )0xc001e000) // 輸出的電平
#define gpioeoutenb ((volatile unsigned int )0xc001e004) // 輸出使能
#define gpioealtfn0 ((volatile unsigned int )0xc001e020) // 對應的焊腳功能選擇
#define gpioealtfn1 ((volatile unsigned int )0xc001e024) // 對應的焊腳功能選擇
gpioa28 輸入
#define gpioaoutenb ((volatile unsigned int )0xc001a004) // 輸出使能
#define gpioaaltfn0 ((volatile unsigned int )0xc001a020) // 低16位 對應的焊腳功能選擇
#define gpioaaltfn1 ((volatile unsigned int )0xc001a024) // 高16位 對應的焊腳功能選擇
#define gpioapad ((volatile unsigned int *)0xc001a018) // 讀gpio值
void delay(int val);
void _start(void)
else
gpioeout |= (1<<13);//gpioe13 output 1 }}
void delay(int val)
用彙編來寫點燈程式
程式如下
.global _start // 全域性變數定義
_start:
ldr r0, =0xc001e020 // 將0xc001e020作為位址賦給r0
ldr r1, [r0] //將r0即位址0xc001e020的內容賦給r1
bic r1, r1, #(3<<26) //r1=r1 & ~(3<<26),因為bic自動取反
str r1,[r0] //將r1儲存到位址0xc001e020
ldr r0, =0xc001e004 // 設定成輸出
ldr r1, [r0]
orr r1, r1, #(1<<13);
str r1,[r0];
_loop: // 迴圈
ldr r0 , =0xc001e000 // 設定輸出值
ldr r1, [r0]
bic r1 , r1,#0x2000 // (1<<13) 與操作,設定為0 燈亮
str r1,[r0];
bl _delay // 執行延時函式
ldr r1, [r0]
orr r1 , r1,#0x2000 // (1<<13) 或操作,設定為1 燈滅
str r1,[r0];
bl _delay // 執行延時函式
b _loop // 繼續迴圈
_delay:
mov r4, #0x4000000
d_loop:
subs r4,r4,#1
cmp r4,#0
bne d_loop
mov pc , lr
注意:
1)檔案的字尾是大寫的s,小寫的.s編譯會不過的(編譯環境ubuntu18.04 arm-linux-gcc)
2)mov pc ,lr ---- 相當於子函式呼叫返回return
3)**塊可以直接用 name: 表示
4)對於_start 函式入口,需要在檔案頭定義成全域性變數
.global _start // 全域性變數定義
5)ldr和mov 的區別
ldr 是arm指令集中的
.ldr偽指令用於載入32位的立即數或乙個位址值到指定暫存器;
若載入的常數未超出 mov 或 mvn 的範圍,則使用 mov 或 mvn 指令代替該 ldr 偽指令
mov 是 16位的;
資料傳送指令.將 8 位立即數或暫存器(operand2)傳送到目標暫存器(rd)
6)bic 和 and 的區別
bic 會把對應位先取反再相與
位清除指令.將暫存器rn的值與operand2的值的反碼按位作邏輯與操作,結果儲存到 rd 中.指令格式如下:
bicrd,rn,operand2
bic r1,r1,#0x0f ;將 r1 的低 4 位清零,其它位不變
and 直接和對應數相與
邏輯與操作指令.將 operand2 值與暫存器 rn 的值按位作邏輯與操作,結果儲存到rd 中.指令格式如下:
and rd,rn,operand2
ands r0r0#x01 ;r0=r0&0x01取出最低位資料
7)str 的作用
str rd,addressing 儲存字資料 [addressing]←rd,addressing 索引 str
;str 指令用於將暫存器中的資料儲存到記憶體(儲存器位址).
8)bl和b的區別
b 跳轉指令.跳轉到指定的位址執行程,不能返回,使用於迴圈操作
bl帶鏈結的跳轉指令.指令將下一條指令的位址拷貝到 r14(即 lr)鏈結暫存器中,然後跳轉到指定位址執行程式.可以用mov pc , lr 返回到呼叫處
Linux驅動 按鍵驅動
開發板 tiny6410 核心版本 linux2.6.38 要想寫出案件驅動 需要複習的知識 1 混雜裝置的使用原理 2 系統呼叫驅動函式的原理 3 中斷處理機制 4 阻塞性裝置驅動的書寫規範 1 混雜裝置的註冊和使用比較簡單,以前也複習過,這裡不再複習 3 中斷處理機制 也有部落格內容中斷處理機制...
Linux系統按鍵驅動
linux系統下對於按鍵裝置不僅可以進行讀操作,還可以進行寫操作。對鍵盤 滑鼠等裝置進行寫操作可以實現模擬按鍵的功能。另外,想知道 dev input eventx分別是哪些裝置可以通過執行下面的命令進行檢視,如下所示 yuhaiping neolix cat proc bus input devi...
linux鍵盤按鍵驅動
1.先來介紹以下幾個結構體使用和函式,下面 中會用到 1 input dev驅動裝置結構體中常用成員如下 struct input dev2.然後開始寫 1 向核心申請input dev結構體 2 設定input dev的成員 3 註冊input dev 驅動裝置 4 初始化定時器和中斷 5 寫中斷...