STM32F103串口篇

  • 串口的基本概念
    • 串行和并行
      • 串行
      • 并行
    • 通信方式
      • 全双工
      • 半双工
      • 单工
    • 波特率
      • 波特率计算
  • 串口的配置
    • 代码编写步骤
    • 串口的重定向
  • 串口的例程
    • main.c
    • usart.c
    • 效果呈现

最近能抽点时间学一下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;        // TXGPIO_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;      // RXGPIO_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入门4——串口通信相关推荐

  1. linux 嵌入式串口通信设计目的,基于linux的嵌入式串口通信.doc

    PAGE 天津电子信息职业技术学院 <嵌入式软件编程>课程报告 课程名称:基于linux的嵌入式串口通信 课程代码: 115229 姓 名: 甘琦 学 号: 48 专 业: 物联网应用技术 ...

  2. linux 嵌入式串口通信,基于linux的嵌入式串口通信综述.doc

    PAGE 天津电子信息职业技术学院 <嵌入式软件编程>课程报告 课程名称:基于linux的嵌入式串口通信课程代码: 115229 姓 名: 甘琦 学 号: 48 专 业: 物联网应用技术 ...

  3. 基于PC与单片机串口通信的温度监控系统程序设计

    基于PC与单片机串口通信的温度监控系统程序设计 1.系统介绍 1)本系统主要讲解基于PC与单片机串口通信的温度监控系统程序设计(如图1),上位机采用常用的PC机,下位机使用的是STC89C52单片机, ...

  4. java comm api_java基于RXTXcomm.jar的串口通信

    java基于RXTXcomm.jar的串口通信 RXTX的下载及配置 首先确定你安装的JDK的位数,安装相应位数的jar包. 将rxtxSerial.dll.rxtxParallel.dll复制到\j ...

  5. java comm jar_java基于RXTXcomm.jar的串口通信

    java基于RXTXcomm.jar的串口通信 RXTX的下载及配置 mfz-rxtx-2.2-20081207-win-x64 下载地址:http://download.csdn.net/downl ...

  6. java基于RXTXcomm.jar的串口通信

    java基于RXTXcomm.jar的串口通信 RXTX的下载及配置 mfz-rxtx-2.2-20081207-win-x64       下载地址:http://download.csdn.net ...

  7. 嵌入式作业(七):基于Ardunio的STM32串口通信

    嵌入式作业(七) 0 作业要求 1 Ardunio 完成STM32的串口通信 (1)安装Ardunio IDE (2)stm32串口通信 2 基于串口通信的标准库与hal库的区别 (1)hal库 (2 ...

  8. VS2013基于对话框的MFC串口通信简单案例教程

    本例程是在VS2013环境下,使用MFC做的是一个简单的串口通信程序. 虚拟的串口软件工具下载地址:https://pan.baidu.com/s/1D-oddZk3Z_ioXBUpXE7ksw 密码 ...

  9. 基于FPGA的UART串口通信实验(VHDL语言实现)

    一.前言: 最近在做UART串口通信的相关实验时,在网上查了很多资料,发现网上的大部分文章只注重理论,不注重代码,很多代码有错误不说,而且难以理解.故在完成此实验后,起了写一篇博客的心思,以供有想做相 ...

最新文章

  1. 互联网协议 — 物理介质层
  2. android 计算执行时间
  3. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
  4. springboot 中根据数据库表生成所有表的model,mapper和xml文件
  5. 关于模型预测结果好坏的几个评价指标
  6. 苏州大学文正学院计算机专业,苏州大学文正学院有哪些专业及什么专业好
  7. 再生龙u盘复制linux,再生龙制作U盘启动盘教程 | 楚盟博客
  8. 蓝桥杯B组省赛预赛第一题2013(高斯日记)
  9. 一种常见(粒度,统计值)报表的实现方案
  10. 深圳无车日:吕锐锋搭公交 卓钦锐徒步走
  11. 【易语言】大漠插件使用
  12. Oracle EBS R12 - ad patch/non-ad patch/admrgpch
  13. grub4dos linux live,Grub4DOS 正常引导 Ubuntu 16.04 镜像文件
  14. Python爬虫爬取纵横中文网小说
  15. STC51单片机15——MPU6050六轴数据融合,互补滤波,时间常数可调,可稳定运行,串口显示角度值
  16. 利息计算器V3.0感悟
  17. 极客HTTP协议学习笔记破冰篇(1-7)
  18. ATF(Arm Trusted Firmware)/TF-A Chapter 04 Authentication Framework
  19. 前端知识体系思维导图
  20. 广东省-IT公司红黑榜排名

热门文章

  1. Report for 今日の写真.
  2. qq影音qlv转mp4工具软件电脑pc版
  3. Qt练习UDP聊天软件
  4. Python对带光晕的任意纯色背景图像进行去背景色操作(保留透明效果、附源码)
  5. Python项目csv导出
  6. 嵌入式软件工程师经典面试题(附答案)(二)
  7. 报错:Package requirements (libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0) were not met
  8. 访问网址 token的格式_2020杭州电子科技大学数学建模竞赛论文格式规范与要求...
  9. 北科大计算机实践报告,计算机应用实践报告_北科大.doc
  10. Activiti初识