跟韋老師學習嵌入式 LED總結

2021-07-02 13:30:06 字數 2865 閱讀 7746

本文內容由淺入深主要介紹了jz2440的led裸板程式,led的簡單驅動程式

arm開發板的裸板程式和51微控制器類似,需要通過配置暫存器來實現。s3c2440有130個i/o口,共分為a-j共9組。

1.硬體原理圖:

jz2440的硬體連線圖,如下圖所示:

從圖中可以看出led1、led2、led3、led4這四個led燈分別於gpb5-gpb8相連,因此需要通過控制gpb5-gpb8的暫存器的輸出來控制,led等的亮滅。

2.暫存器的配置

s3c2440的i/o口可以用於輸入、輸出或是其他特殊功能,因此需要有暫存器來對引腳的功能進行配置。gpb引腳的位置及配置可以從s3c2440手冊上查到,如下圖所示:

由上圖可以看出對gpb引腳進行設定的有4個暫存器,其中包括乙個保留的,即有三個暫存器來對gpb引腳進行設定。

這三個暫存器的功能如下:

gpbcon:主要用於配置,選擇引腳的功能。gpbdat:用於讀寫引腳,當引腳被設為輸入時,讀此暫存器可知相應引腳的電平狀態是高還是低;當引腳被設為輸出時,寫此暫存器相應位可令此引腳輸出高電平或低電平。gpbup暫存器:某位為1時,相應引腳無內部上拉電阻;為0時,相應引腳使用內不上拉電阻。

3、**分析

點亮led的c語言**很簡單,如下所示:

/*定義gpbcon的位址,其中的volatile主要是為了防止編譯器在編譯時對**進行優化,從而產生錯誤*/

#define gpbcon (*(volatile unsigned long*)0x56000010)

#define gpbdat (*(volatile unsigned long*)0x56000014)

int main()

gpbcon=0x00015400;//設定gpb5-gpb8位輸出埠

gpbdat=0x00000000;//gpb5-gpb8輸出0,led1-4點亮

1.驅動簡介

乙個軟體系統可以分為:應用程式、庫、作業系統、驅動程式四部分,其架構圖如下所示:

首先應用程式使用庫提供的open函式開啟代表led的裝置檔案;庫根據open函式傳入的引數執行swi指令,該指令引起系統呼叫;核心的異常處理函式根據這些引數找到對應的驅動程式,返回檔案的控制代碼;應用程式得到檔案控制代碼後,使用庫提供的write或ioctl函式發出控制命令;庫根據write或ioctl函式傳入的引數執行swi指令,這條指令會引起cpu異常,進入核心;核心的異常處理函式根據這些引數呼叫驅動程式的相關函式,點亮led。

linux的外設可以分為3類:字元裝置、塊裝置和網路裝置。字元裝置是能夠像位元組流一樣被訪問的裝置,對裝置的讀寫是以位元組為單位的。塊裝置的資料是以塊的形式存放的,如硬碟、u盤等。

2.原始碼分析

#define led_mator0

static unsignedlong led_table={

s3c2410_gpb(5),

s3c2410_gpb(6),

s3c2410_gpb(7),

s3c2410_gpb(8),

staticint s3c2440_leds_open(struct inode *inode,struct file *file)

int i;

for(i=0;i<4;i++)

s3c2410_gpio_cfgpin(led_table[i],s3c2410_gpio_output);//配置引腳為輸出

return 0;

staticint s3c2440_leds_ioctl(struct inode *inode,struct file *file,unsigned intcmd,unsigned long arg){

if(arg>4)

return –einval;

switch(cmd){

case ioctl_led_on:

s3c2410_gpio_setpin(led_table[arg],0);//設定引腳輸出電平為0

return 0;

case ioctl_led_off:

s3c2410_gpio_setpin(led_table[arg],1); //設定引腳輸出電平為1

return 0;

defaule:

return –einval;

/*驅動的操作函式集*/

static structfile_operations s3c2440_leds_fops={

.owner=this_module,

.open=s3c2440_leds_open,

.ioctl=s3c2440_leds_ioctl,

staticint  s3c2440_leds_init(void)

int ret;

ret=register_chrdev(led_mator,」leds」,&s3c2440_leds_fops);//向核心註冊驅動函式

if(ret<0)

return ret;

return 0;

staticvoid s3c2440_leds_exit(void)

unregister_chrdev(led_mator, 」leds」);//解除安裝驅動的函式

module_init(s3c2440_leds_init);//指定驅動程式的初始化函式

module_exit(s3c2440_leds_exit);//指定驅動程式的解除安裝函式

韋東山嵌入式linux學習筆記

第一課 原理圖之gpio和閘電路 generial peripheral input output 學習到的知識點 上拉電阻,和下拉電阻的認識和理解 以及梳理了一下閘電路。上拉電阻,下拉電阻一般都是和三極體配套使用,都是為了給懸空的的引腳 管中的一級 乙個確定的電壓狀態,並且起反相的作用。上拉電阻和...

韋東山嵌入式學習筆記 2018 5 17

arm開發板相當於一台小型電腦 開發板裝系統 軟體 jtag 使用方式 使用串列埠作為輸入 輸出,例如輸入一些命令,得到一些反饋資訊。2440開發板的硬體組成 cpu 記憶體 flash 硬碟 網絡卡 jtag 光碟機 串列埠 鍵盤 顯示器 jtag的使用 使用排線 jtag轉接板通過並口連線pc,...

如何學習嵌入式Linux 韋東山

版本 日期作者 說明v1 2020 韋東山適用於嵌入式linux初學者 我在100ask imx6ull售後群裡,發現很多初學者只有微控制器基礎,甚至沒有微控制器基礎。在學習linux時,對很多概念比較陌生,導致不知道學什麼,也不知道學了之後有什麼用。看原理圖,確定引腳是哪乙個,確定它輸出什麼電平才...