您的位置 首页 电源

S3C2440之UART操作(FIFO形式)

背景知识:1>由于UART的波特率设置与时钟有关,此文设置FCLK:HCLK:PCLK=1:2:4,FCLK=200MHZ,遂先介绍时钟的设置。通常认为上电复…

布景常识:

<1>

我们UART的波特率设置与时钟有关,此文设置FCLK:HCLK:PCLK=1 : 2 : 4,FCLK=200MHZ,遂先介绍时钟的设置。

一般以为上电复位后PLL是不稳定的。因此在软件重新装备PLLCON之前Fin替代MPLL直接供应Fclk。即使用户不期望复位之后改动PLLCON的数值,用户仍是要用软件写入相同的数值到PLLCON寄存器中。

依照MDK4.22中发动代码的设置来阐明以下设置。

MPLL,UPLL依据公式即可算出,这儿的MPS最终算出的Fclk=200Mhz。PCLK也便是50Mhz了。

注意到HDIVN这儿设置为0x01,不为0,那么Fclk != Hclk,要将fast mode转为异步形式,否则的话,Fclk相当于Pclk了。

我们MDK自带的发动代码没有这部分代码,所以自己加以修改了这部分。

FAST_TO_ASYN假如勾选的话,会选中

IFASYN_SETUP <> 0
MRCp15, 0, r1, c1, c0, 0
ORRr1, r1, #0xc0000000
MCRp15, 0, r1, c1, c0, 0
ENDIF

这样就能够装备成自己想要设置的时钟了。

关于串口的常识

3个独立的串口,每一个都能够使用DMA和中止方法操作。每个包含2个64字节FIFO,一个接,一个发。

FIFO形式相当于FIFO形式的一个寄存器缓冲形式。

每一个UART有7种状况,overrun过错,校验过错,帧过错,断点,接纳缓冲区准备好,发送缓冲区为空,发送移位寄存器为空。钱4个被以为是接纳过错状况,每一个都能够引起接纳过错状况中止请求,条件是UCONn中设置了receive-error-status-interrupt-request=1。

当接纳移位寄存器中的数据传给FIFO的时分,且接纳的数据触发了Rx FIFO的阀值,Rx中止产生了。

发送器中FIFO的还未发得数据抵达Tx FIFO阀值的时分,Tx中止产生了。

程序关键:

本程序首要完结根本的UART0的装备,比方TXO RXO的管脚装备,这能够在发动文件里装备完结,接着ULCON0装备,UCON0装备,UFCON0装备,UMCON0装备,UBRDIV0装备,INTSUBMSK翻开相应位,INTMSK翻开相应位。

中止程序里,接纳和发都会引起UART0中止,在里面要加以委任,是接仍是发引起。接设置FIFO16字节触发,脉冲形式;发为0字节触发,电平形式。

注意到一上电,UART0装备完结后,就会触发发中止,由于发设置为0电平形式触发,所以为了防止平白无故的触发,需要在某些机遇下,制止中止。

功用:在串口上输入16字节,包含回车,然后会把输入的字符回显在串口终端上。

程序代码:

uart.c

/**   PC<----->2440UART0*/#include "S3C2440.h"#include "uart.h"static u8 string[512]  = {0,0};static u8 data_is_ready = 0;void init_uart0(void){rULCON0 = 0x03;  rUCON0 = (0x05) | (1<<9);//15---12   	11-10		9		8		7				6						5		 4			3-2				1-0//not pclk/n	pclk		Tlevel	Rpulse	timeout disable	rx error int disable   loop dis  break dis	int or poll		int or pollrUFCON0 = (0x0<<6) | (0x02<<4) | (0x01<<0);//0		0		1		1		0		0		0		1//Tx trigger level = 0	Rx trigger level = 16bytes	FIFO enable=1rUMCON0 = 0x0;rUBRDIV0 = UART_BRDIV;rINTSUBMSK &= ~BIT_SUB_RXD0;rINTMSK &= ~BIT_UART0;pHandleUART0 = UART0_Handle;}void __irq UART0_Handle(void){u8* ps = string;if(rSUBSRCPND&0x01){rINTSUBMSK |= BIT_SUB_RXD0;while(((rUFSTAT0&0x1f)>0))*ps++ = RdURXH0_L;data_is_ready = 1;		rSUBSRCPND = BIT_SUB_RXD0;}else if(rSUBSRCPND&0x02){int i;rINTSUBMSK |= BIT_SUB_TXD0;	 while((!(rUFSTAT0&(1<<14))) && (*ps != \r)){WrUTXH0_L(*ps++);        for(i=0; i<100;i++);}	data_is_ready = 0;rSUBSRCPND = BIT_SUB_TXD0;	 }rSRCPND = BIT_UART0;rINTPND = BIT_UART0;if(data_is_ready)rINTSUBMSK &= ~(BIT_SUB_TXD0);   elserINTSUBMSK &= ~(BIT_SUB_RXD0);	}

main.c

#include "S3C2440.h"#include "uart.h"int main(void){	rGPBDAT |= (0xf<<5);init_uart0();while(1);}

经测验能够完结功用。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/264951.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部