STM8、STM8S003F3P6 双机串口通信(片上串口)
背景
这里为什么要写串口通信,因为实际项目上使用了串口,STM8S003F3P6的串口简单啊,不值得一提。本文写的串口确实简单,因为这里我想先从简单的写起来,慢慢的把难的引出来。这里呢,做个提纲说明,本文设计的串口,是使用STM8S003F3P6片上的串口。由于STM8S003F3P6资源有限,双机通信资源时常不够,下篇文章提出用IO模拟串口的方式进行数据收发。
原理图
实际涉及原理图如下图所示,比较简单
就是采用STM8S003F3P6的PD5/PD6管脚进行串口收发


从STM8S003F3P6的对应手册中可以看出来
PD5/PD6对应的串口1
uart1,如下图所示

STM8S003F3P6串口的基本特性,这里看STM8S003F3P6支持的串口功能还是很多的
异步通信串口、LIN等模式
实际上本文使用的模式就是异步串口通信,这也是最常用的一种方式

软件设计
串口的初始化操作,这里比较简单就是配置串口,打开串口中断
对了,这里波特率选择9600,很多波特率都是用115200,这里着重提一下,STM8最好波特率都使用115200,波特率太高容易导致数据丢失。STM32调试倒是没有这个问题。
/************************************************
函数名称 : UART_Initializes
功 能 : UART初始化
参 数 : 无
返 回 值 : 无
作 者 :
*************************************************/
void UART_Initializes(void)
{UART1_Init((uint32_t)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);UART1_Cmd(ENABLE);//enableInterrupts();
}
主频配置,这里采用内部HSI,主频16M
/************************************************
函数名称 : CLK_Configuration
功 能 : 时钟配置
参 数 : 无
返 回 值 : 无
作 者 :
*************************************************/
void CLK_Configuration(void)
{
/*ErrorStatus clk_return_status;CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); //HSI = 16M (8分频)=2MHZ//切换内部低速时钟128khzclk_return_status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_LSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);if (clk_return_status == SUCCESS) //SUCCESS or ERROR{CLK_ClockSwitchCmd(ENABLE);CLK_LSICmd(ENABLE);CLK_ClockSwitchCmd(DISABLE); }*/// CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //HSI = 16M (1分频)//ErrorStatus clk_return_status;CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //HSI = 16M (8分频)=2MHZ/* //切换内部低速时钟8Mclk_return_status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);if (clk_return_status == SUCCESS) //SUCCESS or ERROR{CLK_ClockSwitchCmd(ENABLE);CLK_HSECmd(ENABLE);CLK_ClockSwitchCmd(DISABLE); }*/
}
串口接收中断函数
串口接收中断函数中,需要把接收到的串口字节读取走
如下代码,将数据放到缓存中
/*** @brief UART1 RX Interrupt routine.* @param None* @retval None*/uint8_t com_in = 0;
uint8_t com_out = 0;
uint8_t com_rv_buf[MAX_COM_RV_BUF];INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18){/* In order to detect unexpected events during development,it is recommended to set a breakpoint on the following instruction.*/ uint8_t tmp,index;tmp = UART1_ReceiveData8();index = (com_in + 1) & (MAX_COM_RV_BUF - 1);if (index != com_out){ com_rv_buf[com_in] = tmp;com_in++;com_in &= (MAX_COM_RV_BUF - 1);}}
串口发送函数,先实现发送一个字节,然后实现发送多个字节的函数
/************************************************
函数名称 : UART1_Printf
功 能 : 串口1打印输出
参 数 : String --- 字符串
返 回 值 : 无
作 者 :
*************************************************/
void UART1_Printf(uint8_t *String)
{RE485_TX;while((*String) != '\0'){UART1_SendByte(*String);String++;}RE485_RX;
}
/************************************************
函数名称 : UART1_SendByte
功 能 : UART1发送一个字符
参 数 : Data --- 数据
返 回 值 : 无
作 者 :
*************************************************/
void UART1_SendByte(uint8_t Data)
{while((UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));UART1_SendData8(Data);while((UART1_GetFlagStatus(UART1_FLAG_TC)==RESET));
}
总结:本文设计的串口,是使用STM8S003F3P6片上的串口。由于STM8S003F3P6资源有限,双机通信资源时常不够,下篇文章提出用IO模拟串口的方式进行数据收发。
相关文章:
STM8、STM8S003F3P6 双机串口通信(片上串口)
背景 这里为什么要写串口通信,因为实际项目上使用了串口,STM8S003F3P6的串口简单啊,不值得一提。本文写的串口确实简单,因为这里我想先从简单的写起来,慢慢的把难的引出来。这里呢,做个提纲说明࿰…...
FPGA基于AXI 1G/2.5G Ethernet Subsystem实现千兆UDP通信 提供工程源码和技术支持
目录 1、前言2、我这里已有的UDP方案3、详细设计方案传统UDP网络通信方案本方案详细设计说明UDP层设计AXIS-FIFOAXI 1G/2.5G Ethernet Subsystem:输出 4、vivado工程详解5、上板调试验证并演示系统配置UDP数据回环测试注意事项 6、福利:工程代码的获取 1…...
机器学习基础知识之多模型性能对比评价方法
文章目录 1、交叉验证t检验2、Friedman检验与Nemenyi后续检验 在进行预测或分类对比实验时,通常需要比较两个或两个以上的模型性能,因此,下面将介绍两个常用的多模型性能对比评价方法,一种是交叉验证t检验,该方法主要用…...
对敏感信息脱敏,如对姓名、证件号码、手机号码、银行卡号码进行脱敏
一、姓名脱敏 1、脱敏规则一:显示姓名中的第一个字,其它用*号代替。 显示姓名中的第一个字,如为英文等其他语种,也是显示第一个字母。其它用*号代替。 ① 举例 张* 王** A**** ② 实现方法 hideName(name) {if (!n…...
创建型——单例模式C++实现
单例模式即保证一个类只有一个实例,并提供一个访问该单例的接口。 实例 1.懒汉式 用的时候才创建单例,“懒”。 Singleton.h #ifndef SINGLETON_H_ #define SINGLETON_H_#include <iostream> #include <string> #include <mutex>…...
【华为OD统一考试B卷 | 100分】执行时长(C++ Java JavaScript Python)
文章目录 题目描述输入描述输出描述ACM输入输出模式用例机考代码查重C++javascriptjavapython题目描述 为了充分发挥GPU[算力],需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。 假设GPU最多一次执行n个任务,…...
操作系统原理 —— 内存管理的概念(十八)
为什么要有内存管理 为什么要对内存进行管理,需要解决什么问题? 要回答这个问题,首先我们需要明白:进程运行时,需放在内存才能运行。比如在执行一个程序时,需将该程序的相关数据与指令装入内存才能运行。…...
GPT-4国内怎么用
GPT-4是OpenAI推出的最新的生成式AI模型,作为ChatGPT的进化版,它在回答准确性、识图能力、生成歌词和创意文本等方面有了显著的提升。然而,由于网络限制,国内用户无法直接访问官方网站。那么,GPT-4在国内如何使用呢&am…...
搭建LightPicture开源免费图床系统「公网远程控制」
文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 转载自cpolar极点云的文章:【搭建私人图床】使用LightPicture开源…...
shell编程lesson06
流控制 while 和 until 循环 #!/bin/bash# while-count:display a series of numbersi1 while [ $i -le 5 ];doecho $ii$((i1)) done echo "Finished!"while命令的语法结构如下: while commands;do commands;done 我们可以使用while循环改进上一节中的…...
国内免费可用的ChatGPT网页版
ChatGPT 一、ChatGPT是个啥?二、16个国内免费的ChatGPT网站。三、ChatGPT使用方式 一、ChatGPT是个啥? chat:表示“聊天”。 GPT:则是Generative、Pre-trained、Transformer的缩写,表示“预训练语言模型”࿰…...
用同样的关键词测试不同的人工智能
测试词汇:用“电商、接口、店群”写一篇关于API接口的推广软文 返回结果: 人工智能1: 电商行业已经进入了全面数字化转型的时代,而API接口技术正是数字化转型的重要组成部分。随着移动端、小程序等终端越来越普及,A…...
shell变量类型含义 长方形面积计算 截取相应字段方法
1.总结变量的类型及含义? 2.实现课堂案例计算长方形面积?(6种方式) 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815(通过多种方法实现) 1)截取网站访问的协议 …...
Java:从单线程计数器到多线程数据同步synchronized和原子类Atomic
目录 使用单线程使用多线程使用多线程 synchronized使用多线程 原子类AtomicLong 使用单线程 单线程修改计数器的值,没有发生问题,每次运行结果都是10000,不过程序耗时较长 package com.example;/*** 计数器*/ class Counter {private st…...
提前进入行业顶尖阵营:高性能计算实习的竞争优势
如今就业越来越内卷,尤其是计算机行业更是如此。加上GPT以及大模型的加持,各大企业纷纷降本增效,普通程序员逐渐失去竞争力。想要在竞争激烈的就业市场中脱颖而出,提前进入行业顶尖阵营是一个明智的选择。而高性能计算实习将为您提…...
Java程序设计入门教程--标识符和关键字
目录 标识符 标识符的约定 标识符 1. 定义 用来标识类名,变量名,方法名,类型名,数组名,文件名的有效序列称为标识符。简单地说,标识符就是一个名字。 2. 标识符命名规则 (1)大小…...
国产IC芯片自动化测试系统ATECLOUD,助力芯片测试自动化
IC芯片测试成本是影响制造和加工成本的重要因素。在某些情况下,测试成本可能占到器件总成本的40%左右。为了降低测试成本,可以优化测试程序并研发多工位测试。同时,必须平衡良品率和测试时间,以实现最佳的成本控制。本篇文章纳米软…...
BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext有什么区别? BeanFactory和ApplicationContext有什么区别? BeanFactory和ApplicationContext有什么区别? BeanFactory (轻量级) 和ApplicationContext(高级特性和框架)是Spring的两大核心接口,都…...
js的BOM对象中的window、location使用
说明:BOM的全称是Browser Object Model,浏览器对象模型,有Window(浏览器窗口)、Navigator(浏览器)、Screen(屏幕)、History(历史记录)和Location&…...
DAY 68 redis高可用的主从复制、哨兵、cluster集群
Redis 高可用 什么是高可用 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
