主程式start.s
#define config_periport_base 0x70000000
#define config_periport_size 0x13
#define wtcon 0x7e004000
.global _start
_start:
/*告訴cpu 外設的位址*/
ldr r0, =config_periport_base
orr r0, r0, #config_periport_size
mcr p15,0,r0,c15,c2,4
/*關閉看門狗*/
ldr r0, =wtcon
mov r1, #1
str r1,[r0]
/*時鐘的設定*/
bl clock_init
mov sp,#(1024*8)
bl ***x
halt:
b halt
時鐘配置clock.s
.globl clock_init
clock_init:
#define arm_ratio 0 /* armclk = doutapll / (arm_ratio + 1) */
#define hclkx2_ratio 1 /* hclkx2 = hclkx2in / (hclkx2_ratio + 1) */
#define hclk_ratio 1 /* hclk = hclkx2 / (hclk_ratio + 1) */
#define pclk_ratio 3 /* pclk = hclkx2 / (pclk_ratio + 1) */
#define mpll_ratio 0 /* doutmpll = moutmpll / (mpll_ratio + 1) */
ldr r0, =0x7e00f020 /* clk_div0 */
ldr r1, =(arm_ratio) | (mpll_ratio << 4) | (hclk_ratio << 8) | (hclkx2_ratio << 9) | (pclk_ratio << 12)
str r1, [r0]
/* 2.åäöãê±öó */
/* 2.1 åäöãapll */
/* 2.1.1 éèöãapll
* 2.1.2 muxapll
* 2.1.3 sync667
* 2.1.4 divapll
*/#define apll_con_val ((1<<31) | (266 << 16) | (3 << 8) | (1))
ldr r0, =0x7e00f00c
ldr r1, =apll_con_val
str r1, [r0] /* apll_con, foutapl = mdiv * fin / (pdiv*2^sdiv) = 266*12/(3*2^1) = 532mhz */
/* 2.2 åäöãmpll */
/* 2.2.1 éèöãmpll
* 2.2.2 muxmpll
* 2.2.3 syncmux
* 2.2.4 sync667
* 2.2.5 hclkx2_ratio
* 2.2.6 pclk_ratio
*/#define mpll_con_val ((1<<31) | (266 << 16) | (3 << 8) | (1))
ldr r0, =0x7e00f010
ldr r1, =mpll_con_val
str r1, [r0] /* mpll_con, foutmpl = mdiv * fin / (pdiv*2^sdiv) = 266*12/(3*2^1) = 532mhz */
/* 3.ñ¡ôñpllµäêä³ö×÷îªê±öóôž */
ldr r0, =0x7e00f01c
ldr r1, =0x03
str r1, [r0]
mov pc, lr
uart的配置uart.c:
#define ulcon0 (*(volatile unsigned long *)0x7f005000)
#define ucon0 (*(volatile unsigned long *)0x7f005004)
#define ufcon0 (*(volatile unsigned long *)0x7f005008)
#define ufstat0 (*(volatile unsigned long *)0x7f005018)
#define utxh0 (*(volatile unsigned char *)0x7f005020)
#define urxh0 (*(volatile unsigned char *)0x7f005024)
#define ubrdiv0 (*(volatile unsigned long *)0x7f005028)
#define udivslot0 (*(volatile unsigned long *)0x7f00502c)
#define ulcon0 (*(volatile unsigned long *)0x7f005000)
#define gpacon (*(volatile unsigned long *)0x7f008000)
void uart_init(void)
char getchars(void)
void putchars(char c)
除錯要點:
在除錯的時候如果在minicom中沒有串列埠的輸出資訊,可以注意
暫存器位址是否正確(可能配置不正確出現亂碼,配置的時鐘源與暫存器不匹配導致),時鐘有無初始化(可能沒有資訊的輸出)。
OK6410 uart 簡單測試程式
uart初始化。1 我們可以通過原理圖可知道 串列埠的rxd,txd 分別連線在ok6410 gpa0,gpa1 口上的。所以首先設定gpio 的輸入輸出狀態 0010 uart rxd 0 0010 uart txd 0 同時設定相應的上下拉電阻關係。2 uart 初始化 2.1 配置uart 0...
UART配置流程
常用的串列埠一般都rs232和rs485,在linux中,所有的裝置檔案一般都位於 dev 下,其中串列埠1和串列埠2對應的裝置名依次為 dev ttys0 和 dev ttys1 而且usb轉串列埠的裝置名通常為 dev ttyusb0 下面以指紋識別系統為例介紹下串列埠的操作流程 1 儲存原先串...
s3c6410的UART裝置驅動 1
這段話摘於 裝置驅動開發詳解 在使用串列埠核心層這個通用串列埠tty驅動層的介面後,乙個串列埠驅動要完成的主要工作 1 定義uart driver uart ops uart port等結構體的例項並在適當的地方根據具體硬體和驅動的情況初始化它們,當然具體裝置的驅動可以將這些結構體在新定義的 uar...