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

您所在的位置:网站首页 8s003f3p6读取程序 STM8、STM8S003F3P6 双机串口通信(片上串口)

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

2023-12-24 18:11| 来源: 网络整理| 查看: 265

背景

这里为什么要写串口通信,因为实际项目上使用了串口,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 //切换内部低速时钟128khz clk_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 /* //切换内部低速时钟8M clk_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模拟串口的方式进行数据收发。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3