s200661524 发表于 2011-7-16 23:09:55

RT-thread在s3c6410上移植后串口不能中断接受的问题

移植了RT-thread到6410上,现在开了5个任务,任务之间可以切换,说明系统运行正常,使用定时器4作为系统中断时钟,可以正常使用。但是shell组件需要用串口输入,好几天了都不能发生串口中断,所以shell组件还不能运行,求助有没有移植成功的啊?我根据手册写寄存器,串口初始化应该成功了,因为可以打印出logo还有任务切换信息。但是就是不能发生串口终端接收,这样shell线程也就不能获取信号量。请问谁有6410中断接受的例子吗,指点一下!谢谢

aozima 发表于 2011-7-16 23:19:03

tick能中断.看来主要得查串口的配置了.

ffxz 发表于 2011-7-16 23:34:25

参考下2440的,估计6410与2440比较相像吧

s200661524 发表于 2011-7-17 09:26:06

回复【1楼】aozima
-----------------------------------------------------------------------
系统时钟中断部分移植成功了,所以串口处理部分应该没什么问题,串口也能输出,而且查询方式下也能输入了,这说明串口部分应该没什么问题,关于中断方式的设置,我看了数据手册,发现在串口寄存器中没有单独的中断控制位,默认就是打开的,所以只要在中断控制器那边打开并设置好中断处理函数就可以了,但是现在就是发生不了中断,按理说我设施了发送中断和接受中断,所以发送完成后也要发生中断,但是实际情况是没有的。不知道是不是数据手册有问题还是其他什么。


回复【2楼】ffxz
-----------------------------------------------------------------------
现在的情况估计不是移植哪儿出问题了,问题就是串口接受不了发生中断,我在中断程序里面添加了打印消息和点亮LED的调试程序,但是一直都没进中断。所以想问问哪位是不是有移植好的串口中断方式的程序,参考一下我的哪儿有问题

s200661524 发表于 2011-7-17 09:28:47

/// Normal Mode, No Parity, 1 Stop Bit, 8 Bit Data
    s3c_writel(0x0003, ULCON0);
    // PCLK divide, Pollingor Interrupt Mode
    regv = (1<<9) | (1<<8) | (1<<2) | (1<<0);
    s3c_writel(regv, UCON0);
    // Disable FIFO
    s3c_writel(0x0000, UFCON0);
    // Disable Auto Flow Control
    s3c_writel(0x0000, UMCON0);

    DIV=PCLK/(BPS*16)-1; 66000000/(115200*16)-1;
    s3c_writel(DIV, UBRDIV0);
    for (regv=0; regv<0x100; regv++);
    //aSlotTable;
    s3c_writel(0x80, UDIVSLOT0);

这是我的串口设置程序,请大家帮看看!

shaolin 发表于 2011-7-17 10:45:08

mini2440中uart是这样配置的,供参考

        /* UART0 port configure */
        GPHCON |= 0xAA;
        /* PULLUP is disable */
        GPHUP |= 0xF;

        /* FIFO enable, Tx/Rx FIFO clear */
        uart0.uart_device->ufcon = 0x0;
        /* disable the flow control */
        uart0.uart_device->umcon = 0x0;
        /* Normal,No parity,1 stop,8 bit */
        uart0.uart_device->ulcon = 0x3;
        /*
       * tx=level,rx=edge,disable timeout int.,enable rx error int.,
       * normal,interrupt or polling
       */
        uart0.uart_device->ucon = 0x245;
        /* Set uart0 bps */
        uart0.uart_device->ubrd = (rt_int32_t)(PCLK / (BPS * 16)) - 1;
        /* output PCLK to UART0/1, PWMTIMER */
        CLKCON |= 0x0D00;

        /* install uart0 isr */
        INTSUBMSK &= ~(BIT_SUB_RXD0);
       
        rt_hw_interrupt_install(INTUART0, rt_serial0_handler, RT_NULL);
        rt_hw_interrupt_umask(INTUART0);

s200661524 发表于 2011-7-17 15:08:44

回复【5楼】shaolin
-----------------------------------------------------------------------
初始化串口没什么问题,查询法可以发送和接受,现在就是不能用中断法,shell里面就是用中断,我看6410的数据手册除了全局中断里面有串口的开启位之外,在串口寄存器中也有,但是默认是打开的(看数据手册)不知道是数据手册错了还我理解错了。全局的那个我已经打开了,中断函数也已经按放上去了(6410有向量中断控制器,每一个中断都有一个寄存器来存放其终端处理函数地址。所以其中断不是用2440的那样使用一个中断函数数组来表示的)时钟中断能发生,说明全局中断这部分应该没什么问题了,现在就是怀疑是不是数据手册哪儿出问题了,想问问有没有那位大虾已经实现了串口中断方式接受或者发送

zchong 发表于 2011-7-17 15:36:39

看一下关于uart的那几个中断相关的寄存器,这个应该很好查的

aozima 发表于 2011-7-17 15:59:04

"但是默认是打开的"

即使初始值就是我们需要的.但一般初始化时还是再写一遍.
不然可能会出现郁闷的问题.(比如bootloader里面改动了)
虽然问题可能不在这.但这个坏习惯要改正.

s200661524 发表于 2011-7-17 16:30:10

回复【8楼】aozima
-----------------------------------------------------------------------
谢谢,回头看看把默认值也重新写一下

pswarfound 发表于 2011-12-21 19:49:42

我现在也配到类似的情况,lpc2378,不知道是中断接收的问题还是中断配置什么的
页: [1]
查看完整版本: RT-thread在s3c6410上移植后串口不能中断接受的问题