1、另一个很重要的地方就是设置波特率。s3c2440波特率的时钟源有三个:PCLK、FCLK/n和UEXTCLK。时钟源的选择是由UCONn的第10位和第11位来完成的。波特率的具体计算公式为:时钟源频率(波特率16)1这个计算结果很可能是小数,把该小数取最接近的整数,放入寄存器UBRDIVn中就完成了波特率的设置。如我们选择波特率的时钟源为PCLK,它为50MHz,我们设置的波特率为115.2kHz,通过上式计算的结果为26.13,取整后得到26,那么我们把26放入UBRDIVn中即可。由于我们没有使用FIFO和MODEM,所以可以不用设置FIFO控制寄存器UFCONn和MODEM控制寄存器UM
2、CONn。通过以上寄存器的设置,UART就可以正常传输数据。接收到的数据是放到接收缓存器URXHn中,要发送数据时,是把数据放入发送缓存器UTXHn中。由于UART是通过字节方式传输数据的,因此要区分是大端模式还是小端模式,也就是说这两个寄存器在这两种模式下,所在的地址是不同。为了了解当前数据传输的各种状态,还需要一些状态寄存器。传输状态寄存器UTRSTATn非常有用,它的第0位可以用来判断接受缓存器内是否有可接收的数据,第1位和第2位可以用来判断发送缓存器中是否为空,为空时可以发送数据。由于在这里我们不进行传输数据时错误的判断,因此错误状态寄存器UERSTATn不需要,FIFO状态寄存器UF
3、STATn和MODEM状态寄存器UMSTATn在这里也不需要。 我们给出UART通信的两种方法:查询和中断。为了验证程序,使用任一款的串行通信软件来实现PC和s3c2440之间的通信即可。 首先给出的是查询程序。它是在主程序的循环体内不断查询UART端口,当有数据来时,就接收数据,并再通过UART发送该数据。然后根据所接收数据的不同,分别执行不同的内容,如点亮、熄灭LED,蜂鸣器响、或不响。在这里,我们每次只完成一个字节的传输。#define rGPBCON (*(volatile unsigned *)0x56000010) /Port B control#define rGPBDAT (*
4、(volatile unsigned *)0x56000014) /Port B data#define rGPBUP (*(volatile unsigned *)0x56000018) /Pull-up control B#define rGPHCON (*(volatile unsigned *)0x56000070) /Port H control#define rGPHUP (*(volatile unsigned *)0x56000078) /Pull-up control H#define rULCON0 (*(volatile unsigned *)0x50000000) /U
5、ART 0 Line control#define rUCON0 (*(volatile unsigned *)0x50000004) /UART 0 Control#define rUFCON0 (*(volatile unsigned *)0x50000008) /UART 0 FIFO control#define rUMCON0 (*(volatile unsigned *)0x5000000c) /UART 0 Modem control#define rUTRSTAT0 (*(volatile unsigned *)0x50000010) /UART 0 Tx/Rx status#
6、define rUERSTAT0 (*(volatile unsigned *)0x50000014) /UART 0 Rx error status#define rUFSTAT0 (*(volatile unsigned *)0x50000018) /UART 0 FIFO status#define rUMSTAT0 (*(volatile unsigned *)0x5000001c) /UART 0 Modem status#define rUBRDIV0 (*(volatile unsigned *)0x50000028) /UART 0 Baud rate divisor/litt
7、le endian#define rUTXH0 (*(volatile unsigned char *)0x50000020) /UART 0 Transmission Hold#define rURXH0 (*(volatile unsigned char *)0x50000024) /UART 0 Receive buffervoid Main(void)char ch;rGPBCON = 0x015551;rGPBUP = 0x7ff;rGPBDAT = 0x1e0;rGPHCON = 0x00faaa; /使用UART0功能rGPHUP = 0x7ff;rULCON0 = 0x3; /
8、设置UART0无奇偶校验,一位停止位,8位数据rUCON0 = 0x245; /PCLK为时钟源,接收和发送数据为查询或中断方式rUFCON0 = 0; /rUMCON0 = 0;rUBRDIV0 = 26; /设置波特率,PCLK为50MHz,波特率为115.2kHzwhile(!(rUTRSTAT0 & 0x2); /等待并判断发送缓存是否为空rUTXH0 = 0xaa; /是空,则发送0xAA字节while(1) while(! 0x1); /等待并判断接收缓存是否准备好ch = rURXH0; /接收一个字节数据 rUTXH0 = ch; /发送一个字节数据switch(ch) /根据
9、所接收数据的不同,执行不同的程序 case 0x11: /灭LED rGPBDAT |= 0x1e0; break; case 0x22: /亮LED rGPBDAT &= 0x1f; case 0x33: /蜂鸣器不响= 0x1e0; case 0x44: /蜂鸣器响 rGPBDAT |= 0x1; default: /LED灭,蜂鸣器不响 rGPBDAT = 0x1e0; 下面是UART中断程序,它要比查询复杂一些,因为涉及到了中断处理,并且UART发送数据和接收数据是一个中断源。主程序循环体内不执行任何程序,都在UART中断程序内执行。当接收到0x55字节数据时,亮两个LED,当接收到其
10、他数据时,发送该字节,并在发送部分执行亮4个LED程序。#define _ISR_STARTADDRESS 0x33ffff00#define pISR_UART0 (*(unsigned *)(_ISR_STARTADDRESS+0x90)#define U32 unsigned int#define rGPBUP (*(volatile unsigned *)0x56000018) /Pull-up control B/#define rGPHDAT (*(volatile unsigned *)0x56000074) /Port H data#define rSRCPND (*(volatile unsigned *)0x4a000000) /Interrupt request status#define rINTMSK (*(volatile unsigned
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1