事业单位网站建设注销情况说明,编写软件的软件,广州建设工程交易中心怎么样,成都j网站制作背景
这里为什么要写串口通信#xff0c;因为实际项目上使用了串口#xff0c;STM8S003F3P6的串口简单啊#xff0c;不值得一提。本文写的串口确实简单#xff0c;因为这里我想先从简单的写起来#xff0c;慢慢的把难的引出来。这里呢#xff0c;做个提纲说明#xff0…背景
这里为什么要写串口通信因为实际项目上使用了串口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模拟串口的方式进行数据收发。