S3C6410 UART控制器的簡單配置(實現發送字符串功能)

先看下S3C6410的UART控制器介紹:
       S3C6410 通用異步接收和發送器( UART)提供了四個獨立的異步串行I / O(SIO)端口.每個異步串行 I/O(SIO)端口通過中斷或者直接存儲器存取(DMA)模式來操作。換句話說,UART 是通過產生一箇中斷或 DMA 請求,在 CPU 和 UART 之間傳輸數據的。該UART使用系統時鐘的時間可以支持的比特率最高115.2kb/s。如果一外部設備提供 ext_uclk0 或 ext_uclk1 ,則UART可以以更高的速度運行每個UAR 的通道包含了兩個 64 字節收發 FIFO 存儲器。
    該S3C6410的UART包括可編程波特率,紅外線( IR )的傳送/接收,一個或兩個停止位插入,5位, 6位,7位或8位數據的寬度和奇偶校驗。

下面我們使用channel 0實現一個簡單的通過UART向終端發送字符的程序來了解其基本功能。
沒有選擇使用FIFO功能,數據格式選擇8N1,波特率選擇115200。
8N1:8個數據位,1個停止位,沒有校檢位。
115200:每個週期可發送115200個數據位。

      程序運行環境爲選擇從Nand flash啓動,所以要先關閉好看門狗,並將系統時鐘設置爲533MHz, PCLK爲66MHz.

/***************************usrt.S*******************************/  (實現了基本的寄存器配置和一個簡單的mputc函數)

#include <uart.h>                               //此處頭文件只是簡單的將寄存器地址定義爲宏,方便使用而已,並沒有附上頭文件。
#include <gpio.h>

    .text
    .align    2
    .global    uart_init
uart_init:
    ldr r0, =GPACON                     //將GPA0和GPA1設置爲UART RXD[0]和UART TXD[0]
    ldr r1, [r0]
    orr r1, r1, #0x22
    str r1, [r0]

    ldr r0, =ULCON0                     //配置UART 0 通道行控制寄存器並設置數據格式爲8N1
    mov r1, #((3<<3)|3)
    str r1, [r0]


    ldr r0, =UCON0                      //選擇時鐘源爲PCLK
    ldr r1, =(2<<10)
    str r1, [r0]

                                                    
    ldr r0, =UBRDIV0                 //設置波特率爲115200
    mov r1, #34
    str r1, [r0]

    ldr r0, =UDIVSLOT0
    ldr r1, =0xdfdd
    str r1, [r0]

 
    ldr r0, =UCON0                //設置工作模式爲輪詢或中斷
    ldr r1, [r0]
    orr r1, r1, #0x5
    str r1, [r0]
    mov pc, lr

    .align    2
    .global    mputc
mputc:                                   //mputc函數, r0爲接受的參數。
    ldr r1, =UTXH0    
    str r0, [r1]
    
    ldr r0, =UTRSTAT0
1:
    ldr r1, [r0]
    tst    r1, #(1<<2)
    beq    1b

    mov pc, lr


/***************************start.S******************************/  向終端發出a-z字符

    .text
    .align    2
    .global    _start
_start:
    bl    set_port                                  //通知協處理器外設地址
    bl    close_wtd                              //關閉看門狗

    bl    clock_init_533                      //初始化系統時鐘
  
    bl    uart_init

    mov r4, #'a'    
1:
    cmp    r4, #'z'
    bgt    1f

    mov r0, r4
    bl    mputc

    add    r4, #1
    b    1b
1:

loop:
    b    loop


    .align    2
    .global    set_port
set_port:
    ldr r0, =0x70000013
    mcr p15, 0, r0, c15, c2, 4
    mov pc, lr


    .text
    .align    2
    .global    close_wtd
close_wtd:
    ldr r0, =WTCON
    ldr r1, [r0]
    bic r1, r1, #1
    str r1, [r0]
    mov pc, lr

由於選擇nand flash啓動,所以必須關閉看門狗,設置系統時鐘並通知CPU外設地址範圍,設置系統時鐘的代碼並沒有附上。編譯成二進制文件後將其燒到nand flash並選擇從nand flash啓動即可看到終端上輸出a-z(需連接minicom).

    


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