STC8增强型单片机开发——串口调试UART

2024-05-13 04:36

本文主要是介绍STC8增强型单片机开发——串口调试UART,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、什么是串口

       串口是一种在数据通讯中广泛使用的通讯接口,通常我们叫做UART (通用异步收发传输器Universal Asynchronous Receiver/Transmitter),其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中,串口常用于与外部设备进行通讯,如传感器、液晶显示屏、WiFi模块、蓝牙模块等。

串口通信中的 TXD(Transmit Data) RXD(Receive Data)是串口通信中的两个重要信号。

        TXD是指串口发送端的数据信号,而RXD是指串口接收端的数据信号。在串口通信中,发送端把要发送的数据发送到TXD引脚上,接收端则通过RXD引脚来接收这些数据。

        TXD和RXD信号的实现方式取决于使用的芯片或模块。一般来说,它们都是通过芯片或模块的串口功能来实现的,这需要将相应的引脚连接到芯片或模块的串口引脚上。

        在发送数据时,需要将要发送的数据通过串口的发送缓冲区发送到TXD引脚上,接收端通过RXD引脚接收这些数据并放入接收缓冲区中。在接收端收到完整的数据后,可以通过相应的处理进行数据的解析和处理。

        需要注意的是,TXD和RXD的电平标准也需要一致,一般常见的有TTL电平和RS232电平,如果不一致则需要进行电平转换。同时,在编写程序时也需要注意串口波特率、数据位、停止位等参数的设置,以保证通信的稳定和可靠。

以下是STC8H的芯片引脚介绍图

其中有4组Uart通讯口:

串口

RXD

TXD

UART1

P3.0

P3.1

P3.6

P3.7

P1.6

P1.7

P4.3

P4.4

UART2

P1.0

P1.1

P4.6

P4.7

UART3

P0.0

P0.1

P5.0

P5.1

UART4

P0.2

P0.3

P5.2

P5.3

二、串口TTL通讯协议

串口TTL(Transistor-Transistor Logic)是一种串口通信协议,使用TTL电平来进行串口数据传输。它主要用于嵌入式系统、传感器、模块等设备之间的数据通信。

串口TTL主要包括两个信号线:TX(Transmit,发送)和RX(Receive,接收)。TX线是串口TTL的输出线路,用于将数据从串口设备发送出去;RX线是串口TTL的输入线路,用于接收数据到串口设备。

串口TTL使用的是异步串行通信协议,其数据传输的原理是将数据分成一定的数据帧,在数据帧的首尾各加上一个起始位和停止位,用于确定每个数据帧的开始和结束位置。此外,串口TTL通信协议还规定了数据位的长度和奇偶校验位。

串口TTL通常有不同的波特率(Baud Rate)可供选择,波特率是指每秒钟传输的数据位数,通常表示为 bps(bits per second),比如 9600 bps、115200 bps 等等。波特率的设置必须要保证发送和接收设备的波特率一致,否则会导致通信失败。

需要注意的是,串口TTL使用的是TTL电平,其电压范围是0~5V,不同的设备的串口TTL信号的电平有时会有所不同,因此在连接不同设备时需要注意电平的兼容性。

三、串口转USB

串口转 USB 是一种将串口信号转换为 USB 信号的设备。它通常被用于连接没有 USB 接口的设备(如单片机、传感器等)与计算机之间的通讯,使这些设备可以通过 USB 接口与计算机进行通信。

在使用串口转 USB 设备时,需要将其插入计算机的 USB 接口,并将串口连接到需要通信的设备上。在计算机中打开串口终端程序,设置串口参数(如波特率、数据位、停止位等),即可开始进行数据传输。在通信过程中,串口转 USB 设备将串口信号转换为 USB 信号,并将其发送到计算机上,或者将从计算机上接收到的 USB 信号转换为串口信号并发送到外部设备上。

串口转 USB 设备通常由一个 USB 转串口芯片和一个串口接口组成。常见的 USB 转串口芯片有 FTDI 和 CH340 等,它们提供了一组标准的串口接口,可以方便地连接到各种外部设备上。

总之,串口转 USB 设备是一种非常实用的工具,它可以帮助我们连接各种没有 USB 接口的设备,方便数据的传输和通讯。

黑马STC8H核心板串口调试

  1. 原理图

D+D-对应的usb口,和pc主机连接

P3.1P3.0对应的芯片

采用CH340将串口和USB之间进行转换

所以,我们在PC机上为什么会装串口驱动,主要是用来解析CH340转换后的消息,这样PC机就能认识了

四、使用库函数编写串口通讯逻辑

需求:通过串口调试工具,发送消息给开发板,开发板原封不动的将消息传回。

开发步骤:

  1. 新建项目
  2. 导入库函数
  3. 编写逻辑

串口调试实现

  1. 新建项目。新建main.c文件
  2. 导入函数库。拷贝以下函数库文件到项目目录
  • Config.h Type_def.h
  • GPIO.hGPIO.c
  • Delay.hDelay.c
  • UART.hUART.cUART_Isr.c
  • NVIC.c NVIC.h
  • Switch.h

3.代码编写(发送)

#include	"Config.h"
#include	"GPIO.h"
#include	"UART.h"
#include	"Delay.h"
#include	"NVIC.h"
#include	"Switch.h"/*************	功能说明	**************
双串口全双工中断方式收发通讯程序。通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回, 默认波特率:115200,N,8,1.通过开启 UART.h 头文件里面的 UART1~UART4 定义,启动不同通道的串口通信。
******************************************//******************* IO配置函数 *******************/
void	GPIO_config(void)
{GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义GPIO_InitStructure.Pin  = GPIO_Pin_0 | GPIO_Pin_1;		//指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P3,&GPIO_InitStructure);	//初始化
}/***************  串口初始化函数 *****************/
void	UART_config(void)
{COMx_InitDefine		COMx_InitStructure;					//结构定义COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;	//模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLECOMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLEUART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3UART1_SW(UART1_SW_P30_P31);		//UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}/**********************************************/
void main(void)
{//    EAXSFR();		/* 扩展寄存器访问使能 */GPIO_config();UART_config();EA = 1;TX1_write2buff(0x23);	// #printf("STC8H8K64U UART1 Test Programme!\r\n");	//UART1发送一个字符串PrintString1("STC8H8K64U UART1 Test Programme!\r\n");	//UART1发送一个字符串while (1){TX1_write2buff(0x2F); // /delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250);}
}
  1. 代码编写(接收并回写)
#include "Config.h"
#include "GPIO.h"
#include "UART.h"
#include "Delay.h"
#include "NVIC.h"
#include "Switch.h"void GPIO_config(void) {GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义GPIO_InitStructure.Pin  = GPIO_Pin_0 | GPIO_Pin_1;		//指定要初始化的IO, P30, P31GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P3, &GPIO_InitStructure);//初始化
}void UART_config(void) {COMx_InitDefine		COMx_InitStructure;					//结构定义COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;	//模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLECOMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLEUART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3UART1_SW(UART1_SW_P30_P31);		//UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}void on_uart1_recv() {u8 i;// RX_Cnt收到的数据个数(字节u8 - unsigned char)// 将收到的数据, 按字节逐个循环for(i=0; i<COM1.RX_Cnt; i++) {u8 dat = RX1_Buffer[i]; //  1 1 1 1  0 0 0 0 -> 0xF0TX1_write2buff(dat);	//收到的数据原样返回}
}
/**
开启串口调试,接收数据,把收到的数据原样返回**/
void main() {// 初始化IOGPIO_config();// 初始化UARTUART_config();// 开启中断(全局)必须要写!EA = 1;// 写一个字节TX1_write2buff(0x23);// 通过PrintString1输出字符串PrintString1("STC8H8K64U UART1 Test Programme!\r\n");	//UART1发送一个字符串// 通过printf输出字符串printf("STC8H8K64U UART1 Test Programme!\r\n");	//UART1发送一个字符串while(1) {// 超时计数// 一旦收到了一个字节数据,RX_TimeOut会初始化一个值(例如:5)if((COM1.RX_TimeOut > 0) && (--COM1.RX_TimeOut == 0)){            if(COM1.RX_Cnt > 0){// 收到数据了,on_uart1_recv();on_uart1_recv();}// 处理完数据,将数据个数清零COM1.RX_Cnt = 0;}// 注意这里delay代码的位置,属于whiledelay_ms(10);}
}
  1. 调试

使用STC-ISP调试工具进行调试。切换好串口助手,选择正确的串口,设置和代码中相同的波特率。

通过发送区进行数据发送,通过接收区观察接收内容。

串口调试重难点

功能配置

配置IO的工作模式:如果不配置工作模式,会导致串口不工作。(UART1的当前代码中的引脚P3.0P3.1默认是准双向口,可以不配置,但是不要存在侥幸心理,导致其他的串口使用中没有配置准双向口)

配置UART的串口工作模式UART_Mode

UART_ShiftRight同步移位输出:按位传输,效率低,通常不用。

UART_8bit_BRTx 8位数据,可变波特率:常用。发送和接收的数据为8位。

UART_9bit 9位数据,固定波特率,即无法在运行时动态更改波特率。

UART_9bit_BRTx 9位数据,可变波特率:发送和接收的数据为9位。最后一位为奇偶校验位。

  • 配置UART的波特率RaudRate:根据实际情况来定,波特率越高,传输越快,但是出现丢帧的概率越高。通常115200就够用。单位是bit/s
  • 配置UART的波特率发生器BRT_Use:系统提供了4个发生器,通常一一对应。

BRT_Timer1

BRT_Timer2

BRT_Timer3

BRT_Timer4

  • 配置UART是否接收RxEnable:可以获取RXD接收的数据。
  • 配置UART波特率加倍BaudRateDouble:默认不加倍,配置加倍会导致波特率是设定的双倍,过高会导致丢帧。
  • 配置UART中断Interrupt和优先级Priority:UART的数据收发是通过中断实现的,如果不配置,则无法对外发送数据,TXD和RXD不工作。
  • 配置UART的端口P_SW:串口通道可以通过几组引脚来实现,但是需要指明是哪一组。
中断开启

由于uart中的发送是通过中断实现的,需要开启,但是STC8还提供了一个总的开关,如果总开关不打开,一样不起作用。

EA = 1;

引入依赖库

UART的接收与发送
  1. 关于接收

接收是通过接收缓冲区进行接收。

在死循环中,间隔一定时间到缓冲区中去取数据,有数据,说明就是接收了

  1. 关于发送

发送是通过发送缓冲区进行发送。

发送提供了单个字节发送的API: TX1_write2buff(byte)

发送提供了字符串发送的API: PrintString1(str)

逻辑分析仪调试

通过逻辑分析仪,分析RXD和TXD的数据

原理图分析

  • P3.0引脚为RXD,对这个引脚进行分析即可
  • P3.1引脚为TXD,对这个引脚进行分析即可
接线方式

  • 将逻辑分析仪的通道1线和开发板中的P3.0引脚RXD连接。
  • 将逻辑分析仪的通道2线和开发板中的P3.1引脚TXD连接。
  • 将逻辑分析仪的GND线和开发板的GND连接。
程序和串口工具准备
  1. 烧录写好的串口程序固件,功能是接收到串口消息,并原路返回这个消息。
  2. 打开STC-ISP工具的串口调试部分,进行配置调试:

  1. 配置正确的波特率,选择对应的串口,打开串口
  2. 在发送区域输入发送的内容
  3. 点击自动发送,这样工具就会定时发送这个数据

串口通讯过程

逻辑分析仪调试

点击绿色按钮,进行数据分析

  • 选择右侧的分析
  • 观察到逻辑分析仪已经100%确认为 Async Serial信号,也就是串口信号

查看串口内容:

  • 点击数据按钮,可以观察到,传输的内容为`hello`,也就是分析出我们发送的内容

串口通讯测试

测试流程:

  1. PC机通过串口工具连接两个设备A和B的UART1
  2. 将A和B的UART4相连(A设备的RXD、TXD接B设备的TXD,RXD)
  3. 编写代码
    1. 接收PC从UART1发来的数据,将之从UART4发出去
    2. 接收另外一个设备从UART4发来的数据,将之从UART1发出去
  1. 通过PC机的串口工具A给A设备发消息,观察串口工具B收到的消息

引脚选择如下:

UART1:RXD-P3.0 TXD-P3.1

UART4:RXD-P5.2 TXD-P5.3

注意:

如果串口窗口出现乱码内容,通常原因有两个:

  1. 烧录时,选择的IRC频率不是24.000 MHz
  2. 连接串口时,选择的波特率和代码中的不一致,通常为115200

这篇关于STC8增强型单片机开发——串口调试UART的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/984688

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof