S3C2440裸机实验(2)-----uart

发布者:GHR2596最新更新时间:2022-02-18 来源: eefocus关键字:S3C2440  裸机实验  uart 手机看文章 扫描二维码
随时随地手机看文章

调试程序时,我们可以使用查看变量的方法,但是还是不能离开调试信息的打印。。。。。在开始其他实验时,首先把uart功能实验,方便调试。


1.UART 支持中断模式和DMA模式


2.如果是使用系统时钟,UART最高能支持115.2k/s的数据传输,如果是使用外部的时钟,速度将更高,每道uart有FIFO模式和非FIFO模式,在FIFO模式中有两个64字节的FIFO分别用于接收和发送数据,在非FIFO模式中只有1字节的缓存区


3.下面是uart的结果图

4..从上面的结构图可以看出,UART由:波特率发生器,发送缓存和接收缓存,控制单元四个部分组成,波特率发生器可以是系统时钟(PCLK,FCLK/N)或者外部时钟(UEXTCLK),发送器和接收器各包含一个64字节的FIFO和数据移位器。要发送数据时,先将数据写入到FIFO接着在发送前复制到发送移位器中,随后将数据从发送数据引脚(TXDn)移出;接收数据时,从接收数据引脚(RXDn)移入收到的数据,接着从移位器复制到FIFO。


5.在串行通讯处理中,常常看到硬件流控制(RTS/CTS)和软件流控制(XON/XOFF)这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中


硬件流控制常用的有RTS/CTS流控制和DTR/DSR(数据终端就绪/数据设置就绪)流控制。


由于电缆线的限制,我们在普通的控制通讯中一般不用硬件流控制,而用软件流控制。一般通过XON/XOFF来实现软件流控制。常用方法是:当接收端的输入缓冲区内数据量超过设定的高位时,就向数据发送端发出XOFF字符(十进制的19或Control-S,设备编程说明书应该有详细阐述),发送端收到XOFF字符后就立即停止发送数据;当接收端的输入缓冲区内数据量低于设定的低位时,就向数据发送端发出XON字符(十进制的17或Control-Q),发送端收到XON字符后就立即开始发送数据。一般可以从设备配套源程序中找到发送的是什么字符。


应该注意,若传输的是二进制数据,标志字符也有可能在数据流中出现而引起误操作,这是软件流控制的缺陷,而硬件流控制不会有这个问题。


在2440中,只有当CTS信号有效才可以发送数据,CTS有效表明其他的UART的FIFO准备好接收数据,在接收数据之前,RTS应该是有效的,并且FIFO应该是大于32字节,否则为非有效状态


注意:2440的UART 2不支持自动流控制(AFC)


6.LoopBack操作模式:

S3C2410 CPU的UART提供了一种测试模式,也就是这里所说的LoopBack模式。在设计系统的具体应用时,为了判断通讯故障是由于外部的数据链路上的问题,还是CPU内驱动程序或CPU本身的问题,这就需要采用LoopBack模式来进行测试。在LoopBack模式中,资料发送端TXD在UART内部就从逻辑上与接收端RXD连在一起,并可以来验证资料的收发是否正常。


7.uart波特率计算公式:

UBRDIVn  = (int)( UART clock / ( buad rate x 16) ) –1


For example, if the baud-rate is 115200 bps and UART clock is 40 MHz, UBRDIVn is:


UBRDIVn  = (int)(40000000 / (115200 x 16) ) -1


= (int)(21.7) -1    [round to the nearest whole number]


= 22 -1 = 21


8.核心代码:

#include "uart.h"

#include "2440addr.h"

#include

#include

#include

#include

#include

#include


//端口和波特率初始化

void uart_init(int baud)

{


   int i;

    //*** PORT H GROUP

    //Ports  :  GPH10    GPH9  GPH8 GPH7  GPH6  GPH5 GPH4 GPH3 GPH2 GPH1  GPH0 

    //Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0

    //Binary :   00   ,  00     00 , 00    00  , 00  00 , 10   10 , 10    10

rGPHCON = 0xaa ;

//rGPHCON = 0x2a0aaa ;

rGPHUP  = 0x7ff;    // The pull up function is disabled GPH[10:0]

   // 0  0  000  0 11

    rULCON0 = 0x3;//Line control register : Normal,No parity,1 stop,8 bits

// [15:12] [11:10]    [9]   [8]  [7]  [6]    [5]  [4]  [3:2]  [1:0]

//            00      1       0   0     1     0     0    01     01

 

    rUCON0 =0x245;

rUFCON0 = 0x0;   //不使用FIFO

rUMCON0  = 0x00;     // 不使用流控

    rUBRDIV0=( (int)(PCLK/16./baud+0.5) -1 );   //Baud rate divisior register 0

    for(i=0;i<100;i++);


}


//字节发送

void uart_send_byte(int data)

{

if(data == '/n') {    //结束符

while(!(rUTRSTAT0 &0x2)) ;   //等待发送缓冲区为空

WrUTXH0('/r');  //直接写数据到UTXH0寄存器

}

//特别需要注意下面的语句不是用else和if并列

while(!(rUTRSTAT0 &0x2)) ;  //等待发送缓冲区为空

WrUTXH0(data);


}


//发送字符串

void uart_send_string(char *string)

{

while(*string)

uart_send_byte(*string++);

}



//实现类似printf函数变量输出

void uart_printf(char *fmt,...)

{

va_list ap;

char string[256];

va_start(ap,fmt);

vsprintf(string,fmt,ap);

uart_send_string(string);

va_end(ap);

}


//从终端读取单个字符

char uart_getch(void)

{

while(!(rUTRSTAT0 &0x1)) ; //等待接收缓冲区中不为空

return  RdURXH0();    //直接返回接收数据寄存器URXH0中的值

}


//获取数据

char uart_get_key(void)

{

   if(rUTRSTAT0 &0x1)  //检查buffer中是否有数据

return  RdURXH0(); 

else 

return 0;

}



//从终端得到一个字符串,保存到string中

void uart_get_string(char *string)

{

    char *string2 = string;

char c;

while((c = uart_get_key())!='/r')   //回车

{

if(c == '/b') {   //backspace

if((int)string2 < (int)string) {

uart_printf("/b /b");  //删除最后一个字符

string --;

}

}  else {

*string++ = c;

uart_send_byte(c);   //将输入的字符回显到终端,如果没有该语句在终端上看不到输入的内容

}

}

*string = '/0';

uart_send_byte('/n');

}


关键字:S3C2440  裸机实验  uart 引用地址:S3C2440裸机实验(2)-----uart

上一篇:S3C2440裸机实验(4) -----IIC
下一篇:S3C2440裸机实验(1)-----clock

推荐阅读最新更新时间:2024-11-08 10:25

MSP430学习总结——UART串口
一、MSP430串口 我用的这个单片机是MSP430F5529,这个单片机有两个串口,分别是USCI_A0和USCI_A1,以下是关于MSP430串口的配置以及接收函数和发送函数。 二、串口配置 说到串口,那肯定离不开起始位、数据位、校验位、停止位以及波特率。 先来说一下常用的寄存器。 串口控制寄存器0 这个寄存器可以设置数据位,停止位和校验位等 串口控制寄存器1 这里可以设置时钟源和中断使能等 波特率设置寄存器 波特率设置涉及到三个寄存器UCA0BR,UCA0BR1,UCA0MCTL 具体的设置方法在芯片手册上有写,也可以参考一下这位大佬的博客https://blog.csdn.net/weixin_27070451
[单片机]
MSP430学习总结——<font color='red'>UART</font>串口
S3C2440裸机------异常与中断__定时器中断程序示例
1.定时器的工作原理 注意当TCNTn=TCMPn时不会产生中断。 2.代码 2.1 timer.c 首先是根据上面的两个寄存器设置时钟; /* 设置TIMER0的时钟 */ /* Timer clk = PCLK / {prescaler value+1} / {divider value} = 50000000/(99+1)/16 = 31250 */ TCFG0 = 99; /* Prescaler 0 = 99, 用于timer0,1 */ TCFG1 &= ~0xf; TCFG1 |= 3; /* MUX0 : 1/16 */ 然后根据上图的寄存器设置初始值。 /*
[单片机]
<font color='red'>S3C2440</font><font color='red'>裸机</font>------异常与中断__定时器中断程序示例
STM8与汇编语言(9)--UART应用之一
STM8单片机的UART功能很强,即可以作为普通的UART来使用,也支持LIN(局部互连网)。这里给出的例子是作为普通的UART来使用的。 在使用UART时,主要面向的寄存器有:控制寄存器CR1、CR2和CR3,数据寄存器DR,状态寄存器SR,还有波特率寄存器BRR1和BRR2。 这里特别要指出的是波特率寄存器是一个比较怪的设计,也说不清为啥这么设计,反正用起来相当别扭。例如,当主时钟为2MHZ时,如果要求波特率为9600,则分频系数DIV=2000000/9600=208,变成16进制数就是00D0。按照常规理解,那就是00送波特率分频寄存器的高8位,D0送波特率分频寄存器的低8位。但在STM8单片机中却不是这样,BRR
[单片机]
S3C2440 测试程序(三) ADC实验
该实验比较简单,就是使用了S3C2440上的ADC硬件接口AIN2。 下面看下设置。 根据Datasheet,A/D转换的频率为50MHz/(prescaler+1) eg. A/D converter freq. = 50MHz/(49+1) = 1MHz Conversion time = 1/(1MHz / 5cycles) = 1/200KHz = 5 us 看下程序,我们使用了2.5MHz,所有prescaler=19 代码如下: prescaler=19; ADCCON=(1 14)|(prescaler 6)|(2 3); 注: bit :Read only, 0--A/D conversion in
[单片机]
S3C2440—8.读写SDRAM
SDRAM:Synchronous Dynamic Random Access Memory,同步动态随机存储器,同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写 一.内部结构 原理图如下: 存储逻辑结构: 可以看出SDRAM的内部是一个阵列,就像表格一样,其寻址方式是按照块、行、列来的,即先选定SDRAM芯片,然后发出块信号确定那一块,再发出行信号确定哪一行,再发出列信号确定哪一列。 CPU对SDRAM的访问可以分为以下几步: CPU对存储控制器发出统一编址 内存控制器发出片选信号
[单片机]
<font color='red'>S3C2440</font>—8.读写SDRAM
s3c2440裸机-ADC编程
ADC硬件原理 模数转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件。 如图,是把可变电阻上的电压值变换的模拟信号通过ADC转换,输出数字信号。 对于数字信号我们需要得到它的2个属性: 1.转换精度: 用多少位来存储这个数据(假如是10 bit)。那么最大值0b111111111对应3.3v, 0b0对应0v。 2.采样/转换速度: 可以看出s3c2440的转换精度可达10 bit, 转换速率可达 500ksps. 下图是s3c2440芯片的ADC转换框图, 从上图可以看出AD converter前有一个MUX选择器,用来选择模拟输入源,这里选择A 作为输入源。 下面是编写程序要做的步骤:
[单片机]
<font color='red'>s3c2440</font><font color='red'>裸机</font>-ADC编程
STM8与汇编语言(11)--UART应用之三
下面这个实验程序是在上一个实验程序的基础上,将字符接收改成中断方式。每当接收到一个字符,进入中断服务程序,在中断服务程序中,从UART的接收数据寄存器中读出字符,然后通过字符发送子程序发送出去。如果与WINDOWS的超级终端相连,则键盘上按什么按键,则显示对应的字符。 同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。要注意的是,一定要将串口的接收中断服务程序的入口地址填写中断向量表中正确的位置。 编译通过后,下载到开发板,运行程序。在PC机上运行超级终端,波特率为9600,然后从键盘上输入按键,屏幕上就显示对应的字符。 stm8/ #include map
[单片机]
S3C2440 ADC(模/数转换器)
  A/D转换,又称为模/数转换,是将模拟量信号转换为计算机能够处理的数字信号。S3C2440集成了8通道10位CMOS A/D转换器,最大转换率为2.5MHz A/D转换器时钟下的500KSPS。A/D转换器支持片上采样-保持功能和掉电模式的操作。   有如下特性:   分辨率:10位   差分线性误差:±1.0LSB   积分线性误差:±2.0LSB   最大转换率:500KSPS   功耗低   供电电压:3.3V   模拟输入范围:0~3.3V   片上采样-保持功能   普通转换模式   分离的X/Y方向转换模式   自动(顺序)X/Y方向转换模式   等待中断模式   对于s3c2440来说,实现A/D转换比较简单
[单片机]
<font color='red'>S3C2440</font> ADC(模/数转换器)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved