整理自:正点原子PPT

文章目录

  • 串口简介
  • 串口通信基本原理
    • 常用串口相关寄存器
    • 串口操作相关函数
    • 硬件连接
    • 串口配置一般步骤
  • 例程参考
    • 升级版

串口简介

详情见STM32F4开发指南

串口通信基本原理

常用串口相关寄存器

1、USART_SR状态寄存器

2、USART_DR数据寄存器

3、USART_BRR波特率寄存器

串口操作相关函数

void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断(比如接收中断,下面的例子中的⭐)void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志位

硬件连接

PA9,PA10(串口1)连接到了USB串口电路。(正点原子探索者)

串口配置一般步骤

1、时钟使能

一般包括GPIO时钟使能,和串口时钟使能。

RCC_APBxPeriphClockCmd();
RCC_AHB1PeriphClockCmd();

2、引脚复用映射

GPIO_PinAFConfig();

eg:

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//串口通信一般需要用两个GPIO管脚
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);

3、GPIO参数初始化GPIO_Init()

模式设置成GPIO_Mode_AF(管脚复用模式)

4、串口参数初始化USART_Init()

其中也要配置相关结构体,详情见下面代码中的说明。

5、中断相关设置(如果需要开启中断再执行这个步骤,否则不用)

USART_ITConfig();//配置中断触发方式(比如说下面代码中的接收触发USART_IT_RXNE)
NVIC_Init();//相关介绍见前面的blog
//记得NVIC要设置分组啊!!!

同样也要编写响应的中断服务函数

6、使能串口

USART_Cmd();

eg:

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

7、串口数据收发

void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

eg:

if(USART_GetITStatus(USART1,USART_IT_RXNE)){res=USART_ReceiveData(USART1);USART_SendData(USART1,res);
}

8、串口状态获取

FlagStatus USART_GetFlagStatus();
void USART_ClearITPendingBit();

eg:

见上一个例子。

例程参考

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"//ALIENTEK 探索者STM32F407开发板 实验0
//STM32F4工程模板-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @ALIENTEKvoid My_USART1_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//引脚复用GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitStructure.USART_BaudRate=115200;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStructure);USART_Cmd(USART1 ,ENABLE);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);}void USART1_IRQHandler(void)
{u8 res;if(USART_GetITStatus(USART1,USART_IT_RXNE)){res=USART_ReceiveData(USART1);USART_SendData(USART1,res);}}
int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);My_USART1_Init();while(1);
}/*
手册中讲解到步骤15的时候的main.c源码如下:#include "stm32f4xx.h"//ALIENTEK 探索者STM32F407开发板 实验0
//STM32F4工程模板-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @ALIENTEKvoid Delay(__IO uint32_t nCount);void Delay(__IO uint32_t nCount)
{while(nCount--){}
}int main(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOF, &GPIO_InitStructure);while(1){GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);Delay(0x7FFFFF);GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);Delay(0x7FFFFF);}
}*/

升级版

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"//ALIENTEK 探索者STM32F407开发板 实验4
//串口通信实验 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @ALIENTEKint main(void)
{ u8 t;u8 len;  u16 times=0;  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);        //延时初始化 uart_init(115200);  //串口初始化波特率为115200LED_Init();                //初始化与LED连接的硬件接口  while(1){if(USART_RX_STA&0x8000){                    len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度printf("\r\n您发送的消息为:\r\n");for(t=0;t<len;t++){USART_SendData(USART1, USART_RX_BUF[t]);         //向串口1发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}printf("\r\n\r\n");//插入换行USART_RX_STA=0;}else{times++;if(times%5000==0){printf("\r\nALIENTEK 探索者STM32F407开发板 串口实验\r\n");printf("正点原子@ALIENTEK\r\n\r\n\r\n");}if(times%200==0)printf("请输入数据,以回车键结束\r\n");  if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.delay_ms(10);   }}
}

ustar.c

#include "sys.h"
#include "usart.h"
//
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"                 //ucos 使用
#endif
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F4探索者开发板
//串口1初始化
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2014/6/10
//版本:V1.5
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改说明
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//V1.4修改说明
//1,修改串口初始化IO的bug
//2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
//3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
//4,修改了EN_USART1_RX的使能方式
//V1.5修改说明
//1,增加了对UCOSII的支持
//    //
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle;
}; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{   while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;
}
#endif#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0,   接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记 //初始化IO 串口1
//bound:波特率
void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟//串口1对应引脚复用映射GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1//USART1端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度50MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10//USART1 初始化设置USART_InitStructure.USART_BaudRate = bound;//波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   //收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_Cmd(USART1, ENABLE);  //使能串口1 //USART_ClearFlag(USART1, USART_FLAG_TC);#if EN_USART1_RX   //如果定义了接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;      //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器、#endif}void USART1_IRQHandler(void)                  //串口1中断服务程序
{u8 Res;
#if SYSTEM_SUPPORT_OS       //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.OSIntEnter();
#endifif(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾!!!){Res =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据if((USART_RX_STA&0x8000)==0)//接收未完成(这是定义的一个变量不是什么寄存器!){if(USART_RX_STA&0x4000)//接收到了0x0d{if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始else USART_RX_STA|=0x8000;    //接收完成了 }else //还没收到0X0D{   if(Res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收   }      }}          }
#if SYSTEM_SUPPORT_OS   //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.OSIntExit();
#endif
}
#endif  

USART串口通信实验相关推荐

  1. windows通信端口初始化失败_STM32实例——USART串口通信实验(二)

    USART 串口通信配置步骤 在上面的介绍中,可能有的朋友很不理解,不过没有关系,下面我们讲解如何使用库函数对 USART 进行配置.这个也是在编写程序中必须要了解的.具体步骤如下:(USART 相关 ...

  2. STM32平台的USART串口通信

    本文目的是编写stm32串口通信程序,实现stm32上电自动循环发送hello LYJ!!!,并可通过上位机控制stm32串口发送与否.通过亲自做一下USART串口通信实验,学习如何使用stm32平台 ...

  3. 【合泰HT3252352串口通信实验注意点】

    合泰HT3252352串口通信实验注意点 前面一节我们实现了点灯操作,本篇进行串口通信实验分享,通过串口来控制led的开关 串口的接收和发送搞了很久,一直都是只能发送而中断却不能接收数据是,最后在其他 ...

  4. 【正点原子FPGA连载】第十四章 串口通信实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  5. 27.串口通信实验源码讲解

    串口通信实验源码讲解 笔记基于正点原子官方视频 视频连接https://www.bilibili.com/video/BV1Wx411d7wT?p=71&spm_id_from=333.100 ...

  6. 《STM32从零开始学习历程》——USART串口通讯实验篇1——中断接收与发送

    <STM32从零开始学习历程>@EnzoReventon USART串口通讯实验篇1--中断接收与发送 最近开始接触了STM32F4xx系列单片机,对于我这个从零开始学习的小白来说,可谓困 ...

  7. 单片机实验八 RS232串口通信实验(接收与发送)

    实验八 RS232串口通信实验(接收与发送) 一.实验目的 1.熟悉实验软件和硬件,进行正确的接线: 2.通过实验了解串口的基本原理及使用,理解并掌握对串口进行初始化: 3.使用串口调试助手做为上位机 ...

  8. 嵌入式系统 实验二 串口通信实验

    实验二 串口通信实验 一.实验目的 1.)了解 USART 的基本特性: 2.)掌握用库函数操作 USART 的方法: 3.)掌握如何使用 STM32 的串口发送和接收数据. 二.实验环境 1.)硬件 ...

  9. STM32——串口通信实验

    STM32串口通信实验:字符.字符串.数组 准备工作 编程逻辑顺序 初始化结构体 1.USART初始化结构体: 2.同步时钟初始化结构体: 源码 准备工作 1.找一个空白文件,新建usart.c 和u ...

最新文章

  1. (10)Spring Boot修改端口号【从零开始学Spring Boot】
  2. 【开源】博客园文章编辑器4.0版发布
  3. 报名 | 顾险峰教授讲座:对抗生成网络的几何理论解释
  4. Mac安装python3的opencv包
  5. Java开发人员必备的7大技能,每一个都必不可少
  6. c++中的继承--1(引出,继承方式,继承的对象模型)
  7. 【Hibernate3.3复习知识点二】 - 配置hibernate环境(annotations)
  8. linux系统下聊天工具,linux系统环境下如何使用amsn聊天工具_linux教程
  9. OpenCV案例(三): 玉米颗粒计数
  10. Web — 概述、国际标准概述、特点+扩展名类型
  11. 在php中新建一个系统,免费开源的PHP语言CMS系统充让您在一天内建立一个网站
  12. 1.java-谈谈接口
  13. C# this关键字(给底层类库扩展成员方法)
  14. java IDEA 修改jar包中某个文件 并生成新jar包
  15. 单片机仿真软件Proteus8.0的安装及使用
  16. 2021最新最细致的IDEA集成SVN工具的使用 (入门到精通)
  17. linux node安装菜鸟教程,Node.js 安装配置
  18. php 检查货币类型_PHP如何获取货币汇率-百度经验
  19. OCAD应用:双高斯照相物镜系统结构优化设计
  20. 2021年数据中台行业十大关键词

热门文章

  1. 影像组学Python包 pyradiomics 保姆级教程
  2. 冷启动和热启动的区别android,app冷启动和热启动的区别(详解两者定义及区别)...
  3. Flutter插件汇总
  4. github禁用密码 导致idea推送代码443 timeout
  5. 华为m3 鸿蒙,8.4英寸华为M3平板电脑1888元起售:9月26日线上线下同步开卖
  6. 数据结构之每日一练-02(冒泡排序)
  7. 计算机专业男子吐烟圈,外国帅哥苦练3年吐烟圈,技术出神入化成网红,网友:服了...
  8. 【电源设计】18650电池电源串并联设计——改变电压或容量
  9. 一文学懂过滤器和监听器
  10. 提速 10 倍 Go 语言开发实战内容, 从零开始开发