嵌入式第七課 系統時鐘和UART試驗

2021-10-02 01:16:54 字數 4213 閱讀 1813

對於jz2440開發板,有三個時鐘:fclk是cpu時鐘,hclk是外設時鐘,通訊輸入用pclk時鐘。2440的晶振頻率是12mb,設定pll暫存器將其提高,再將其分頻給fclk, hclk和pclk。

如何設定fclk, hclk, pclk?

1.鎖定時間:設定pll的同時,fclk停止(cpu停止執行),經過一定的鎖定時間後,cpu以設定的新頻率執行(fclk以新的頻率)

2.pll暫存器(查詢2440手冊的mpllcon)

3.分頻:將cpu的晶振頻率經過處理後分發給各個時鐘

**:head.s:

@***

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

***@ file:head.s

@ 功能:設定sdram,將程式複製到sdram,然後跳到sdram繼續執行@**

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

****

.extern main

.text

.global _start

_start:

reset:

ldr sp,

=4096 @ 設定棧指標,以下都是c函式,呼叫前需要設好棧

bl disable_watch_dog @ 關閉watchdog,否則cpu會不斷重啟

// bl是位置無關碼,相當於:pcnew = pc + 偏移

// pcnew = (4+8) + 0x28 = 0x34

ldr pc,

=disable_watch_dog

bl clock_init @ 設定mpll,改變fclk、hclk、pclk

bl memsetup @ 設定儲存控制器以使用sdram

bl copy_steppingstone_to_sdram @ 複製**到sdram中

ldr pc,

=on_sdram @ 跳到sdram中繼續執行

on_sdram:

ldr sp,

=0x34000000 @ 設定棧指標

ldr lr,

=halt_loop @ 設定返回位址

ldr pc,

=main @ 呼叫main函式

halt_loop:

b halt_loop

init.c:

/*

* init.c: 進行一些初始化

*/ #include "s3c24xx.h"

void disable_watch_dog

(void)

;void clock_init

(void)

;void memsetup

(void)

;void copy_steppingstone_to_sdram

(void);/*

* 關閉watchdog,否則cpu會不斷重啟

*/void disable_watch_dog

(void)

#define s3c2410_mpll_200mhz (

(0x5c

<

<12)

|(0x04

<

<4)

|(0x00))

#define s3c2440_mpll_200mhz (

(0x5c

<

<12)

|(0x01

<

<4)

|(0x02))

/* * 對於mpllcon暫存器,[19:12]為mdiv,[9:4]為pdiv,[1:0]為sdiv

* 有如下計算公式:

* s3c2410: mpll(fclk) = (m * fin)/(p * 2^s)

* s3c2440: mpll(fclk) = (2 * m * fin)/(p * 2^s)

* 其中: m = mdiv + 8, p = pdiv + 2, s = sdiv(mdiv,pdiv,sdiv位於pllcon)

* 對於本開發板,fin = 12mhz

* 設定clkdivn,令分頻比為:fclk:hclk:pclk=1:2:4,

* fclk=200mhz,hclk=100mhz,pclk=50mhz

*/void clock_init

(void)

else}/*

* 設定儲存控制器以使用sdram

*/void memsetup

(void)

void copy_steppingstone_to_sdram

(void)

}

如何使用串列埠:

1.確定使用哪個串列埠

2.設定波特率和流控

3.開啟

4.收發

**:

#include

"s3c24xx.h"

#include

"serial.h"

#define txd0ready (1<<2)

//矚目********

#define rxd0ready (1)

#define pclk 50000000

// init.c中的clock_init函式設定pclk為50mhz

#define uart_clk pclk

// uart0的時鐘源設為pclk

#define uart_baud_rate 115200

// 波特率

#define uart_brd ((uart_clk / (uart_baud_rate * 16)) - 1)

/* * 初始化uart0

* 115200,8n1,無流控

*/void

uart0_init

(void)/*

* 傳送乙個字元

*/void

putc

(unsigned

char c)

/* * 接收字元

*/unsigned

char

getc

(void)/*

* 判斷乙個字元是否數字

*/int

isdigit

(unsigned

char c)

/* * 判斷乙個字元是否英文本母

*/int

isletter

(unsigned

char c)

位置無關碼,依賴於程式當前執行的pc值,進行相對的跳轉,導致的結果就是,無論**在哪,總能達到指令的正常目的,因此是位置無關的。pc = pc0 + 偏移。對arm架構,pc值為當前指令的位址+8。檢視反編譯得知,偏移量為0x28,這個偏移值由編譯器自動算出,與機器碼存在對應關係。彙編用bbl來跳轉。

位置有關碼不依賴當前pc值,是絕對跳轉,只有程式執行在鏈結位址處時,才能達到指令的正常目的,因此是位置有關係的。

第七課 光照和鍵盤

這一課我會教您如何使用三種不同的紋理濾波方式。教您如何使用鍵盤來移動場景中的物件,還會教您在opengl場景中應用簡單的光照。這一課包含了很多內容,如果您對前面的課程有疑問的話,先回頭複習一下。進入後面的 之前,很好的理解基礎知識十分重要。我們要在第一課的 上進行改動就可以了。我們將要增加乙個loa...

第七課類和結構體

類和結構體是人們構建 所用的一種通用且靈活的構造體。為了在類和結構體中實現各種功能,我們必須要嚴格按照對於常量,變數以及函式所規定的語法規則來定義屬性和新增方法。乙個類的例項,被成為物件。swift 中類和結構體有很多共同點。1 類和結構體對比 共同處 定義屬性用於儲存值 定義方法用於提供功能 定義...

NeHe OpenGL第七課 光照和鍵盤

nehe opengl第七課 光照和鍵盤 光照和鍵盤控制 在這一課裡,我們將新增光照和鍵盤控制,它讓程式看起來更美觀。這一課我會教您如何使用三種不同的紋理濾波方式。教您如何使用鍵盤來移動場景中的物件,還會教您在opengl場景中應用簡單的光照。這一課包含了很多內容,如果您對前面的課程有疑問的話,先回...