历史上的今天
今天是:2025年01月21日(星期二)
2020年01月21日 | STM8S003F使用IO口模拟串口(二)接收数据
2020-01-21 来源:eefocus
在上一篇文章中我们介绍了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中】是定时器的初始化,
史海拾趣
|
以下代码,如果我想截一块区域的屏,应该在哪里更改数值?应该不是位图宽度和高度吧 HDC hScrDC, hMemDC; //屏幕和内存设备描述表 HBITMAP hBitmap, ...… 查看全部问答> |
|
ce下如何直接访问蓝牙栈的L2CAP层,这个问题好像一直没有人回答哦~~ 通过socket只能建立模拟串口的链接。我希望能直接获取l2cap层的数据,在l2cap层进行蓝牙数据收发。 看msdn上的文档好像要自己扩展ce的蓝牙栈,但是这个好像是要固化到编译好的bin文件里的驱动模块。 如何设计一个正常的安装程序进行l2cap层数据 ...… 查看全部问答> |
|
USB驱动:hci_usb.c中为什么没有如骨架程序中的file_operations和usb_class_driver结构? 最近在学习USB 蓝牙适配器的驱动开发,通过比较骨架程序driver/usb/usb-skeleton.c和driver/bluetooth下面的hci_usb.c发现,hci_usb.c的实现中仅用了一个usb_driver结构,而没有file_operations和usb_class_driver结构,也没有设定mi ...… 查看全部问答> |
|
1.解释命令\"ls -|a|more\"具体含义. 2.LINUX中的管道指什么?重定向又指什么? 3.\"GCC -g -o test.elf test.c\"的具体含义. 4.浅述GCC编译器在编译时都有哪几个过程? 5,在题3的基础上编写一MAKEFILE文件,要求能自动完成编译和清除功能? 6.说明 ...… 查看全部问答> |
|
MSP430g2333的I2C程序,模拟的,硬件的都有,但不知道哪里出了错,各位大侠,知道的看看 eeprom用的是AT24C02,a1,a2,a0都接的高电平,WP引脚接的地 //*****************************************************************************// 下面是 ...… 查看全部问答> |
|
经过一年多的流离,txj最终加入了新的公司(深圳市君益兴科技开发有限公司)。此次加入公司新开了一个部门(实时操作系统推广部门), 这个部门在国内是属于比熊猫还稀有的部门,目标只有一个,从事以raw os为主的开源推广活动,真真切切把raw os逐步稳 ...… 查看全部问答> |




