51单片机(STC8)-- 串口配置及串口重定向(printf)

文章目录

      • STC8串口概述
      • 串口寄存器配置
        • 串口1控制寄存器SCON
        • 串口1数据寄存器SBUF
        • 串口1模式 1工作方式
        • 串口1波特率计算方式
      • 串口注意事项
      • 串口1通信demo
      • 串口重定向

STC8串口概述

由下图可知STC8H3K64S4带有4个4个串行通信接口,芯片名后两位S所带的数字即代表这款芯片带有的串口数量
在这里插入图片描述

STC8H 系列单片机具有 4 个全双工异步串行通信接口。每个串行口由 2 个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器等组成。每个串行口的数据缓冲器由 2 个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。
STC8 系列单片机的串口 1 有 4 种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。串口 2/串口 3/串口 4 都只有两种工作方式,这两种方式的波特率都是可变的。用户可用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。
串口 1、串口 2、串口 3、串口 4 的通讯口均可以通过功能管脚的切换功能切换到多组端口,从而可以将一个通讯口分时复用为多个通讯口。

串口寄存器配置

串口主要寄存器以下8个,如果是配置串口1的话就只要用到SCON(串口1控制寄存器)和SBUF(串口1数据寄存器),另外串口2 - 串口4也有各自对应的寄存器名字如图
在这里插入图片描述

串口1控制寄存器SCON

串口1控制寄存器SCON如下
在这里插入图片描述

  • SM0/FE:当PCON寄存器中的SMOD0位为1时,该位为帧错误检测标志位。当UART在接收过程中检测到一个无效停止位时,通过UART接收器将该位置1,必须由软件清零。当PCON寄存器中的SMOD0位为0时,该位和SM1一起指定串口1的通信工作模式,如下表所示
    在这里插入图片描述
  • SM2:允许模式 2 或模式 3 多机通信控制位。当串口 1 使用模式 2 或模式 3 时,如果 SM2 位为 1 且 REN位为 1,则接收机处于地址帧筛选状态。此时可以利用接收到的第 9 位(即 RB8)来筛选地址帧,若 RB8=1,说明该帧是地址帧,地址信息可以进入 SBUF,并使 RI 为 1,进而在中断服务程序中再进行地址号比较;若 RB8=0,说明该帧不是地址帧,应丢掉且保持 RI=0。在模式 2 或模式 3中,如果 SM2 位为 0 且 REN 位为 1,接收收机处于地址帧筛选被禁止状态,不论收到的 RB8 为0 或 1,均可使接收到的信息进入 SBUF,并使 RI=1,此时 RB8 通常为校验位。模式 1 和模式 0为非多机通信方式,在这两种方式时,SM2 应设置为 0。
  • REN:允许/禁止串口接收控制位
    0:禁止串口接收数据
    1:允许串口接收数据
  • TB8:当串口 1 使用模式 2 或模式 3 时,TB8 为要发送的第 9 位数据,按需要由软件置位或清 0。在模式 0 和模式 1 中,该位不用。
  • RB8:当串口 1 使用模式 2 或模式 3 时,RB8 为接收到的第 9 位数据,一般用作校验位或者地址帧/数据帧标志位。在模式 0 和模式 1 中,该位不用。
  • TI:串口 1 发送中断请求标志位。在模式 0 中,当串口发送数据第 8 位结束时,由硬件自动将 TI 置 1,向主机请求中断,响应中断后 TI 必须用软件清零。在其他模式中,则在停止位开始发送时由硬件自动将 TI 置 1,向 CPU 发请求中断,响应中断后 TI 必须用软件清零。
  • RI:串口 1 接收中断请求标志位。在模式 0 中,当串口接收第 8 位数据结束时,由硬件自动将 RI 置 1,向主机请求中断,响应中断后 RI 必须用软件清零。在其他模式中,串行接收到停止位的中间时刻由硬件自动将 RI 置 1,向 CPU 发中断申请,响应中断后 RI 必须由软件清零。

综上所示,配置串口1使用模式1(可变波特率8位数据方式)时,只需要设置SM0、SM1、REN,TI和RI则是在收发响应中断后软件清零

串口1数据寄存器SBUF

串口1的数据读写都是对同个寄存器SBUF进行操作
在这里插入图片描述

  • SBUF:串口 1 数据接收/发送缓冲区。SBUF 实际是 2 个缓冲器,读缓冲器和写缓冲器,两个操作分别对应两个不同的寄存器,1个是只写寄存器(写缓冲器),1个是只读寄存器(读缓冲器)。对SBUF进行读操作,实际是读取串口接收缓冲区,对 SBUF 进行写操作则是触发串口开始发送数据。
串口1模式 1工作方式

当软件设置 SCON 的 SM0、SM1 为“01”时,串行口 1 则以模式 1 进行工作。此模式为 8 位 UART格式,一帧信息为 10 位:1 位起始位,8 位数据位(低位在先)和 1 位停止位。波特率可变,即可根据需要进行设置波特率。TxD 为数据发送口,RxD 为数据接收口,串行口全双工接受/发送。

模式 1 的发送过程
串行通信模式发送时,数据由串行发送端 TxD 输出。当主机执行一条写 SBUF的指令就启动串行通信的发送,写“SBUF”信号还把“1”装入发送移位寄存器的第 9 位,并通知 TX控制单元开始发送。移位寄存器将数据不断右移送 TxD 端口发送,在数据的左边不断移入“0”作补充。当数据的最高位移到移位寄存器的输出位置,紧跟其后的是第 9 位“1”,在它的左边各位全为“0”,这个状态条件,使 TX 控制单元作最后一次移位输出,然后使允许发送信号“SEND”失效,完成一帧信息的发送,并置位中断请求位 TI,即 TI=1,向主机请求中断处理。

模式 1 的接收过程
当软件置位接收允许标志位 REN,即 REN=1 时,接收器便对 RxD 端口的信号
进行检测,当检测到 RxD 端口发送从“1”→“0”的下降沿跳变时就启动接收器准备接收数据,并立即复位波特率发生器的接收计数器,将 1FFH 装入移位寄存器。接收的数据从接收移位寄存器的右边移入,已装入的 1FFH 向左边移出,当起始位"0"移到移位寄存器的最左边时,使 RX 控制器作最后一次移位,完成一帧的接收。若同时满足以下两个条件:

  1. RI=0;
  2. SM2=0 或接收到的停止位为 1。

则接收到的数据有效,实现装载入 SBUF,停止位进入 RB8,RI 标志位被置 1,向主机请求中断,若上述两条件不能同时满足,则接收到的数据作废并丢失,无论条件满足与否,接收器重又检测 RxD 端口上的"1"→"0"的跳变,继续下一帧的接收。接收有效,在响应中断后,RI 标志位必须由软件清 0。通常情况下,串行通信工作于模式 1 时,SM2 设置为"0"。
在这里插入图片描述

串口1波特率计算方式

串口 1 的波特率是可变的,其波特率可由定时器 1 或者定时器 2 产生。当定时器采用 1T 模式时(12倍速),相应的波特率的速度也会相应提高 12 倍。
串口 1 模式 1 的波特率计算公式如下表所示:(SYSclk 为系统工作频率)
在这里插入图片描述
下面为常用频率与常用波特率所对应定时器的重载值
在这里插入图片描述
如果对于计算方式比较头疼的话,可以用万能的STC-ISP工具帮忙,如图写入配置参数,直接生成串口初始化代码
在这里插入图片描述

串口注意事项

关于串口中断请求有如下问题需要注意:(串口 1、串口 2、串口 3、串口 4 均类似,下面以串口 1为例进行说明)
8 位数据模式时,发送完成约 1/3 个停止位后产生 TI 中断请求,如下图所示:
在这里插入图片描述
8 位数据模式时,接收完成一半个停止位后产生 RI 中断请求,如下图所示:
在这里插入图片描述

串口1通信demo

//测试工作频率为 11.0592MHz
#include "stc8h.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536 - (FOSC / 115200+2) / 4)
//加 2 操作是为了让 Keil 编译器
//自动实现四舍五入运算

bit busy;
char wptr;
char rptr;
char buffer[16];

void UartIsr() interrupt 4 
{
	if (TI)
	{
		TI = 0;
		busy = 0;			// 串口发送占用标志位清零
	}
	if (RI)
	{
		RI = 0;
		buffer[wptr++] = SBUF;
		wptr &= 0x0f;
	}
}

void UartInit()
{
	SCON = 0x50;
	T2L = BRT;
	T2H = BRT >> 8;
	AUXR = 0x15;
	wptr = 0x00;
	rptr = 0x00;
	busy = 0;
}

void UartSend(char dat)
{
	while (busy);
	busy = 1;
	SBUF = dat;
}

void UartSendStr(char *p)
{
	while (*p)
	{
		UartSend(*p++);
	}
}

void main()
{
	P_SW2 |= 0x80; //使能访问 XFR
	P0M0 = 0x00;
	P0M1 = 0x00;
	P1M0 = 0x00;
	P1M1 = 0x00;
	P2M0 = 0x00;
	P2M1 = 0x00;
	P3M0 = 0x00;
	P3M1 = 0x00;
	P4M0 = 0x00;
	P4M1 = 0x00;
	P5M0 = 0x00;
	P5M1 = 0x00;
	UartInit();
	ES = 1;			// 使能串口1中断
	EA = 1;			// 使能总中断
	UartSendStr(“Uart Test !\r\n”);
	
	while (1)
	{
		if (rptr != wptr)
		{
			UartSend(buffer[rptr++]);
			rptr &= 0x0f;
		}
	}
}

上述demo的main函数中在总中断使能EA置1前ES位置1,为使能串口1中断,在IE(中断使能寄存器)寄存器中有说明
在这里插入图片描述

串口重定向

与32的串口重定向函数fputc函数和fgetc函数不同,51单片机串口重定向给重写的是putchar函数,然后可以使用printf函数往串口进行打印,可在串口uart.c文件中添加以下部分

#include "stdio.h"			// 串口重定向需要添加头文件stdio.h

char putchar(char c)
{
	SBUF = c;
	while(!TI);
	TI = 0;
	return c;
}

然后可在main.c或者其他文件中使用sprintf()函数和printf()函数

void main(void)
{
	Uart1_Init();
	
	while(1)
	{
		printf("Hello World");
		Delay_ms(500);
	}
}

或者

void main(void)
{
	char str[20];
	Uart1_Init();
	
	while(1)
	{
		sprintf(str,"Hello World");
		printf(str);
		Delay_ms(500);
	}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/262165.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成

一、插件 Settings... 1.1 File -- Settings 1.2 Settings -- Plugins 1.2.1 搜索框,也可以直接搜索 1.3 Plugins -- 【输入 & 搜索】mybatis 1.3.1 插件不同功能介绍 1.3.2 翻译如下 1.4 选中 Update,更新下 1.4.1 更新中 1.4.2 Restart IDE 1…

华为全屋wifi6蜂鸟套装标准

华为政企42 华为政企 目录 上一篇华为安防监控摄像头下一篇华为企业级无线路由器

STM32CubeMX驱动ST7789

环境 1、单片机:STM32F103C8T6 2、开发平台:STM32CUBEMXkeil mdk 3、屏幕:ST7789,分辨率240*240 STM32配置 1、使用硬件SPI1驱动屏幕。配置如下: 2、屏幕控制引脚配置: 注意:只配置了DC,RST,CS这3个控…

重塑数字生产力体系,生成式AI将开启云计算未来新十年?

科技云报道原创。 今天我们正身处一个历史的洪流,一个巨变的十字路口。生成式AI让人工智能技术完全破圈,带来了机器学习被大规模采用的历史转折点。 它掀起的新一轮科技革命,远超出我们今天的想象,这意味着一个巨大的历史机遇正…

人工智能对网络安全的影响

技术的快速发展带来了不断增长的威胁环境,网络犯罪分子和恶意行为者利用我们互联世界中的漏洞。在这个数字时代,数据泄露和网络攻击呈上升趋势,仅靠传统的安全措施已经不够了。人工智能 (AI) 的进步彻底改变了网络安全…

【Midjourney】Midjourney根据prompt提示词生成黑白色图片

目录 🍇🍇Midjourney是什么? 🍉🍉Midjourney怎么用? 🔔🔔提示词格式 🍋🍋应用示例——“秘密花园”式涂色书配图生成 🍌🍌例子1…

推荐算法架构7:特征工程

1 概述 特征工程[1](Feature Engineering)是推荐算法的基础,它对收集到的原始数据进行解析和变换,从而提取出模型所需要的信息。通过挖掘丰富和高质量的特征,并对其进行合理的处理,可以提升模型预估准确度…

【SVN】centos7搭建svn--亲测能通

centos7.6搭建svn 1 知识小课堂1.1 CentOS1.2 SVN 2 搭建过程2.1 前期准备2.2 通过yum命令安装svnserve2.3 创建版本库目录2.4 创建svn版本库2.5 配置修改2.5 防火墙配置2.6 启动或关闭svn服务器2.6.1 进程守护2.6.2 检测svn端口3690是否已经监听:2.6.3 关闭SVN 2.7…

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证

1.微认证题目: 参考tensorflow的Sinh算子,实现Ascend C算子Sinh,算子命名为SinhCustom,并完成aclnn算子调用相关算法: sinh(x) (exp(x) - exp(-x)) / 2.0 要求: 1、完成host侧和kernel侧代码实现。 2、实现sinh功能,支持float16…

图论 | 网络流的基本概念

文章目录 流网路残留网络增广路径割最大流最小割定理最大流Edmonds-Karp 算法算法步骤程序代码时间复杂度 流网路 流网络: G ( V , E ) G (V, E) G(V,E) 有向图,不考虑反向边s:源点t:汇点 c ( u , v ) c(u, v) c(u,v)&#xff…

使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理

背景 在上一篇文章中,我们已经了解到华为即将发布的鸿蒙操作系统纯血版本——鸿蒙 Next,以及各个互联网厂商开展鸿蒙应用开发的消息。其中,Taro作为一个重要的前端开发框架,也积极适配鸿蒙的新一代语言框架 —— ArkTS。 本文将…

网络安全-API接口安全

本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 API接口概念 API接口(Application Programming Interface,应用程序编程接口&…

Flink 状态管理与容错机制(CheckPoint SavePoint)的关系

一、什么是状态 无状态计算的例子: 例如一个加法算子,第一次输入235那么以后我多次数据23的时候得到的结果都是5。得出的结论就是,相同的输入都会得到相同的结果,与次数无关。 有状态计算的例子: 访问量的统计&#x…

【科学计算语言】实验三 Python复杂数据类型

【目的和要求】 (1)掌握Python语言中的组合数据类型 (2)掌握列表、元组、字典、集合及字符串的基本应用 (3)熟练运用有关序列操作的Python内置函数 【实验准备】 【实验内容】 1. 实验练习:掌握…

HTML5的完整学习笔记

HTML 什么是HTML: 作为前端三件套之一,HTML的全称是超文本标记语言(Hypertext Markup Language)。HTML是一种标记语言,用于创建网页。它由一系列标签组成,这些标签用于定义网页的结构和内容。HTML标签告诉…

[XR806开发板试用] XR806——基于FreeRTOS下部署竞技机器人先进模糊控制器

前言 很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。本人热衷于各种的开发板的开发,同时更愿意将其实现到具体项目中。秉承以上原则,发现大家的重心都放在开发中的环境构建过程,缺少了不少实际应用场景的运用&am…

谷歌Gemini造假始末

💡大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AIGC、读书和自媒体。 在过去一年中,OpenAI ChatGPT引发了一股AI新浪潮,而谷歌则一直处于被压制的状态,迫切需要一款现象级的AI产品来…

【UML】第10篇 类图(属性、操作和接口)(2/3)

目录 3.3 类的属性(Attribute) 3.3.1 可见性(Visibility) 3.3.2 属性的名称 3.3.3 数据类型 3.3.4 初始值 3.3.5 属性字符串 3.4 类的操作(Operations) 3.4.1 参数表 3.4.2 返回类型 3.5 类的职责…

浅述无人机技术在地质灾害应急救援场景中的应用

12月18日23时,甘肃临夏州积石山县发生6.2级地震,震源深度10千米,灾区电力、通信受到影响。地震发生后,无人机技术也火速应用在灾区的应急抢险中。目前,根据受灾地区实际情况,翼龙-2H应急救灾型无人机已出动…

Kafka集群架构原理(待完善)

kafka在zookeeper数据结构 controller选举 客户端同时往zookeeper写入, 第一个写入成功(临时节点), 成为leader, 当leader挂掉, 临时节点被移除, 监听机制监听下线,重新竞争leader, 客户端也能监听最新leader leader partition自平衡 leader不均匀时, 造成某个节点压力过大, …