基于STM32F103入门4——串口通信

发布者:忠正最新更新时间:2022-09-23 来源: csdn关键字:STM32F103  入门  串口通信 手机看文章 扫描二维码
随时随地手机看文章

最近能抽点时间学一下stm32了,串口通信用的挺多的,比如wifi模块,GSM模块,指纹模块等等…在这里用自己理解的写一下总结,如果有误的话请大家多多指点。

串口的基本概念

串行和并行

串行

串行是一位一位的传输。

常用的有 USART、IIC、SPI等…

串行也分为 同步通信 和 异步通信

同步:

就是一般有一根时钟线,有时钟就可以大家一起同步嘛。靠时钟来约定。一根数据线。一般一个时钟传输一个Bit位。同步的话 他们大部分都是有效数据来的。但是对于双方的时钟允许误差较小。


异步:

异步就是我们平常玩串口用的最多的,它不像同步有个时钟,异步是没有时钟,那我们得为了数据不出错,所以通过 起始位、奇偶校验位、停止位这些来降低数据的错误。

所以异步的有效数据就没有同步的有效数据那么多。效率也没有同步的那么高。


优点:传输距离远、抗干扰能力强、成本较低

缺点:传输速率慢


并行

并行是指多比特数据同时通过并行线进行传送,这样数据传送速度大大提高。

简单的理解就是 比如我们用的LCD1602不是有一共10几个引脚么,然后8根是数据线,这就是属于并行,它们通常需要数据总线(八、十六或更多线路)。


优点:线比较多嘛,所以我传输就快,这个容易理解。

缺点:线这么多,那成本也会高嘛,别人一根线搞定了,你用了8根是吧。然后距离长了,那也容易受到干扰。


通信方式

全双工

就是双方都可以同时发送和接收,相当于我们的打电话。


半双工

在同一时刻,只能一个发送、一个接收,相当于我们的对讲机。


单工

这个就是一个只能发,一个只能收。相当于广播,他那边只能发,我们只能听。


波特率

首先讲一下比特率

比特率:每秒钟传输的二进制位数,单位是(bit/s)

跟波特率有点区别的,但是有时候也一样。


波特率:表示每秒钟传输的码元个数。

码元:比如我们玩51的时候基本都是5V OV那么 5V相当于二进制1 0V就相当于二进制0。

5V——1

0V——0


有时候多个,比如

0V——00

2V——01

4V——10

6V——11

这样就跟比特率不一样了。


波特率计算

波特率 = Fck/(16*USARTDIV)

Fck:串口的时钟

USARTDIV:无符号定点数


比如我想设置115200波特率

时钟是72M

那USARTDIV = 39.0625

在这里插入图片描述

串口的配置

代码编写步骤

我这里用USART1来举例。我这里是A9(TX)、A10(RX)(异步通信)

1:打开对应 的时钟

1.1:GPIO的时钟

1.2:串口的时钟


2.配置GPIO结构体

2.1:引脚

2.2:模式(输入还是输出)

2.3:速率(输出才用 输入不用)

2.4:对结构体成员初始化


3配置串口结构体

3.1:波特率

3.2:有效数据位

3.3:停止位

3.4:奇偶校验位

3.5:硬件控制流

3.6:模式

3.7:对结构体成员初始化


4配置NVIC中断优先级(misc.h)

如果不需要中断可以不配置NVIC

4.1:选择哪个组 NVIC_PriorityGroupConfig

4.2::哪个中断通道 (stm32f10x.h里 IRQn_Type结构体里找)

4.3:主优先级

4.4:次优先级

4.5:通道使能开启

4.6:对成员初始化

4.7:串口中断配置 USART_ITConfig(采用什么方式中断)


5串口使能

USART_Cmd();


6:编写中断服务函数

函数名字在启动文件里找。


串口的重定向

比如我们常用输出函数

printf();

putchar();

常用的输入函数

scanf();

getchar();


输出

==记得包含头文件 stdio.h ==

其次你添加下面的函数既可以用printf 和 putchar了。


/*重定向C库函数printf到串口*/

int fputc(int ch, FILE *f)

{

USART_SendData(USART1, (uint8_t)ch);; //发送一字节到串口

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送寄存器为空 证明发送完

return ch;

}


输入

==记得包含头文件 stdio.h ==

其次你添加下面的函数既可以用scanf 和 getchar了。


/*重定向C库函数 scanf到串口*/

int fgetc(FILE *f)

{

while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); //如果读数据寄存器非空

return (int)USART_ReceiveData(USART1);

}


串口的例程

我这里就实现一下 电脑端串口助手发送单字符到单片机,单片机接收到就立刻也发给电脑串口助手。

比如 我在串口助手发送了 A

然后单片机接收到之后,让单片机发送receive data:A


main.c

#include "stm32f10x.h"

#include "usart.h"


int main()

{

usart1_init(115200); //串口1初始化函数

while(1)

{

}

}


/*因为用的是中断接收所以少不了中断服务函数*/

/*串口1 中断服务函数*/

void USART1_IRQHandler(void)

{

uint8_t data;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //再次判断是否中断是否发生

{

data = USART_ReceiveData(USART1);

}

usart_sendString(USART1,"receive data:");

usart_sendByte(USART1,data);

usart_sendByte(USART1,'n');

}


usart.c

/* 配置串口1 优先级 函数 */

static void NVIC_USART1_configuration(void)

{

NVIC_InitTypeDef NVIC_initStruction;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //组

NVIC_initStruction.NVIC_IRQChannel = USART1_IRQn; //串口1中断

NVIC_initStruction.NVIC_IRQChannelPreemptionPriority = 0;   //主优先级

NVIC_initStruction.NVIC_IRQChannelSubPriority = 0; //次优先级

NVIC_initStruction.NVIC_IRQChannelCmd = ENABLE; //使能

NVIC_Init(&NVIC_initStruction);

}


/* 配置串口1 函数*/

void usart1_init(uint32_t baudRate)

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开GPIOA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //打开串口1时钟

GPIO_InitTypeDef GPIO_initStruction;

USART_InitTypeDef USART_initStruction;


/*配置GPIOA  TX */

GPIO_initStruction.GPIO_Pin = USART1_TX; // TX

GPIO_initStruction.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

GPIO_initStruction.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_initStruction);

/*配置GPIOA RX */

GPIO_initStruction.GPIO_Pin = USART1_RX; // RX

GPIO_initStruction.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入

GPIO_Init(GPIOA, &GPIO_initStruction);

/*配置USART1 TX和RX */

USART_initStruction.USART_BaudRate = baudRate; //波特率

USART_initStruction.USART_WordLength = USART_WordLength_8b; //8位有效数据位

USART_initStruction.USART_StopBits = USART_StopBits_1; //1个停止位

USART_initStruction.USART_Parity = USART_Parity_No; //无奇偶校验位

USART_initStruction.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //不硬件控制流

USART_initStruction.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //发送 和 接收

USART_Init(USART1, &USART_initStruction);

NVIC_USART1_configuration(); //串口1中断优先级配置

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能接收中断

USART_Cmd(USART1, ENABLE); //使能串口1

}


效果呈现

在这里插入图片描述

关键字:STM32F103  入门  串口通信 引用地址:基于STM32F103入门4——串口通信

上一篇:基于STM32F103入门3——外部中断
下一篇:基于STM32F103入门2——按键点灯

推荐阅读最新更新时间:2024-11-02 15:20

利用串口与并口实现51单片机的在线编程
1 在线编程简介   51内核的单片机在线编程模式一般分为两大类。一类是使用JTAG协议的在线编程模式。这类模式一般由厂家提供在线编程工具,使用方便。使用这一类模式的单片机价格往往较高,使用的厂商也不多,故不在本文的讨论之列。另一类在线编程模式是使用一条特殊的指令,使单片机进入在线编程模式。在进入在线编程模式后,要自己控制对单片机的擦除写入逻辑。这一类模式又可细分为两种不同的模式:一是进入在线编程模式后,单片机只是提供一个接口,不再运行用户的程序,擦写逻辑全由上位机(PC)提供,如以下要讨论的MTV230就属于这种模式;另一类是进入在线编程模式以后,芯片会运行在某一区域的用户编写的程序,芯片的编程逻辑都由芯片中这段程序控制,上位
[单片机]
利用串口与并口实现51单片机的在线编程
ATmega16L串口通信程序
/************************************************************** 实验名称:串口通信演示实验 晶振:内部 8M 接线方法: 1.PD0接RXD,PD1接TXD 2.打开串口调试助手 使用说明: 1.本程序能够测试串口数据发送与接收。发送采用 查询方式,接收采用中断方式,通信波特率为19200。 2.当上位机软件发送一串数据时,单片机收到后回送相同 的数据。 *****************************************************************/ #include i
[单片机]
最全的关于PIC单片机入门宝典
为了给前一段时间学习PIC16F616型单片机的一个总结和方便大家的交流,我写了这篇关于PIC单片机的学习心得,都是在看了手册和编程调试后用自己的语言组织的,其中有不足或者有疑问的地方希望大家能及时的给予纠正和批评,提出宝贵的意见. 2.PIC单片机的概述 PIC16F616是一款14引脚、8位的CMOS单片机.采用精简指令集,仅有35条指令,由于采用了数据总线和指令总线分离的哈佛总线结构,使得除少量指令不是单周期之外,大部分的指令都是单周期指令.这样有利于提高单片机的运行速度和执行效率. PIC16F616这款单片机供电电压可以在2V到5.5V之间,内部集成了一个RC振荡器,频率可以配置成8MHZ或者4MHZ,也可以用外部晶
[单片机]
入门级GPS设备Garmin Nuvi 205低成本秘籍
GPS 产品的售价最近一直急速下滑。 Garmin 最近推出的一款售价不到200美元的GPS产品—— Nuvi 205 ,就是为迎接新一轮使用高峰推出的,在美国很多的零售店都可买得到。 本期设计揭密中分析的就是这款零售价仅为199美元的Garmin Nuvi 205。它是我见到的第一批采用吸塑包装的PND(个人导航设备)。而吸引我注意的是本地一个电子产品大卖场的开放式货架上一排排采用真空包装的Nuvi 205。PND的价位显然已不再需要放在上锁的玻璃展柜内,Nuvi 205本身及其出售的方式都显示个人GPS系统正逐渐成为大众商品。 Garmin不是第一家也不是唯一出售少于200美元PND的厂家。但就其价格来说
[手机便携]
<font color='red'>入门</font>级GPS设备Garmin Nuvi 205低成本秘籍
STM32F103之系统时钟初始化及延迟函数
一、简介 本文以STM32F103编程为例,介绍STM32F103系统时钟初始化及延迟函数编写 二、实验平台 电脑平台:Windows7 64位旗舰 编译软件:Keil5 硬件平台:STM32F103RC 三、版权声明 四、实验前提 1、在进行本文步骤前,请先安装keil5版本;准备好STM32F103RC硬件平台。 五、基础知识 暂无 六、源码地址 暂无 七、关联文章 暂无 八、实验内容 1.初始化系统时钟 /*外部时钟最高72MHz 内部时钟最高64MHz*/ typedef enum{ HAL_CLOCK_HSE_SYS = (unsigned char
[单片机]
rs232串口通信原理
串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。 典型地,
[嵌入式]
LG推新入门机LG X400:内置NFC功能 搭载牛轧糖系统
据外媒报道,刚刚LG在韩国本土市场推出了新款入门级智能手机LG X400,不过该机不仅配备了指纹识别模块,还具备高端机型所特有的NFC功能。   LG X400在外观上延续了LG的中低端手机的设计风格,背部为拉丝设计,提供黑和金色两款。 LG推新入门机LG X400:内置NFC功能+牛轧糖   配置方面,LG X400采用5.3英寸720P IPS屏幕+2.5D玻璃正面覆盖,搭载了联发科MT6750八核处理器,2GB RAM+16GB ROM,前置500万+后置1300万像素组合摄像头,内置2800mAh电池,预装谷歌Android 7.0牛轧糖系统。   目前,LG X400手机已在韩国(SK、KT、LG UPLUS运营商均
[手机便携]
利用STM32F103ZET6和AD9852DDS实现信号源的设计
针对π网络石英晶体参数测试系统,采用以STM32F103ZET6型ARM为MCU控制DDS产生激励信号。该测试系统相对于传统的PC机测试系统具有设备简单、操作方便,较之普通单片机测试系统又具有资源丰富、运算速度更快等优点。AD9852型DDS在ARM控制下能产生0~100 MHz扫频信号,经试验数据分析得到信号精度达到0.5×10-6,基本满足设计要求。该系统将以其小巧、快速、操作方便、等优点被广泛采用。 产生正弦激励信号一般可以通过振荡电路或直接数字频率合成器(Direct Digital Frequency Synthesis,DDS),DDS较振荡电路具有相位噪声小、杂散抑制好、可产生连续波信号、扫频信号和频率捷变信号等
[单片机]
利用<font color='red'>STM32F103</font>ZET6和AD9852DDS实现信号源的设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved