这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 芯圣HC18M003单片机的UART

共4条 1/1 1 跳转至

芯圣HC18M003单片机的UART

专家
2023-10-24 09:54:18     打赏

    学习芯圣HC18M003单片机已经很久了,一直都没有触及它的UART外设机能。现在为了调试IIC的通讯处理,提前把UART机能学习了。因为IIC通讯的过程有些复杂,产生中断时,根据IIC工作模式的不同,会产生不同的状态值。为了能及时输出中间调试信息,准备让UART接入,把通讯过程信息通过串口输出到电脑上,方便及时查看和调试。

一、特性

HC18M003单片机的UART具有以下特性:

➢ 自带波特率发生器

➢ 波特率发生器为一个 16 位向上的计数器

➢ 两种工作方式

➢ 增加帧错误,接收溢出及写冲突检测

➢ 增加地址自动识别

二、工作方式

UART有以下两种工作方式:

➢方式 0:8 位 UART,可变波特率,异步全双工

➢方式 1:9 位 UART,可变波特率,异步全双工

1、工作方式0

对于方式0,提供 10 位全双工异步通信,10 位由一个起始位(逻辑 0),8 个数据位(低位在前)和一个停止位(逻辑 1)组成。在接收时,这 8 个数据位存储在 SBUF 中而停止位储存在 RB8 中。方式 1中的波特率来源于波特率发生器。功能块框图如下图所示。

图片1.png

任何将 SBUF 作为目标寄存器的写操作都会启动发送,实际上发送是从 16 分频计数器中的下一次跳变之后的系统时钟开始的,因此位时间与 16 分频计数器是同步的,与对 SBUF 的写操作不同步。起始位首先在 TXD 引脚上移出,然后是 8 位数据位。在发送移位寄存器中的所有 8 位数据都发送完后,停止位在 TXD 引脚上移出,在停止位发出的同时 TI 标志置位。

图片2.png

只有REN置1时才允许接收。当RXD引脚检测到下降沿时串行口开始接收串行数据。为此,CPU对RXD不断采样,采样速率为波特率的16倍。当检测下降沿时,16分频计数器立即复位,这有助于16分频计数器与RXD引脚上的串行数据位同步。16分频计数器把每一位的时间分为16个状态,在第7、8、9状态时,位检测器对RXD端的电平进行采样。为抑制噪声,在这3个状态采样中至少有2次采样值一致数据才被接收。如果所接收的第一位不是0,说明这位不是一帧数据的起始位,该位被忽略,接收电路被复位,等待RXD引脚上另一个下降沿的到来。若起始位有效,则移入移位寄存器,并接着移入其它位到移位寄存器。8个数据位和1个停止位(包含错误的停止位,详细见寄存器SM2位说明)移入之后,

移位寄存器的内容和停止位(包含错误的停止位)被分别装入SBUF和RB8中,RI置1,但必须满足下列条件:

(1) RI = 0 

(2) SM2 = 0或者接收的停止位= 1 

如果这些条件被满足,那么停止位(包含错误的停止位)装入 RB8,8 个数据位装入 SBUF,RI被置位。否则接收的帧会丢失。这时,接收器将重新去探测 RXD 端是否另一个下降沿。用户必须用软件清零 RI,然后才能再次接收。

图片3.png

2、工作方式1

对于方式一,使用异步全双工通信中的 11 位。一帧由一个起始位(逻辑 0),8 个数据位(低位在前),一个可编程的第 9 数据位和一个停止位(逻辑 1)组成。方式 1 支持多机通信,在数据传送时,第 9数据位(TB8 位)可以写 0 或 1,例如,可写入 PSW 中的奇偶位 P,或用作多机通信中的数据/地址标志位。当接收到数据时,第 9 数据位移入 RB8 而停止位不保存。

任何将 SBUF 作为目标寄存器的写操作都会启动发送,同时也将 TB8 载入到发送移位寄存器的第9 位中。实际上发送是从 16 分频计数器中的下一次跳变之后的系统时钟开始的,因此位时间与 16 分频计数器是同步的,与对 SBUF 的写操作不同步。起始位首先在 TXD 引脚上移出,然后是 9 位数据。在发送转换寄存器中的所有 9 位数据都发送完后,停止位在 TXD 引脚上移出,在停止位开始发送时TI 标志置位。

图片4.png

  只有REN置位时才允许接收。当RXD引脚检测到下降沿时串行口开始接收串行数据。为此,CPU对RXD不断采样,采样速率为波特率的16倍。当检测下降沿时,16分频计数器立即复位。这有助于16分频计数器与RXD引脚上的串行数据位同步。16分频计数器把每一位的时间分为16个状态,在第7、8、9状态时,位检测器对RXD端的电平进行采样。为抑制噪声,在这3个状态采样中至少有2次采样值一致数据才被接收。如果所接收的第一位不是0,说明这位不是一帧数据的起始位,该位被忽略,接收电路被复位,等待RXD引脚上另一个下降沿的到来。若起始位有效,则移入移位寄存器,并接着移入其它位到移位寄存器。9个数据位移入之后,移位寄存器的内容被分别装入SBUF和RB8中,但必须满足下列条件:

(1) RI = 0 

(2) SM2 = 0或者接收的第9位= 1

  如果这些条件被满足,那么第9位移入RB8,8位数据移入SBUF。但还需要检测停止位,只有停止位为1,才能置位RI,如果停止位为0,则RI不会置位。

图片5.png


三、波特率

UART 自带一个波特率发生器,它实质上就是一个 16 位递增计数器。波特率公式如下:

Baud = Fcpu/16 / (65536−SBRT) ,SBRT = [SBRTH : SBRTL]

例如:设置SBRT = [SBRTH : SBRTL] = 0xFFE6,系统Fcpu=4M模式下

那么波特率 = Fcpu/16/(65536−SBRT)=4000000/16/(65536-65510)=9615约等于9600。

四、收发数据过程中可能遇到的错误

1、帧出错检测

3个错误标志位被置位后,只能通过软件清零,尽管后续接收的帧没有任何错误也不会自动清零。

2、发送冲突

如果在一个发送正在进行时,用户软件写数据到SBUF寄存器时,发送冲突位(TXCOL位)置1。如果发生了冲突,新数据会被忽略,不能被写入发送缓冲器(即不影响传送)。

3、接收溢出

RI置1,接收缓冲器中的数据未被读取,RI被清0,又开始新的数据接收,若在新的数据接收完成前(RI置1)还未读取之前接收缓冲区中的数据,在那么接收溢出位(RXROV位)置位。如果发生了接收溢出,接收缓冲器中原来的数据不影响,后面的数据则丢失。

4、帧出错

如果检测到一个无效(低)停止位,那么帧出错位(FE位)置1。

五、和UART有关的寄存器

1、控制寄存器 SCON、SCON2

1.1 SCON

图片6.png

1.2 SCON2

图片7.png

2、数据缓冲寄存器 SBUF

图片8.png

3、波特率发生器 BRTL、BRTH


图片9.png

图片10.png

六、针对不同封装的芯片,UART用管脚设置

对于TSSOP20脚封装的HC18M003,

图片11.png

可以被使用的管脚如下:

TX: PB6,PA0,PC0,PD4

RX: PB7,PA7,PC2

我们在使用IIC时,已经预定使用PC0和PC2,所以,测试UART时,准备使用PB6和PB7作为串口的通讯管脚。

设置管脚时,需要使用特殊寄存器:端口通讯端口映射寄存器UARTMAP和端口映射寄存器 INTMAP。

1、端口通讯端口映射寄存器UARTMAP

图片12.png

注意:(1)、TXD 映射部分寄存器位于 INTMAP 寄存器之B5、B4位。

   (2)、配置完成映射后,需要用户手动配置 IO 状态。

2、端口映射寄存器 INTMAP

图片13.png

串口测试程序




关键词: 菜鸟学单片机     芯圣     HC18M003     UART    

院士
2023-10-25 18:18:55     打赏
2楼

看上去,8位机与32位MCU上对Uart外设的实现区别并不大了。

自带波特率发生器后,省事多了


专家
2023-10-25 23:52:28     打赏
3楼

确实是省事儿多了。但这个芯片的波特率,准确度有点儿差强人意啊。目前来看9600还可以。再高了,偏移有点大。


院士
2024-07-05 18:46:55     打赏
4楼

谢谢分享,学习了。


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]