一、资源介绍
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
|