STM8、STM8S003F3P6 双机串口通信(片上串口)

news/2024/11/16 7:44:05/

背景

这里为什么要写串口通信,因为实际项目上使用了串口,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模拟串口的方式进行数据收发。


http://www.ppmy.cn/news/84097.html

相关文章

鸿蒙元服务万能卡片开发-stage模型和fa模型的卡片区别

一、项目类型 Application: 应用开发 Atomic Service:原子化服务开发 这里选择Empty Ability模板创建项目。 二、Stage模型卡片开发 Api:9 Model:stage Language:ArkTS AppScope :应用的全局配置信息。…

睿铂在广东,自然资源部经济管理科学研究所“多测合一”项目分享

引言 DG4 Pros倾斜摄影相机作为睿铂旗舰系列产品,它的硬件与软件配置都无愧于其顶级倾斜相机的称号。在它的帮助下,客户得以挑战很多以往受限于设备技术条件,实施起来非常困难的项目。 本次,自然资源部经济管理科学研究所&#…

CSDN周赛回顾

CSDN周赛回顾 55期参赛体验近两期难度题型报告 参赛回顾CSDN 题库每日一练举报题库 最后的吐槽新题目相似度判定奖品 55期参赛体验 近两期难度 最近的题目有点难度了,老顾个人感觉至少达到了中级算法程度了,所以老顾的成绩变得稀碎。。。。 题型 再来…

听我一句劝,别去外包,干了五年,废了....

先说一下自己的情况,大专生,18年通过校招进入杭州某软件公司,干了接近5年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了5年的功能测试…

spring之spring入门程序

1.创建Maven Module 2.pom.xml引入依赖 此图引用于https://www.cnblogs.com/Zz-maker/p/11199331.html Maven种的依赖的传递性&#xff0c;spring-context依赖于core,beans,aop,expression等模块&#xff0c;但是在pom.xml中只引用spring-context即可&#xff1a; <?xml v…

【博士论文latex写作】

1.安装编译器 到官网下载镜像&#xff1a;https://mirrors.hit.edu.cn/CTAN/systems/texlive/Images/ 选择 texlive2023.iso 也可选择百度云2022版本&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WLVX8Zn1E4hIYRupLBabNA?pwdgm63 提取码&#xff1a;gm63 打开后…

Java-基本数据类型 和 引用类型、包装类

一、基本数据类型&#xff1a;8种 整数类型&#xff1a;int&#xff08;4字节&#xff09;、long&#xff08;8&#xff09;、short&#xff08;2&#xff09;、byte&#xff08;1&#xff09;浮点类型&#xff1a;double&#xff08;8&#xff09;、float&#xff08;4&#x…

Acrel 2000E/G配电室综合监控系统

1、概述 在信息化建设中&#xff0c;配电室运行处于信息交换管理的核心位置&#xff0c;这就要求配电室内所有设备需要时时刻刻正常运转&#xff0c;一旦某台设备出现故障&#xff0c;对数据传输、存储及系统运行构成威胁&#xff0c;就会影响到全局&#xff0c;如果不能及时处…