ok6410 -- uart & led

;/*************************************************************************************
;
; Project Name : OK6410 Uart & Led
;*************************************************************************************/
.globl main
.globl _start

_start:
    ldr r0,=0x70000000
    orr r0, r0, #0x13
    mcr p15, 0, r0, c15, c2, 4
   
    ldr r0, =0x7E004000
    mov r1, #0
    str r1, [r0]
   
    ldr r0, =0x7F008820
    ldr r1, =0x00221111
    str r1, [r0]
   
    ldr r1, =0x7F008828
    mov r0, #0
    str r0, [r1]
    bl delay
   
    ldr r1, =0x7F008824
    mov r0, #0
    str r0, [r1]
    bl delay

loop:
    mov r0, #0xE
    str r0, [r1]
    bl delay
   
    mov r0, #0xD
    str r0, [r1]
    bl delay
   
    mov r0, #0xB
    str r0, [r1]
    bl delay
   
    mov r0, #0x7
    str r0, [r1]
    bl delay
   
 bl sys_clk_init
    bl        main
   
delay:
    ldr r2, =0x500000
 
delay_loop:
    sub r2, r2, #1
    cmp r2, #0
    bne delay_loop
    mov pc, lr
 
 ;-------------------------- clock init
sys_clk_init:
 ldr r0, =0x7E00F000
 ldr r1, [r0, #0x900]
 mov r2, #0x40
 orr r1, r1, r2
 str r1, [r0, #0x900]
 nop
 nop
 nop
 nop
 
 ldr r2, =0x80
 orr r1, r1, r2
 str r1, [r0, #0x900]
 
 
check_sync_ack:
 ldr r1, [r0, #0x900]
 ldr r2, =0xF00
 and r1, r1, r2
 cmp r1, #0xF00
 bne check_sync_ack
 
 
set_lock_time:
 mov r1, #0xFF00
 orr r1, r1, #0xFF
 str r1, [r0, #0x0]
 str r1, [r0, #0x4]
 str r1, [r0, #0x8]

set_div_clock:
 ldr r1, [r0, #0x20]
 bic r1, r1, #0xFF00
 bic r1, r1, #0xFF
 ldr r2, =0x3300
 orr r1, r1, r2
 str r1, [r0, #0x20]

set_uart_clock:
 ldr r1, [r0, #0x28]
 bic r1, r1, #0x70000
 orr r1, r1, #0x30000
 str r1, [r0, #0x28]

enable_apll_epll:
 ldr r1, =0x810A0301
 str r1, [r0, #0x0c]
 ldr r1, =0x810A0302
 str r1, [r0, #0x10]
 
selete_clk_src:
 ldr r1, [r0, #0x1c]
 ldr r2, =0x2005
 orr r1, r1, r2
 str r1, [r0, #0x1c]
 
    mov pc, lr
 
halt:
    b halt 

;-------------------------------------------------------------------------------

;uart

#define ULCON0     (*((volatile unsigned long *)0x7F005000))
#define UCON0      (*((volatile unsigned long *)0x7F005004))
#define UFCON0     (*((volatile unsigned long *)0x7F005008))
#define UMCON0     (*((volatile unsigned long *)0x7F00500C))
#define UTRSTAT0   (*((volatile unsigned long *)0x7F005010))
#define UFSTAT0    (*((volatile unsigned long *)0x7F005018))
#define UTXH0      (*((volatile unsigned char *)0x7F005020))
#define URXH0      (*((volatile unsigned char *)0x7F005024))
#define UBRDIV0    (*((volatile unsigned short *)0x7F005028))
#define UDIVSLOT0  (*((volatile unsigned short *)0x7F00502C))
#define GPACON     (*((volatile unsigned long *)0x7F008000))

void init_uart(void)
{
 GPACON &= ~0xff;
 GPACON |= 0x22;  /* ULCON0 */
 ULCON0 = 0x3;  /* 數據位:8, 無較驗, 停止位: 1, 8n1 */
 UCON0  = 0x5;  /* 使能UART發送、接收 */
 UFCON0 = 0x01; /* FIFO ENABLE */
 UMCON0 = 0;  /* 波特率 */
 /* DIV_VAL = (PCLK / (bps x 16 ) ) - 1  
  * PCLK = 66.5MHz 
  * bps = 115200 
  * DIV_VAL = (66500000 / (115200 x 16 ) ) - 1  
  *         = 35.08 
  */
 UBRDIV0   = 35;
 /* x/16 = 0.08 
  * x = 1 
  */
 UDIVSLOT0 = 0x1;
}

char getchar2(void)
{
 while ((UFSTAT0& (1<<6)) == 0 && (UFSTAT0& 0x3f) == 0);
 return URXH0;
}

void putchar2(char c)
{
 while ((UFSTAT0 & (1<<14)) );
 UTXH0 = c;
}

int main()
{
 char c; 
 init_uart(); 
 while (1)
 { 
  c = getchar2(); 
  putchar2(c);
 } 
 
 return 0;
}

 

 

 

 

 

 

 

 

 

 

發佈了70 篇原創文章 · 獲贊 12 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章