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

S5PV210 | 裸機按鍵檢測、控制外設實驗

發布者:GoldenSerenity最新更新時間:2024-12-05 來源: cnblogs關鍵字:S5PV210  裸機  按鍵檢測 手機看文章 掃描二維碼
隨時隨地手機看文章
  • 電路原理

HW-KEY

對應的GPIO口默認硬件上拉,有按鍵按下時對應的IO口變為低電平,將對應的GPIO口設置為輸入,檢測對應的電平即可檢測按鍵的動作。

將LED、BEEP、KEY相關的GPIO都初始化,然后進入while(1)死循環,不停的判斷按鍵的動作,一旦有按鍵按下,執行對應的if-else語句,然后控制對應的LED、BEEP。

  • DATASHEET(寄存器詳解)

  • 2.2.56 GPH0控制寄存器端口組

GPH0控制寄存器組包含4個控制寄存器:GPH0CON, GPH0DAT, GPH0PUD 和 GPH0DRV。

  • 2.2.56.1 Port Group GPH0 Control Register (GPH0CON, R/W, Address = 0xE020_0C00)

GPH0CON

  • 2.2.56.2 Port Group GPH0 Control Register (GPH0DAT, R/W, Address = 0xE020_0C04)

GPH0DAT

  • 2.2.56.3 Port Group GPH0 Control Register (GPH0PUD, R/W, Address = 0xE020_0C08)

GPH0DRV

  • 2.2.56.4 Port Group GPH0 Control Register (GPH0DRV, R/W, Address = 0xE020_0C0C)

GPH0PUD

2.2.58 PORT GROUP GPH2 CONTROL REGISTER

GPH2寄存器組詳解(此處省略,具體可查看文檔S5PV210_UM_REV1.1.pdf 中相關部分)


代碼編寫

demo源碼工程目錄詳解

06-key/

├── Makefile

└── source

    ├── beep.c

    ├── include

    │   ├── beep.h

    │   ├── include_all.h

    │   ├── key.h

    │   └── led.h

    ├── key.c

    ├── led.c

    ├── main.c

    └── start.S

 

2 directories, 10 files

其他(led、beep及start.S等)部分代碼請參考之前章節(裸機LED/BEEP)。


/*****************************************************

 *   > File Name: key.c

 *   > Author: fly

 *   > Create Time: 2021-07-02  5/26  13:57:16 +0800

 *==================================================*/

#include

#include

#include

 

typedef struct{

    unsigned int GPH0CON;

    unsigned int GPH0DAT;

    unsigned int GPH0PUD;

    unsigned int GPH0DRV;

}gph0;

#define GPH0    (*(volatile gph0 *)0xE0200C00)

 

typedef struct{

    unsigned int GPH2CON;

    unsigned int GPH2DAT;

    unsigned int GPH2PUD;

    unsigned int GPH2DRV;

}gph2;

#define GPH2    (*(volatile gph2 *)0xE0200C40)

 

void key_init(void)

{

    /*

     * POWER -> EINT1   -> GPH0_1

     * LEFT  -> EINT2   -> GPH0_2

     * DOWN  -> EINT3   -> GPH0_3

     * UP    -> KP_COL0 -> GPH2_0

     * RIGHT -> KP_COL1 -> GPH2_1

     * BACK  -> KP_COL2 -> GPH2_2

     * MENU  -> KP_COL3 -> GPH2_3

     */

    GPH0.GPH0CON = (GPH0.GPH0CON & ~(0xf<<4)) | (0x0<<4);

    GPH0.GPH0CON = (GPH0.GPH0CON & ~(0xf<<8)) | (0x0<<8);

    GPH0.GPH0CON = (GPH0.GPH0CON & ~(0xf<<12)) | (0x0<<12);

 

    GPH2.GPH2CON = (GPH2.GPH2CON & ~(0xf<<0)) | (0x0<<0);

    GPH2.GPH2CON = (GPH2.GPH2CON & ~(0xf<<4)) | (0x0<<4);

    GPH2.GPH2CON = (GPH2.GPH2CON & ~(0xf<<8)) | (0x0<<8);

    GPH2.GPH2CON = (GPH2.GPH2CON & ~(0xf<<12)) | (0x0<<12);

}

 

unsigned int keyPower_value(void)

{

    return (GPH0.GPH0DAT & (0x1<<1));

}

 

unsigned int key1_value(void)

{

    return (GPH0.GPH0DAT & (0x1<<2));

}

 

unsigned int key2_value(void)

{

    return (GPH0.GPH0DAT & (0x1<<3));

}

 

unsigned int key3_value(void)

{

    return (GPH2.GPH2DAT & (0x1<<0));

}

 

unsigned int key4_value(void)

{

    return (GPH2.GPH2DAT & (0x1<<1));

}

 

unsigned int key5_value(void)

{

    return (GPH2.GPH2DAT & (0x1<<2));

}

 

unsigned int key6_value(void)

{

    return (GPH2.GPH2DAT & (0x1<<3));

}

 

void tester_key(void)

{

    key_init();

    led_init();

    beep_init();

 

    while(1){

        if(!key1_value()){

            led_set_led1(1);

        }else{

            led_set_led1(0);

        }

 

        if(!key2_value()){

            led_set_led2(1);

        }else{

            led_set_led2(0);

        }

 

        if(!key3_value()){

            led_set_led3(1);

        }else{

            led_set_led3(0);

        }

 

        if(!key4_value()){

            led_set_led4(1);

        }else{

            led_set_led4(0);

        }

 

        if(!key5_value()){

            led_set_all_led(1);

        }else{

            //led_set_all_led(0);

        }

 

        if(!key6_value()){

            beep_set(1);

        }else{

            beep_set(0);

        }

#if 0

        if(keyPower_value())

        {

            beep_set(0);

        }

#endif /* 測試NG */        

    }

}

/***************************************************

 *   > File Name: main.c

 *   > Author: fly

 *   > Create Time: 2021-07-02  5/26  12:45:25 +0800

 *==================================================*/

#include

 

int main(int argc, char* argv[])

{

    tester_key();

    return 0;

}

Makefile文件:

# 將所有的.o文件鏈接成.elf文件,“-Ttext 0x0”

# 表示程序的運行地址是0x0,由于目前編寫的是位置

# 無關碼,可以在任一地址運行

# 將elf文件抽取為可在開發板上運行的bin文件

# 將elf文件反匯編保存在dis文件中,調試程序會用

# 添加文件頭

.PHONY: all clean tools

 

CROSS   ?= arm-linux-

NAME    := KEY

 

LD              := $(CROSS)ld

OC              := $(CROSS)objcopy

OD              := $(CROSS)objdump

CC              := $(CROSS)gcc

MK              := ../../tools/mk_image/mkv210_image

CFLAGS  := -nostdlib -Wall

 

INCDIR  := ./source/include

SRCDIR  := ./source

OBJS    := start.o

           beep.o

           led.o

           key.o

           main.o

 

OUTDIR  := output

 

all:$(NAME).bin

 

$(NAME).bin : $(OBJS)

        $(LD) -Ttext 0x0 -o $(NAME).elf $^

        $(OC) -O binary $(NAME).elf $(NAME).bin

        $(OD) -D $(NAME).elf > $(NAME)_elf.dis

        $(MK) $(NAME).bin

 

# 將當前目錄下存在的匯編文件及C文件編譯成.o文件

%.o : $(SRCDIR)/%.S

        $(CC) -o $@ $< -c $(CFLAGS) -I $(INCDIR)

%.o : $(SRCDIR)/%.c

        $(CC) -o $@ $< -c $(CFLAGS) -I $(INCDIR)

 

clean:

        $(RM) *.o *.elf *.bin *.dis *.sd

 

tools:

        make -C ../../tools/mk_image/


關鍵字:S5PV210  裸機  按鍵檢測 引用地址:S5PV210 | 裸機按鍵檢測、控制外設實驗

上一篇:S5PV210 | 裸機蜂鳴器實驗
下一篇:S5PV210 | 安裝交叉編譯工具鏈(toolchain)

推薦閱讀最新更新時間:2025-06-22 16:29

【ARM裸機s5pv210 】舊版本交叉編譯工具鏈配置
舊版本交叉編譯工具鏈的安裝 1.cd /usr/local/ mkdir arm tar -jxvf arm-2009q3.tar.bz2 cd /usr/local/arm/arm-2009q3/bin bash mk-arm-linux-.sh sudo gedit ~/.bashrc 添加 export PATH=/usr/local/arm/arm-2009q3/bin:$PATH source ~/.bashrc 2.安裝32位庫 sudo apt-get update apt-get update sudo apt-get install lib32ncurses5-dev 3./usr/local/arm/arm
[單片機]
朱老師ARM裸機學習筆記(二):S5PV210的內存映射
S5PV210簡介 S5PV210是基于ARM Crotex-A8架構32位CPU的微處理器。 內部擁有32根地址線和32位數據線,32根地址線決定了CPU的地址空間最大為4G,這4G的內存空間如何分配,就是內存映射 S5PV210內存映射 S5PV210 datasheet中section 01_02章節 MEMORY MAP有講。 內存分布圖如下 內存分布表如下 專業名詞解釋 ROM : Read Only Memory 只讀存儲器(只不能直接通過地址總線更改數據的存儲器) RAM : Ramdom Access Memory 隨機訪問存儲器 (隨機存儲器,指可以隨便在任何一個地址讀寫數據,例如內存;與之對應的是順序
[單片機]
朱老師ARM<font color='red'>裸機</font>學習筆記(二):<font color='red'>S5PV210</font>的內存映射
一種打破教科書上的按鍵檢測方法
傳統的教科書,無一例外都是采用delay的方法 檢測按鍵 ,但是這種方法有很多缺陷,今天發一貼說說,各位大俠不要見笑,初級菜鳥可以借鑒。 傳統的處理方法:在第一次檢測到有鍵按下時,執行一段延時 10ms 的子程序以后再確認該按鍵電平是否能保持閉合狀態的電平,如果保持閉合狀態電平,則確認為真正有鍵按下,從而消除抖動的影響. 缺點: 1. 傳統的處理方法執行 10ms 的延時子程序,會降低程序的實時性。 2. 傳統的處理方法一次按鍵動作的確認,只檢測兩次,在高抗干擾環境下的會有按鍵的誤動作。 建議: 1. 建議彈跳時間為 100ms 才可有效通過 EFT 雜訊認證。 2. 建議主程序中連續檢查 100ms 的穩定低電平才可認定按鍵按
[電源管理]
S5PV210中的定時器
什么是定時器? 定時器是SoC中常見外設 定時器與計數器。計數器是用來計數的(每隔一個固定時間會計一個數),因為計數器的技術時間周期是固定的,因此到了一定時間,只要用計數值乘以技術的時間周期就能得到一個時間段。這個時間段就是我們定的時間(這就是定時器了)。 定時器/計數器作為SoC的外設,主要用來實現定時執行代碼功能,定時器相對于SoC來說,就好像鬧鐘相對于人來說意義一樣 定時器有什么用? 定時器可以讓SoC在執行主程序的同時,可以(通過定時器)具有計時功能,到了一定時間(計時結束)后,定時器會產生中斷提醒CPU,CPU回去處理中斷并執行定時器中斷的isr從而去執行預先設定好的事件。 定時器就好像是CPU的秘書一樣,這
[單片機]
s5pv210 cpu運行debian
1.環境準備 sudo apt-get install binfmt-support qemu qemu-user-static debootstrap 2.獲取debian根文件系統 2.1.cd /opt 2.2.sudo debootstrap --foreign --arch armel wheezy wheezy_fs http://ftp.debian.org/debian/ 3.為chroot做準備 3.1.cp /usr/bin/qemu-arm-static /opt/wheezy_fs/usr/bin/ 3.2.sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINT
[單片機]
S5PV210的內存分配研究分析
S5PV210內存一般會使用SDRAM和DDR2 (DDR SDRAM),SDRAM的uboot啟動網絡已經有很多資料的,對于DDR2還有有很多疑惑,如果有錯誤的地方,請大家一定指出,醍醐灌頂,不勝感激。 1、S5PV210的memory map(物理地址) 如下圖:左圖是整個芯片的內存空間(物理地址),右圖是iROM部分的內存空間(BL0的地址貌似不是物理地址==) 尋址空間是4GB=232 前512是Boot area 接下是512M的DRAM0通道和512M的DRAM1通道,是存儲器的地址,用于DDR2 RAM尋址的,共1GB 后面是6個128M的SROM (Bank0~Bank5),用于總線型設備尋址的 接著2
[單片機]
<font color='red'>S5PV210</font>的內存分配研究分析
S5PV210時鐘域詳解
1、MSYS域: ARMCLK: 給CPU內核工作的時鐘,也就是所謂的主頻。 HCLK_MSYS: MSYS域的高頻時鐘。給(DMC0和DMC1)使用。 PCLK_MSYS: MSYS域的低頻時鐘。 HCLK_IMEM: 給iROM和iRAM(合稱iMEM)使用。 2、DSYS域: HCLK_DSYS: DSYS域的高頻時鐘。 PCLK_DSYS: DSYS域的低頻時鐘。 3、PSYS HCLK_PSYS: PSYS域的高頻時鐘。 PCLK_PSYS: PSYS域的低頻時鐘。 SCLK_ONENAND: 總結:210內部的各個外設都是接在(內部AMBA總線)總線上面的,AMBA總線有1條高頻分支叫AHB,有一條低頻分支
[單片機]
S5PV210進行LED流水燈實驗總結(基于九鼎科技開發板)
/* * 文件:LED.s * 作者:周金寶 * 描述:實現開發板上4顆LED的流水燈效果 */ #define GPD0CON 0xE02000A0 //這里要注意,芯片手冊上為了美觀,地址是0xE020_00A0 中間加了個“-”,復制粘帖的時候要去掉,要不然會報錯 #define GPD0DAT 0xE02000A4 #define GPJ0CON 0xE0200240 #define GPJ0DAT 0xE0200244 .global _start //把_start的鏈接屬性改為外部,消除警告 _start: ldr r0, =0X11111111 //將GPJ0所有引腳定義為output模式 ldr r1,
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 隆回县| 读书| 昌乐县| 鄱阳县| 娄烦县| 罗平县| 苏州市| 台江县| 紫阳县| 乡宁县| 绥中县| 泰兴市| 金寨县| 潍坊市| 怀宁县| 莱西市| 东乡县| 临沭县| 东阿县| 武城县| 阜宁县| 海城市| 哈尔滨市| 西昌市| 武威市| 秦安县| 东兴市| 随州市| 蓬莱市| 天津市| 元江| 青河县| 固原市| 易门县| 岳西县| 崇信县| 红安县| 梅河口市| 通榆县| 甘谷县| 于都县|