基於S3C2440的ARM9基礎程式設計及分析

2022-09-03 00:33:26 字數 3288 閱讀 3361

#define led1_off (1<<5)

#define led2_off (1<<6)

#define led3_off (1<<7)

#define led4_off (1<<8)

//led初始化函式,設定gpbcon為輸出埠,並往埠送資料,使所有led處於滅的狀態

void ledinit()

//led輪流閃亮函式,先點亮對應led,然後延時,再關閉

void ledrun()

二 按鍵中斷程式

流程:中斷處理流程

1 中斷控制器匯集各類外設發出的中斷訊號,然後告訴cpu

2 cpu儲存當前程式的執行環境,然後呼叫中斷服務程式來處理中斷

3 在isr中通過讀取中斷控制暫存器,外設相關的暫存器來識別是哪個中斷,並進行相應的處理

4 清楚中斷:通過讀寫相關的中斷控制暫存器和外設相關暫存器來實現

5 最好恢復被中斷程式的環境,繼續執行

按鍵中斷程式流程:

初始化1 設定按鍵對應的埠為中斷(gpxcon)

2 設定中斷程式入口

3 清外部中斷掛起暫存器einitpend和掛起暫存器intpnd,srcpnd,防止原有干擾

4 設定電平觸發方式(extinitn)

5 關閉外部中斷entmask和intmask對中斷的遮蔽

中斷程式

6清掛起暫存器intpnd,srcpnd,防止反覆響應該中斷

7 通過判斷reinitpend相應的位來確定是哪乙個按鍵產生的中斷,然後執行相應的程式,並清除reinitpend相應的位,防止反覆的響應

程式:static void __irq keyhander();//宣告中斷處理函式

//按鍵初始化函式

void keyinit()

//按鍵響應函式

void keyhander()

if(reintpend & 1<<11)

if(reintpend & 1<<13)

if(reintpend & 1<<14)

}三 定時器中斷程式

cpu時鐘設定流程

1 設定mpllcon暫存器設定fclk

2 設定clkdivn暫存器設定fclk:hclk:pclk的值

時鐘設定流程

初始化1 設定分頻值tcfg0 tcfg1

2 設定定時器計數值 tcntb0

3 設定中斷程式入口,清掛起暫存器和關閉mask遮蔽

4 更新tctnb0和tcmtb0的值 tccon

5 將tccon清0,否則就會cpu就會一直在更新

啟動定時器

6 啟動定時器,tccon

中斷函式

清掛起暫存器,執行響應**

void setsysclk()//fclk=405mhz fclk:hclk:pclk=1:4:8

void timer0init()//pclk=50mhz

static void __irq timer0handle()

四,串列埠傳送程式

流程:初始化

1 設定相應的gpio埠為串列埠輸出埠

2 設定串列埠發生資料格式ulconn

3 設定接收和發生方式 ulconn

4 設定波特率rubrdivn

傳送資料

5 等待傳送緩衝區為空 rutrstatn

6 向發生資料暫存器寫資料 utxhn

程式:void uartinit(int num, int buad)

for( i=0; i != 100; ++i);//延時,使設定生效

}void uartprintf(char *fmt, ...)

void uartsendstring(char *str)

void uartsendbyte(char byte)

}五,adc轉換程式

流程初始化

1 設定轉換通道和轉換頻率adcconn

2 清相應的中斷掛起暫存器,設定中斷入口程式,取消mask遮蔽

啟動3 設定adcconn相應的位啟動轉換

中斷服務程式

4通過subsrcpnd判斷是不是普通的adc轉換

5 清subsrcpnd相應的位

6 讀取轉換值 adcdatn

程式void adcinit()

static void __irq adchandle() }

六,觸控螢幕程式

流程:初始化

1 設定取樣延時和分頻值adcdly adccon

2 中斷相關設定

3 設定觸控螢幕ad轉換為等待中斷模式 adctsc

中斷服務函式

4清相關掛起暫存器

5設定轉換模式,一般為連續x,y轉換

6 啟動轉換

7 轉換完成後讀取x y座標adcdat0 adcdat1

8 設定觸控螢幕ad轉換為等待中斷模式,設定等待彈起中斷adctsc

9 彈起中斷發生後,設定觸控螢幕轉換為等待中斷模式,等待下一次觸筆按下radctsc

程式void touchpendinit()

void adcinit()

static void __irq adchandle()

if(rsubsrcpnd & (1<<10))//判斷是不是有adc普通轉換產生的中斷}}

}七,lcd程式

流程:初始化

1 埠初始化,設定相應的埠為lcd埠

2 顯示模式初始化,設定幀同步訊號,行同步訊號,螢幕大小,畫素顯示模式等等

3 幀緩衝初始化,設定幀緩衝的起始位址,中止位址,虛擬屏寬等等

開始輸出

4 啟動輸出

5 往幀緩衝寫入要顯示的影象資料

程式:#define lcd_width 240

#define lcd_height 320

#define lcd_pixclock 4

#define lcd_right_margin 39

#define lcd_left_margin 16

#define lcd_hsync_len 5

#define lcd_upper_margin 1

#define lcd_lower_margin 5

#define lcd_vsync_len 1

static unsigned short lcdbuffer[lcd_width][lcd_height];//定義視訊記憶體

void lcdportinit()

void lcdinit()

void lcddisplay()

void lcdsubdisplay(u16 c)

基於S3C2440的bootloader移植詳解

首先 在彙編中初始化堆疊,中斷向量表,mmu,時鐘,串列埠等,然後跳到c語言的main函式。這部分 小於4k,放在block0。這個main函式用來將第二段 拷備到dram中並執行。不說這麼多廢話了,說多了無益,讓我們一起來揭開bootloader的神秘的面紗吧!先說下我移植的bootloader的...

基於S3C2440的UART傳輸小結

這裡簡單地介紹一下通過暫存器來控制s3c2440的uart傳輸。檢視s3c2440的晶元手冊可以發現uart有著傳送和接收的快取區,在快取區有資料後其便乙個位元組乙個位元組地將資料傳輸到對應埠處。這裡介紹其中使用到的幾個暫存器。ulconx 用於設定資料的資料位 校驗位 停止位之類的資訊。uconx...

S3C2440A時鐘結構分析 ARM9架構

從上圖的左上角我們可以得知,s3c2440a支援兩種外部時鐘源輸入,一種是通過接在xtipll與xtopll上的外部振盪電路 一般由晶振為核心組成 還有一種是通過將現成的時鐘頻率通過extclk輸入。時鐘輸入晶元後,送到mpll 主鎖相環 與upll usb鎖相環 進行倍頻。mpll出來的時鐘訊號稱...