资源预览内容
第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
第9页 / 共11页
第10页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
今天,主要内容为7_S5PV210学习_配置串口:一、 配置串口好期待串口啊.O(_)O哈!你是不知道,我的一直都是2.54mm的插针,用的这个板子是2.0的插针,我的好多设备都不能上,包括我最喜欢用的LCD1602.写个程序看看效果那叫费劲啊!说明:串口是什么我不想说了,英文名字简写UART关于S5PV210的串口还是要说一说,共有四个串口,波特率最高3Mbps。每个串口都有属于自己的两个接收、发送缓冲区(FIFO),其中,UART0的256Byte(字节),UART1为64Byte,UART2和UART3为16Byte。S5PV210的波特率可编程,可以设置具有1个或者2个停止位,可以设置有无校验位,可以设置5bit、6bit、7bit、8bit的数据宽度。S5PV210的每一个串口包含一个波特率发生器,一个发送和接收的控制单元。而波特率发生器的时钟源为“PCLK”或者“SCLK_UART”。S5PV210接收和发送都有一个移位寄存器,用于临时存储要发送或者接受的数据,在使用FIFO的情况下,数据会自动从FIFO进入这两个区域,如果不使用FIFO,数据可直接写入或者读出移位寄存器。本图在数据手册P854。第一部分 配置串口1. 串口时钟配置你没有看错,上来第一件事情就是时钟.呵呵.如果前面的“时钟配置基础”的内容看的好,我保证,这部分就是So Easy啊.没得说,第一件事,当然是要找一个工作的串口了!我的这个板子的串口1使用起来特别方便,所以我就选择用这个了,其他的串口配置方法也都差不多,强烈建议读者朋友用其他的串口。首先,我们要找到时钟源,上火,SCLK_UART的设置这么麻烦.我还是用PCLK吧。用SCLK_UART还是PCLK的设置是在UCNn10设置的。我们怎么知道的?看图啊。PCLK时钟频率是由前面的时钟配置部分设置的,我们在前面已经进行配置了,就是那个PCLK_PSYS,还记得PSYS domain吧?这个是外设时钟域哦现在回到时钟配置那一个部分,看一看PCLK在哪里,要如何配置。(1) PCLK时钟配置上一节时钟配置部分已完成,用的是50MHz.的。就是那个PCLK_PSYS了。(2) 串口时钟配置我们选好PCLK作为时钟输入,要通过UCONn10的设置。我们配置串口1,应该设置UCON110先看看UCON寄存器到底是用来做什么的。从名字我们可以猜出大概,UART Configure.默认值0,而0正好 表示时钟源是PCLK,那么没有什么犹豫的,我们就不用管它了,呵呵,暂时这样就行。2、波特率设置没得说,我们就要115200了.关键是如何配置呢?通过寄存器UDIVSLOTn,同样的,我的要设置的是UART1,所以就要配置UDIVSLOT1了,我想到这里后,一般人都应该明白独立串口是什么意思了.先看一个手册P879的公式。说实话,我就特别不理解三星的这个设置方法是怎么来的!DIV_VAL = UBRDIVn + (num of 1s in UDIVSLOTn)/16DIV_VAL = (PCLK / (bps X 16) - 1orDIV_VAL = (SCLK_UART / (bps X 16) 1 假如:这里的PCLK是50MHz,bps是115200,DIV_VAL = 26.13这样,我们就得出 UBRDIV1 = 26,而 (num of 1s in UDIVSLOTn)/16 = 0.13 (num of 1s in UDIVSLOTn) = 0.13 X 16 = 2.03这样,我们就可可以设置UDIVSLOT1寄存器了,给它的值,对它来说没有什么意义,只要有2个1可以了,也就是说,我可以设置为3或者5或者6,只要转化成二进制后带有两个1就可以了!记得总位数不能超过16bit 哦!我这里就设置为 3好了。最终得出,在PLCK=50M的情况下,UBRDIV1 = 26,UDIVSLOT1 = 3,就得出波特率115200.纠错,在我写完这篇文章之后调试程序时候发现,如果只是取两个1,串口将不能工作,最后我改成3个1之后才好用的!其实,这个不能怪我,我真的没有弄明白S5PV210的串口的这两个值是如何设置的,不过,最后还是让我找到原因了!3、串口数据格式我们串口要工作在正常模式,无奇偶校验,一个停止位,8Bit的数据长度。有了这个想法,就要找到数据格式的配置寄存器。ULCONn,数据手册P867.按照寄存器的配置,0x03即可。4、串口工作模式呵呵.这个其实是我取得名字,我的意思是让串口利用FIFO工作!这个寄存器在手册P871,设置为1将开启FIFO.5、打开串口这个的设置也是通过寄存器UCONn完成的,(上面选择串口时钟源也是配置这个寄存器)让串口的接收或者发送工作在中断或者查询模式。为了简单一些,我们的串口工作在查询模式好了。设置为 : 56、设置GPIO.我要用UART1,就要配置GPA0_4和GPA0_5.将其设置为0010即可实现串口的发送和接受。7、发送和接收数据的方法到这里,串口的初始化配置都完成了,但是,我们要如何接收和发送数据呢?这个有专门的寄存器,当接收到数据,直接去这个寄存器读取就可以了。再看看发送的寄存器,没什么好说的。接下来问题,就是什么时候接收数据,什么时候发送数据呢?最简单的,我们可以通过查询UFSTAT寄存器。只要,接收缓冲器为空,我们就等待数据到来,如何检查为空?while(UFSTAT1 & 0xfffffff) =0);/这个的0xFFFFFFF是有讲究的!因为串口缓冲器最大64字节,转换成16进制是多少?0x40.发送缓冲器为满,我们就也等待,不等待再接收存不进去了.(o)/如何检查?while(UFSTAT1 & (124) );总结一下,UCONn寄存器控制时钟源,发送和接收的开启及其工作模式设置。ULCONn寄存器控制控制串口数据格式。UFCON0寄存器控制FIFO.UBRDIVn和UDIVSLOTn控制波特率。当然,再加上GPIO的初始化就可以让串口工作了。现在,开始看程序!说实话,程序没什么好看的,O(_)O.该说的在文章中全部说到了!而且,我把源程序也给出来了!经过这一步同时证明了上一篇文章所配置的时钟是正确的!串口到这里基本就结束了.呵呵,如果用过其他的三星ARM芯片,就会有一种感慨吧?哈哈(o)/.是不是感觉它们的配置很像呢?我是没有玩过其他的,我是猜的。下一篇学什么还没有想好。可能是采用中断接收,不过又不想先学这个中断;可能是实现printf功能,不过printf之前又想学学DDR;也有可能玩DMA了,学DMA之前又想把中断接收拿下。要怎么玩呢?纠结啊!我还没有想好,代码我还没有开始弄!不过,我最喜欢的就是DMA了.那么的勤劳.O(_)O哈!作者:小王发布于: www.armdiy.cn联系方式:QQ:1320465765TEL:18745950097void uart0_int_func() unsigned long temp; if(UTRSTAT0&0x1) /判断是否为接收中断 temp=URXH0; /读取接收寄存器 while(!(UTRSTAT0&0x2); /等待串口空闲 UTXH0=temp; /发送接收到的内容 UINTSP0|=0xf; /清除中断标志位 UINTP0|=0xf; /清除中断标志位 clear_vicaddress(); /清除全部VICADDR寄存器 enable_global_IRQ(); /使能全局IRQ中断 void uart0_init() ULCON0|=0x3; /设置帧格式 UCON0=0x305; /时钟源、读写发送接收寄存器模式 UBRDIV0=35; /设置波特率 UINTM0=0xf; /屏蔽所有串口中断 GPA0CON=0x22; /设置引脚功能为串口收发 UINTSP0|=0xf; /清除中断标志 UINTP0|=0xf; /清除中断标志 set_int_vectaddr(42,uart0_int_func); /设置42号中断服务程序入口地址 interrupt_enable(42); /使能中断系统42号中断 UINTM0=0xe; /使能串口接收中断
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号