天嵌 ARM开发社区

 找回密码
 注册
查看: 3733|回复: 2

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

[复制链接]
xiebo 发表于 2015-5-10 12:31:46 | 显示全部楼层 |阅读模式
我写的串口的裸板程序,运行以后,secureCRT上不能输入也没有输出,请高手们帮忙看一下原因究竟在哪里?
代码如下:
1、clock.S
.globl clock_init

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

loop1:                /* 等待,直到CPU进入异步模式 */
    ldr r0, =OTHERS
    ldr r1, [r0]
    and r1, r1, #0xf00                    
    cmp r1, #0
    bne loop1        
   
    /* SYNC667 */
    /* MISC_CON[19] = 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, [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

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, [r0]
   
    /*设置时钟 */
    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\桌面\新建文件夹

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
TQ-lkp 发表于 2015-5-12 08:52:27 | 显示全部楼层
检查下CRT上的串口设置有没有取消流控
 楼主| xiebo 发表于 2015-5-13 08:01:03 | 显示全部楼层
取消了的,还是不行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-23 22:02 , Processed in 1.078125 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表