打印
[其它应用]

EUART接口通讯

[复制链接]
522|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-4-15 10:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、资源介绍
SH79F9476 有3个自带波特率发生器的EUART0/1/2(波特率发生器是一个15位向上计数器)。
SH79F9476的EUART有四种工作方式,3个EUART功能基本一样。下面主要介绍 EUART0。

二、工作方式介绍
1. 四种通讯方式
(1)方式0:同步通信
波特率由系统时钟频率决定,帧长度为8位,无起始位、停止位和第9位。在这种模式下,通信开始时等待RIx标志位(接收中断标志)为0并且RENx标志位(接收使能标志)为1,然后发送一个时钟信号到TXDx引脚,并在RXDx引脚上接收8位数据。

(2)方式1:异步通信
波特率由EUART自带的波特率发生器控制,波特率为溢出率除以16,帧长度为10位(1个起始位、8位数据、1个停止位),没有第9位。在这种模式下,通信开始时从输入的起始位初始化接收,并且都设置为1。

(3)方式2:异步通信
,波特率由系统时钟频率决定,帧长度为11位(1个起始位、8位数据、1个停止位、1个第9位),第9位可设置为0或1。波特率由系统时钟频率除以32或64决定。

(4)方式3:异步通信
波特率由EUART自带的波特率发生器控制,波特率为溢出率除以16,帧长度为11位(1个起始位、8位数据、1个停止位、1个第9位),第9位可设置为0或1。在这种模式下,通信开始时从输入的起始位初始化接收,并且都设置为1。

通过配置SCON寄存器的SM0、SM1用来配置运行方式,如下图所示:



2. 波特率计算公式
(1)方式0
波特率可编程为系统时钟的1/12或1/4,由SMx2位决定。

当SMx2为0时,串行端口在系统时钟的1/12下运行。
当SMx2为1时,串行端口在系统时钟的1/4下运行。
(2)方式1和方式3中,波特率可微调
精度为一个系统时钟,公式 如下:



以系统时钟24M为例,要得到9600Hz波特率:

(int)X=FSY/(16波特率) ;
SBRT=32768-X ;
SFINE=(FSY/波特率)-16X
FSY=8M

(3)方式2
波特率固定为系统时钟的1/32或1/64,由SMOD位(PCON.7)决定 。

三、寄存器
1. EUART0控制及状态寄存器



2. EUART0 数据缓冲寄存器



3. 波特率发生器寄存器



4. 波特率发生器微调寄存器



开启中断
EUART0的中断允许位在IEN0, 位置如图所示:


通过下面代码 开启EUART0的中断:

IEN0 |= 0x10;


三、实验代码
1. 硬件连接
TX:引脚 P3.3
RX:引脚 P3.4



通过USB转串口工具,将串口连接到电脑,并打开串口助手进行调试。
2. 代码
下面代码实现的功能是:

mcu启动时,向串口发送字符0x32。
串口收到字符时,将数值+1后,通过串口再发出去。
要注意的是,代码选项:“内部 128kHz RC 振荡器作为振荡器 1,24MHz 内部 RC 作为振荡器 2”,如下图所示:



(1)euart_utils.h
#include "intrins.h"
#include "euart_utils.h"
#include "api_ext.h"
#include "SH79F9476.h"
#include "cpu.h"
/**
* @brief 初始化串口
*/
void uart0_init(){
    //=====TX 建议配置为输出H====
    P3CR = 0x08;
    P3 = 0x08;
    // 配置Uart工作在模式1
    select_bank1();
                // 0110 0111 Tx:P3.3   Rx:P3.4
    UART0CR = 0x67;
    select_bank0();
    SCON=0x50;
    /*配置波特率参数,波特率9600*/
    /* 计算公式:(int)X=FSY/(16*波特率) ;  SBRT=32768-X  ;   SFINE=(FSY/波特率)-16*X   FSY=8M*/
                // 波特率发生器高位
    SBRTH = 0xFF;
                // 波特率发生器低位
    SBRTL = 0x64;
                // 波特率发生器微调
    SFINE = 0x04;
}
/**
* @brief 发送一个字节
*/
void uart0_send_byte(u8 byte){
    SBUF = byte;
    while(!TI);
    TI = 0;
}
/**
* @brief UART0中断
**/
void INT_EUART0(void) interrupt 4{
        u8 dat;
        _push_(INSCON);
       
        // 收的数值+1 再返回去
        while(!RI);
        dat = SBUF;
        RI = 0;   
        _pop_(INSCON);

        dat ++;
        uart0_send_byte(dat);      
}



(2)main.c
#include "SH79F9476.h"
#include "cpu.h"
#include "intrins.h"
#include "api_ext.h"
#include "clk_util.h"
#include "euart_utils.h"
#include "irq_util.h"


void main()
{
        // 选择高速时钟
        highFrequenceClk();
       
        // 串口初始化
        uart0_init();
        // 开启中断
        enableAllIrq();
        enableEUart0();
        uart0_send_byte(0x32);
        while (1);
}




————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/xundh/article/details/137641348

使用特权

评论回复
沙发
呐咯密密| | 2024-4-19 11:53 | 只看该作者
EUART接口是不是等同于USART

使用特权

评论回复
板凳
lidi911| | 2024-4-22 20:02 | 只看该作者
EUART的E代表什么意思?增强型?

使用特权

评论回复
地板
亚瑟| | 2024-4-23 14:01 | 只看该作者
有没有自动计算波特率的工具啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1364

主题

13994

帖子

8

粉丝