xiebo 发表于 2015-5-10 12:31:46

TQ6410串口不能输入和输出的问题

我写的串口的裸板程序,运行以后,secureCRT上不能输入也没有输出,请高手们帮忙看一下原因究竟在哪里?
代码如下:
1、clock.S
.globl clock_init

clock_init:
   
    /* 1.设置LOCK_TIME */
    ldr r0, =0x7E00F000/* APLL_LOCK */
    ldr r1, =0x0000FFFF
    str r1,
   
    str r1,    /* MPLL_LOCK */
    str r1,    /* EPLL_LOCK */   
   
#define OTHERS      0x7e00f900
    @ set async mode/* 当CPU时钟 != HCLK时,要设为异步模式 */
    ldr r0, =OTHERS
    ldr r1,
    bic r1, r1, #0xc0    /* 1100,0000 */      
    str r1,

loop1:                /* 等待,直到CPU进入异步模式 */
    ldr r0, =OTHERS
    ldr r1,
    and r1, r1, #0xf00                  
    cmp r1, #0
    bne loop1      
   
    /* SYNC667 */
    /* MISC_CON = 0 */

#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,
   
    /* 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,       /* 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,       /* MPLL_CON, FOUTMPL = MDIV * Fin / (PDIV*2^SDIV) = 266*12/(3*2^1) = 532MHz*/
   
    /* 3.选择PLL的输出作为时钟源 */
    ldr r0, =0x7E00F01C
    ldr r1, =0x03
    str r1,
   
    mov pc, lr

2、start.S


.globl _start
_start:

/* 硬件相关的设置 : 把外设的基地址告诉CPU*/
    /* Peri port setup */
    ldr r0, =0x70000000
    orr r0, r0, #0x13
    mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)
   
/* 关看门狗 */
/* 往WTCON(0x7E004000)写0 */
   
    ldr r0, =0x7E004000
    mov r1, #0
    str r1,
   
    /*设置时钟 */
    bl clock_init

    /* 设置栈, 调用C函数 */
    ldr sp, =0x0c002000
    bl main
halt:
    b halt   
3、uart.c


#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
   * bps = 115200
   * DIV_VAL = (66500000 / (115200 x 16 ) ) - 1
   *         = 35.08
   */
    UBRDIV0   = 35;

    /* x/16 = 0.08
   * x = 1
   */
    UDIVSLOT0 = 0x1;
   
}

char getchar(void)
{
    while ((UFSTAT0 & 0x7f) == 0);/* 如果RX FIFO空,等待 */
    return URXH0;                   /* 取数据 */
}

void putchar(char c)
{
    while (UFSTAT0 & (1<<14)); /* 如果TX FIFO满,等待 */
    UTXH0 = c;                         /* 写数据 */
}

4、main.c
#include "uart.h"

int main()
{
    char c;
   
    init_uart();
   
    while (1)
    {
      c = getchar();
      putchar(c+1);
    }
   
    return 0;
}

5、Makefile

uart.bin: start.o main.o uart.o clock.o
    arm-linux-ld -Ttext 0x0c000000 -o uart.elf $^
    arm-linux-objcopy -O binary uart.elf uart.bin
    arm-linux-objdump -D uart.elf > uart.dis

%.o : %.S
    arm-linux-gcc -o $@ $< -c

%.o : %.c
    arm-linux-gcc -o $@ $< -c

clean:
    rm *.o uart.elf uart.bin uart.dis


C:\Documents and Settings\Administrator\桌面\新建文件夹

TQ-lkp 发表于 2015-5-12 08:52:27

检查下CRT上的串口设置有没有取消流控

xiebo 发表于 2015-5-13 08:01:03

取消了的,还是不行。
页: [1]
查看完整版本: TQ6410串口不能输入和输出的问题