历史上的今天
返回首页

历史上的今天

今天是:2025年11月04日(星期二)

正在发生

2022年11月04日 | 2440串口linux编程,s3c2440的串口控制

2022-11-04 来源:csdn

在配置完s3c2440的系统时钟后,我们来控制串口.之所以将串口放在这么靠前,是因为串口会给我们带来更多的信息.在没有串口的时候,uboot启动阶段只能靠led来显示一些信息.那么有了串口,debug就方便很多了.在工作中,一般情况下,很少有机会用jtag口加上昂贵的codeviser工具进行debug,也很少用gdb进行远程debug的,用的最多的还是打开debug的define来分析确定问题.


还是从s3c2440的datasheet开始:

s3c2440A的UART提供3个独立的异步串行IO口,每一个都支持中断和DMA.换句话来说,UART可以产生中断请求或DMA请求来在CPU和UART之间传输数据.UART在系统时钟下最高支持115200的波特率.如果使用UEXTCLK的话,UART可以工作在更高速的时钟下.每个UART通道都有来年各个64字节的FIFO,一个是接收用的,一个是发送用的.


UART包括可编程的波特率,IR发送/接受,一或两个停止位,5/6/7/8个数据位和奇偶校验.

每个UART包括一个波特率产生器,发送器,接收器和一个控制单元.波特率产生器可以由PCLK FCLK/n 或者UEXTCLK来锁定.发送器和接收器包含64字节的FIFO和数据移位器.数据首先写到FIFO中,然后在发送之前复制到发送器的移位器.最后数据移位通过TxDn数据发送管脚发送出去.同样的,接收的数据通过RxDn接收数据管脚移位进来,然后从移位器拷贝到FIFO中.


UART的框图如下:

f48557590abeb504f39aeac560dd96d1.png?imageView2/2/w/550

值得说的是:在FIFO模式下,buffer寄存器的所有64个字节都被用作FIFO寄存器.而在非FIFO模式下,buffer寄存器只有一个字节被用于Holding寄存器.


串口的操作:

串口操作包括如下:数据发送,数据接收,中断产生,波特率产生,loopback模式,IR模式和自动流控制.


数据发送:

发送的数据帧是可编程的.它包括一个开始位,5到8个数据位,一个可选的校验位和1到2个停止位,这些都在ULCONn寄存器中控制.发送器可以产生终止条件,可以在一个数据帧的发送时间内强制串口输出为逻辑0.在当前的传输数据发送完成后会发送一个终止信号,在终止信号发送后,它会继续发送数据到Tx FIFO(而在非FIFO模式下是Tx holding寄存器).


数据接收:

和发送一样,接收的数据帧也是可编程的.它包括一个开始位,5到8个数据位,一个可选的校验位和1到2个停止位(ULCONn中设置).接收器可以探测overrun错误parity错误frame错误和终止条件,每一个都会设置一个错误标记.


overrun错误:在旧的数据被读完之前新的数据覆盖了旧的数据

parity错误:接收器探测到一个未知的校验条件

frame错误:接收数据没有有效的停止位

终止条件:RxDn输入在长于一个帧传输时间的期间内保持为逻辑0

中断/DMA请求产生

每个UART有7个状态信号(Tx/Rx/error):overrun error,parity error,frame error,break,接收缓冲数据准备,发送缓冲空和发送移位器空.所有都由对应的UART状态寄存器(UTRSTATn/UERSTATn)来指示.


overrun错误,parity错误,frame错误和终止条件都是接收错误状态.如果UCONn的接收错误状态中断使能位被置位,每一个错误都可以引起接收错误状态中断请求.当一个接收错误状态中断请求被探测到,可以通过读UERSTSTn来识别.


当在FIFO模式下接收器将数据从接收器的移位器发送到接收器的FIFO寄存器,接收的数据达到了Rx FIFO的触发线,Rx中断产生.如果在控制寄存器(UCONn)接收模式被选为1(中断请求或轮循模式).在非FIFO模式下,将数据从接收器的移位器发送到接收holding寄存器会引起Rx中断(中断请求和轮循模式下).


当发送器从发送器的FIFO寄存器发送数据到移位寄存器时,发送器的FIFO中存留的数据数量小于Tx FIFO的触发线时,Tx中断产生,如果控制寄存器的发送模式被选为中断请求或者轮循模式.在非FIFO模式下,在中断请求和轮循模式下从发送器的Holding寄存器发送数据到发送器的移位器会引起Tx中断.


如果控制寄存器的接收模式和发送模式选为DMA请求模式,在上面提到的条件下DMA请求会取代Tx或者Rx中断请求.


UART错误状态FIFO

UART除了有Rx FIFO寄存器外还有错误状态FIFO.错误状态FIFO会指明在FIFO寄存器中哪个数据在接收时是错误的.当有错的数据被读出时,错误中断就产生.为了清除错误状态FIFO,有错误的URXHn和UERSTATn就必须被读出.


波特率的产生:

每个UART的波特率产生器为发送器和接收器提供特定的时钟.波特率产生器的时钟源可以选为内部系统时钟或者UEXTCLK.换句话说,被除数由UCONn寄存器的时钟选择确定.波特率的时钟由源时钟(PCLKFCLK/nUEXTCLK)除以16和UART波特率除数寄存器(UBRDIVn)中的16bit除数.


公式如下:

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

( UART clock: PCLK, FCLK/n or UEXTCLK )

接下来看各个寄存器的描述:

UART LINE CONTROL REGISTER

ULCONn用来配置每一帧数据的格式的:

f54781652af6d3ac145c56303f4c62d3.png?imageView2/2/w/550

根据上图,配置如下:

IR mode[6] = 0(普通模式)    Parity Mode[5:3] = 0xx(无校验)        Number of Stop Bit[2] = 0(一个停止位)

word Length[1:0] = 11(8-bits)

UART CONTROL REGISTER

b63673ccaf02bd39033f5061ffc762db.png?imageView2/2/w/550

如果Uart的时钟源用FCLK/n,那么FCLK Divider就是配置这个n的

8b634e694a19ed3514b63d10946e620e.png?imageView2/2/w/550

这个地方就是配置Uart的时钟源

Tx Interrupt Type    [9]    中断请求类型:0是Pulse 1是Level

Rx Interrupt Type    [8]    中断请求类型:0是Pulse 1是Level

Rx Time Out Enable    [7]    在FIFO使能的情况下,是否打开Rx Time Out中断  0是关闭  1是打开

Rx Error Status Interrupt Enable    [6]    使能Uart对异常产生中断,比如各种错误    0是关闭    1是打开

Loopback Mode    [5]    回环模式    0是普通模式    1是回环模式

Send Break Signal    [4]    是否发送终止信号    0是正常    1是发送终止信号

Transmit Mode    [3:2]    决定使用哪种功能来写数据到发送缓冲寄存器   01中断请求或轮循模式

Receive Mode    [3:2]    决定使用哪种功能来从接收缓冲寄存器读数据    01中断请求或轮循模式

UART FIFO CONTROL REGISTER

c7f46d096b59e303e4a7ec74513c92e0.png?imageView2/2/w/550

UART MODEM CONTROL REGISTER

这个和MODEM控制相关,设置为默认值就行.

UART TX/RX STATUS REGISTER

这个寄存器是只读的,负责反映发送接收的状态

111880604317a772ac9f56679f334cfd.png?imageView2/2/w/550

UART ERROR STATUS REGISTER

这个寄存器也是只读的,负责反映错误状态

fa87eb3d0e3f297a9f49a005c70fba4b.png?imageView2/2/w/550

UART FIFO STATUS REGISTER

这个寄存器也是只读的,负责反映FIFO的状态

9a8b009af287ec329e2bbbce24615367.png?imageView2/2/w/550

UART MODEM STATUS REGISTER

这个寄存器是MODEM状态的,不用管它

UART TRANSMIT BUFFER REGISTER (HOLDING REGISTER & FIFO REGISTER)

发送缓冲寄存器:FIFO模式下叫FIFO寄存器,非FIFO模式下叫Holding寄存器

需要注意的就是大小端

UART RECEIVE BUFFER REGISTER (HOLDING REGISTER & FIFO REGISTER)

接收缓冲寄存器:FIFO模式下叫FIFO寄存器,非FIFO模式下叫Holding寄存器

UART BAUD RATE DIVISOR REGISTER

波特率除数寄存器

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

( UART clock: PCLK, FCLK/n or UEXTCLK )

看完datasheet后,我们看一下TQ2440的原理图:

163f3775c332bbd80f3750763a8c4f5c.png?imageView2/2/w/550

由原理图可以看出,TQ2440使用的UART0,我们用MAX232芯片做电平转换.

有了datasheet和原理图,下面就开始写汇编代码了:

时钟初始化和uart初始化用汇编写的:

@.externuart_test

.equ    GPBCON, 0x56000010

.equ    GPBDAT,  0x56000014

.equ GPB5_out,  (1<

.equ GPB6_out,  (1<

.equ GPB7_out,  (1<

.equ GPB8_out,  (1<

.equ    GPHCON, 0x56000070

.equ    GPHDAT, 0x56000074

.equ GPBVALUE,    (GPB5_out | GPB6_out | GPB7_out | GPB8_out)

.equ    LOCKTIME, 0x4c000000

.equ    MPLLCON, 0x4c000004

.equ    UPLLCON, 0x4c000008

.equ    M_MDIV, 92

.equ   M_PDIV, 1

.equ    M_SDIV, 1

.equ    U_MDIV, 56

.equ   U_PDIV, 2

.equ    U_SDIV, 2

.equ    CLKDIVN, 0x4c000014

.equ    DIVN_UPLL, 0

.equ    HDIVN,  1

.equ    PDIVN,  1    @FCLK : HCLK : PCLK = 1:2:4

.equ    ULCON0, 0x50000000

.equ    IR_MODE,    0x0   @[6]正常模式

.equ    Parity_Mode,    0x0 @[5:3]无校验位

.equ    Num_of_stop_bit,  0x0  @[2]一个停止位

.equ    Word_length,    0b11    @[1:0]8个数据位

.equ    UCON0,  0x50000004

.equ    FCLK_Div,   0   @[15:12]  时钟源选择用PCLK,所以这里用默认值

.equ    Clk_select, 0b00    @[11:10] 时钟源选择使用PCLK

.equ    Tx_Int_Type, 1  @[9]  中断请求类型为Level

.equ    Rx_Int_Type, 0 @1  @[8]  中断请求类型为Level

.equ    Rx_Timeout, 0  @[7]

.equ    Rx_Error_Stat_Int, 1 @[6]

.equ    Loopback_Mode, 0 @[5]  正常模式

.equ    Break_Sig,  0 @[4] 不发送终止信号

.equ    Tx_Mode,    0b01 @[3:2]  中断请求或轮循模式

.equ    Rx_Mode,    0b01 @[1:0]  中断请求或轮循模式

.equ    UFCON0, 0x50000008

.equ    Tx_FIFO_Trig_Level, 0b00 @[7:6]

.equ    Rx_FIFO_Trig_Level, 0b00 @[5:4]

.equ    Tx_FIFO_Reset,  0b0 @[2]

.equ    Rx_FIFO_Reset,  0b0 @[1]

.equ    FIFO_Enable,    0b0 @[0] 非FIFO模式

.equ    UMCON0, 0x5000000C    @这个寄存器可以不管的

.equ    UTRSTAT0,   0x50000010

.equ    UERSTAT0,   0x50000014

.equ    UFSTAT0,    0x50000018

.equ    UMSTAT0,    0x5000001C

.equ    UTXH0,      0x50000020   @(L 小端)

.equ    URXH0,      0x50000024   @(L 小端)

.equ     UBRDIV0,    0x50000028

.equ     UBRDIV,    0x35   @PCLK=400M/4=100M   UBRDIV = (int)(100M/115200/16) - 1 = 53 = 0x35

.global _main

_main:

ldr r0,=GPBCON

ldr r1,=0x15400

str r1, [r0]

ldr r2,=GPBDAT

bl clock_setup

bl uart_init

bl delay

ldr lr, =loop

@bl  uart_test  dd

ldr pc, _uart_test

_uart_test: .word uart_test

loop:

b loop                                               @ 死循环

ledloop:

ldr r1,=0x1c0

str r1,[r2]

bl delay

ldr r1,=0x1a0

str r1,[r2]

bl delay

ldr r1,=0x160

str r1,[r2]

bl delay

ldr r1,=0x0e0

str r1,[r2]

bl delay

b ledloop

clock_setup:

ldr r0,=LOCKTIME

ldr r1,=0xffffffff

str r1, [r0]

ldr r0,=CLKDIVN

ldr r1,=(DIVN_UPLL<<3) | (HDIVN<<1) | (PDIVN<<0)

str r1, [r0]

ldr r0,=UPLLCON

ldr r1,=(U_MDIV<<12) | (U_PDIV<<4) | (U_SDIV<<0)   @Fin=12M  UPLL=48M

str r1, [r0]

nop

nop

nop

nop

nop

nop

nop

ldr r0,=MPLLCON

ldr r1,=(M_MDIV<<12) | (M_PDIV<<4) | (M_SDIV<<0)    @Fin=12M  FCLK=400M

str r1, [r0]

mov pc,lr

uart_init:

ldr r0,=GPHCON

ldr r1,=0x2aaaa     @配置GPIO复用规则为串口

str r1, [r0]

ldr r0,=ULCON0

ldr r1,=(IR_MODE<<6) | (Parity_Mode<<3) | (Num_of_stop_bit<<2) | (Word_length<<0)    @

str r1, [r0]

ldr r0,=UCON0

ldr r1,=(FCLK_Div<<12) | (Clk_select<<10) | (Tx_Int_Type<<9) | (Rx_Int_Type<<8) | (Rx_Timeout<<7) | (Rx_Error_Stat_Int<<6) |(Loopback_Mode<<5) | (Break_Sig<<4) | (Tx_Mode<<2) | (Rx_Mode<<0)

str r1, [r0]

ldr r0,=UFCON0

ldr r1,=(Tx_FIFO_Trig_Level<<6) | (Rx_FIFO_Trig_Level<<4) | (Tx_FIFO_Reset<<2) | (Rx_FIFO_Reset<<1) | (FIFO_Enable<<0)    @

推荐阅读

史海拾趣

Cembre SPA公司的发展小趣事

Cembre SPA的创始人,以其对电子行业的深刻理解和远见,于XXXX年创立了这家公司。在初创期,他看到了电气连接和固定技术在工业领域中的巨大潜力,并决定专注于此。公司最初的产品线集中在电缆接头和固定设备上,这些产品以其高质量和易用性迅速获得了市场的认可。

ESS [ESS Technology,Inc]公司的发展小趣事

随着公司规模的不断扩大和市场份额的增加,ESS开始在全球范围内扩张其业务。ESS的分支机构遍布美国各地,同时也在中国、日本、韩国等地设立了海外机构。这些海外机构不仅有助于ESS更好地了解当地市场需求和竞争态势,还为公司在全球范围内推广其产品和服务提供了有力支持。ESS的全球战略布局为其在竞争激烈的半导体芯片市场中保持领先地位提供了有力保障。

General Magnetics Inc公司的发展小趣事
用于电力传输和分配过程中的电压变换。
AntennaHome公司的发展小趣事

为了进一步提升品牌影响力和市场知名度,AntennaHome公司积极参与国际电子行业的各大展会。在展会上,公司展示了最新的天线技术和产品,吸引了众多国内外客户的关注。通过与客户的深入交流,公司不仅收获了宝贵的市场信息和合作机会,还进一步提升了品牌在行业内的地位。

bb-smartworx公司的发展小趣事

AntennaHome公司自创立之初,便以技术创新为核心竞争力。公司的创始人在无线通信领域拥有深厚的技术背景和丰富的行业经验,他们敏锐地捕捉到了市场对于高性能天线产品的需求。于是,公司投入大量资源进行研发,成功开发出了一款具有高效能、低损耗特点的新型天线产品,这一创新为公司在市场上赢得了良好的口碑。

Aromat Corp公司的发展小趣事

在快速发展的过程中,Aromat Corp始终关注社会责任。公司积极参与公益活动,支持教育事业和环保事业。同时,Aromat Corp还注重员工的成长与发展,提供良好的工作环境和福利待遇,激发员工的创新精神和团队合作精神。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实的基础。

这五个故事只是虚构的Aromat Corp公司的发展概况,并不代表任何真实公司的实际情况。每个公司的发展历程都是独一无二的,受到市场环境、技术趋势、管理决策等多种因素的影响。

问答坊 | AI 解惑

初学者提问:下一步该怎么办?

刚刚学完了MR.Walter Oney的《Programming the Windows Driver Model》第二版,下面该做些什么来运用学到的知识? 我只是爱好者,没有合适的工作环境来供我尝试,请教我下面该怎么做。。。…

查看全部问答>

UART的问题

最近在用写UART的程序,出现了点问题: 1.设置中断级数为1,就是每收到一个数据就中断一次,中断处理程序中,把收到的字符发回去。 2。利用terminal调试,一次性发送“wanly”,接受到的数据除了w是正确的,其他全是乱码。 为什么呢?…

查看全部问答>

进不了中断~~~~

主程序如下: void main() { TMOD=0x20; TH1=0xf4; TL1=0xf4; TR1=1; PCON=0x00; SCON=0x40; ES=1; EA=1; while(1) { SBUF=0x00;//此处并没有进入中断,TI没有等于1 } } 这是怎么回事啊?…

查看全部问答>

简版 JLINK ARM 仿真器(即日起-2010年11月26日)

智林发布业界最小的JLINK仿真器,短小精悍携带方便   受智林测控委托,特发起此次活动 原价:48元 EEWORLD团购价:45元 活动日期:即日起——2010年11月26日止 EEWORLD团购淘宝链接(直接拍即可):http://item.taobao.com/auction/item_d ...…

查看全部问答>

调试串口小结

最近买了利而达的学习板MSP-TEST-42FE,用的是430FE425芯片。调串口程序用例程也调不同,上示波器UTXD有脉冲输出,肯定是MAX3221出了问题,学习板中MAX3221的_FORCEOFF是接MSP的P1.4脚,MAX3221工作模式有三种,一种普通模式,一种自动调电模式还有 ...…

查看全部问答>

求救···关于红外热释电传感器D203S的应用

我是用来检测人的存在(范围20CM) 要求有人时控制蜂鸣器响 无人时不响 能否直接供电之后输出接在51的IO口上?如果不能 现手上有一块LM311比较器 能否告知D203S和LM311的电路该如何接使得能直接接IO口控制蜂鸣器? 电源5V…

查看全部问答>

上位机程序和软件使用手册

本来是想把软件使用文档都贴出来的,但是图形和文字不能一起,好麻烦。弄了好久没弄好。所以直接上传了部分,具体看下说明手册。感觉好的东西收点辛苦费还是应该的吧一枚不算多吧?(后期我会专门讲解部分功能实现过程,相信群里好多搞电子的也想玩 ...…

查看全部问答>

DSP Sitara入门课程学习进度停在50%

视频看了好长时间,但是进度就是不动,看别人的截图,有能到100%的,但我的每一个都只能到50%,不知道为什么。 在xp下用IE8和chrome试过,在ubuntu下用chrome试过。…

查看全部问答>

STM32的5v继电器驱动电路

请问谁能指点这个电路怎末设计,小妹感激不尽 …

查看全部问答>

AT28C16

各位大神指导一下该芯片的19引脚如何用呢??? 芯片AT28C16        存储器…

查看全部问答>