嵌入式 > 技术百科 > 详情

STM8S003F使用IO口模拟串口(二)接收数据

发布时间:2020-12-28 发布时间:
|

在上一篇文章中我们介绍了IO口模拟串口数据的发送,这一篇文章我们介绍IO口模拟串口数据的发送。同样的,我们没有使用库函数和中断,我们使用简单的定时来完成数据的接收。


1、IO口模拟串口接收数据的原理

同样的,我们将要接收的数据认为是10位(实际上,我们在接收数据之前必须搞清楚我们将要接收的是什么,否则我们需要在模拟串口程序中添加其他代码来进行检测)。


同样的,我们事先知道发送数据的波特率为:9600。


我选择的是STM8S003F的PD3引脚作为模拟串口的接收引脚。


思路是这样的,我们使用定时器定时,通过判断是否是起始位(通过低电平判断,因为没有发送数据应该是高电平),得到起始位了以后,延时一个数据位发送的时间(我们将定时器的时间设置为一个数据位的发送时间),然后逐次判断数据位的电位,8次延时以后,在通过最后一次延时,以此来接收完了一个字节。


用这种方法的优点是逻辑简单,能够清晰的认识到串口发送数据的过程,但是,由于我们检验数据是否正确用到的是我们上一篇文章中用到的发送数据的方法,因此在发送字符串的时候我们发现它将只能接收到奇数的字节,只能在接收单字节数据的时候能正常工作,也就是大部分情况无法使用。如果需要它是一个正常代码中能用的全双工模拟串口,需要使用到中断,我【待修改】将在后面进行介绍。


注意:这篇文章实现的IO口模拟串口接收数据,只能实现单个字节的接收!


2、实现过程

2.1、一切从main()函数开始

同样的,我们建立完工程后需要从main()函数开始,我们首先需要进行初始化的配置All_Config()【在UserApp.c中】,代码如下:


//head file 

#include "UserApp.h"

#include "IO.h"

#include "User.h"

#include "Time.h"

#include "Delay.h"

 

//初始化函数

void All_Config( void )

{

    Clock_Config();

    IO_Init();  

    TIM2_Init();

}


其中Clock_Config()【在UserApp.c中】为单片机时钟配置函数,代码如下:

//初始化时钟 选择内部16M晶振

void Clock_Config()

{

    CLK->CKDIVR &= ~( BIT(4) | BIT(3) );

}


其中我们选择的内部16M晶振,单片机默认的也是16M晶振但是会有8分频,我们这里设置的是没有分频。


其中IO_Init()【在IO.c中】是对IO口的初始化,由于我们需要验证接收的正确性,我们需要将接收到的数据发送到电脑串口程序,我们可以使用单片机自己的串口发送口,由于我能保证我自己上一篇文章的正确性,因此我直接在上一篇文章的基础上进行开发。也就是我需要初始化PD2和PD3,代码如下:


//head file

#include "IO.h"

#include "User.h"

 

void IO_Init()

{

    //TXD:TXD位推挽输出  PD2

    UART_PORT->ODR |=  UART_PIN_TX; //0000 0100

    UART_PORT->DDR |=  UART_PIN_TX; //0000 0100

    UART_PORT->CR1 |=  UART_PIN_TX; //0000 0100

    UART_PORT->CR2 &= ~UART_PIN_TX; //0000 0100

    

    //RXD:悬浮输入 高电平 PD3

    UART_PORT->IDR |=  UART_PIN_RX; //0000 1000

    UART_PORT->DDR &= ~UART_PIN_RX; //0000 1000

    UART_PORT->CR1 &= ~UART_PIN_RX; //0000 1000

    UART_PORT->CR2 &= ~UART_PIN_RX; //0000 1000

}


其中TIM2_Init()【在Time.c中】是定时器的初始化,


 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
用于MAX7456随屏显示器SPI