当前位置:网站首页>STM32学习笔记(白话文理解版)—USART通信接口
STM32学习笔记(白话文理解版)—USART通信接口
2022-08-11 05:25:00 【LaiGuo.】
STM32学习笔记(白话文理解版)—USART通信接口
一、前置知识:了解通信接口
- 之前学的LED,按键等都是对IO端口的操作,而USART串口是单片机内部的通信接口。
- 那么什么是单片机通信接口呢?
单片机同外部设备器件的通信接口。比如和电脑通信:向电脑发送数据,接收电脑发来的数据。和外设模块,外部芯片等。
- STM32F103有哪些通信接口呢?
- USART接口
了解其是通信接口,且有3个,分别为:USART1,USART2,USART3
二、USART1串口程序配置
(1)前置知识
- USART1串口的数据收发用到两个端口 ,分别为USART1_TX发送数据端口、USART1_RX接收数据端口
- USART1_TX和USART1_RX分别与GPIO口PA9和PA10复用,使用USART1串口时,不能同时使用PA9,PA10引脚
(2)初始化函数
步骤:
- 串口USART1时钟使能、GPIO时钟使能
- GPIO端口模式设置
- 串口参数初始化
- 初始化NVIC
- 开启串口中断
- 使能串口
- 编写中断处理函数
void USART1_Init(u32 bound){
//串口1初始化并启动
//结构体定义
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//1. 串口USART1时钟使能、GPIO时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
//2.GPIO端口模式设置USART1_TX PA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
//2.GPIO端口模式设置USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
//3. 串口参数初始化(一般默认配置)
USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
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); //初始化串口
//4. 初始化NVIC
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//5. 开启串口中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//中断配合接收数据使用//开启ENABLE/关闭DISABLE中断
//6. 使能串口
USART_Cmd(USART1, ENABLE); //使能串口
}
注:
usart.c文件中不仅仅有串口的初始化函数,还有其他复杂的函数用来实现多个字符的数据发送,中断函数接收数据等,可具体参考杨桃电子的串口程序。
三、USART1串口发送数据程序
(1)单个字符的发送
- 利用USART_SendData(哪个串口,‘单个字符’)函数可向电脑发送单个字符
- USART_GetFlagStatus(哪个串口,哪个标志位)函数用来返回标志位的值
- 但由于串口发送的数据十分快速,为了防止前一个数据没发送完,后一个数据就开始发送的情况,需要用标志位USART_FLAG_TC来判断,标志位为1则代表前一个数据发送完毕,详细原理可参考B站海创电子的教程
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "usart.h"
int main (void){
//主程序
USART1_Init(115200); //串口初始化(参数是波特率)
//主循环
while(1){
/* 发送方法1 */
USART_SendData(USART1 , '5'); //发送单个数值
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //检查发送中断标志位,等0表示数据没有发送完成,已知循环检查,知道标志位为1,跳出循环
delay_ms(1000); //延时
}
}
(2)多个字符的发送
- 经过在usart.c中定义后,使用printf()函数即可发送多字符数据,使用方法类似C语言中的printf()函数
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "usart.h"
int main (void){
//主程序
USART1_Init(115200); //串口初始化(参数是波特率)
//主循环
while(1){
/* 发送方法2 */
printf("STM32F103 "); //纯字符串发送数据到串口
//printf("STM32 %d %d ",a,b); //纯字符串和变量发送数据到串口,a符号变量
delay_ms(1000); //延时
}
}
四、USART1串口接收数据程序
(1)查询方式接收
- 使用查询方式接收程序,需要关闭串口中断, 缺点是失去了实时性
- 所谓循环查询方式接收,就是在主程序中不断检查接收数据标志位,标志位为1则代表接收到了数据,在对数据进行处理
- USART_ReceiveData(哪个串口),用来读取串口的数据
- USART_FLAG_RXNE为接收中断标志位,为1则是判断接收到了数据,为0则是没有接收到数据,具体原理,可参考B站海创电子的教程。
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "usart.h"
int main (void){
//主程序
u8 a;
//初始化程序
USART1_Init(115200); //串口初始化(参数是波特率)
//主循环
while(1){
//查询方式接收
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET){
//查询串口待处理标志位
a =USART_ReceiveData(USART1);//读取接收到的数据
printf("%c",a); //把收到的数据发送回电脑
}
}
(2)中断方式接收
- 使用中断接收方式前,要开启串口中断,这样每次在接收到数据后,都会跳出主程序,执行中断函数里的程序,能够保证实时性
- 进入中断后,使用USART_GetITStatus中断标志位判断是哪个中断
- 串口中断有很多方式,如发送中断,接收中断USART_IT_RXNE
void USART1_IRQHandler(void){
//串口1中断服务程序(固定的函数名不能修改)
u8 a;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
//接收中断(接收到的数据必须是0x0d 0x0a结尾)
a =USART_ReceiveData(USART1);//读取接收到的数据
printf("%c",a); //把收到的数据发送回电脑
}
}
五、USART1串口控制程序
- 会收发数据后,我们就可以利用串口联合电脑对单片机进行控制,可以用电脑控制单片机小灯的亮灭,可以将单片机按键信息,显示到电脑上
- 此部分本小白也有点马马虎虎,就不多介绍了,可参考杨桃电子超级终端控制程序
边栏推荐
- Severe Weather 3D Object Detection Dataset Collection
- 产品如何拟定优化方案?
- Mei cole studios - deep learning second BP neural network
- 产品经理人物推荐
- 浙江大学软件学院2020年保研上机真题练习
- LAGRANGIAN FLUID SIMULATION WITH CONTINUOUS CONVOLUTIONS
- OpenPCDet installs the latest version: spconv in one step
- 安全帽识别系统-为安全生产保驾护航
- Toward a Unified Model
- 目标检测——Faster-RCNN 之 RCNN
猜你喜欢
安全帽识别系统-解决监管难题
The selection points you need to know about the helmet identification system
使用ActiveReports制作第一张报表
Pay “Attention” to Adverse Weather
LiDAR Snowfall Simulation for Robust 3D Object Detection
Robust 3D Object Detection in Cold Weather Conditions
Node-3.构建Web应用(二)
Maykle Studio - Second Training in HarmonyOS App Development
Toward a Unified Model
LAGRANGIAN FLUID SIMULATION WITH CONTINUOUS CONVOLUTIONS
随机推荐
CVPR2022——Not All Points Are Equal : IA-SSD
我心仪的数据集—目标检测为主
arduino的esp32环境搭建(不需要翻墙,不需要离线安装)
Asp doNet Mvc4绑定js脚本用法
The selection points you need to know about the helmet identification system
关于mmdetection框架实用小工具说明
咕咚vs悦跑圈的竞品分析
安全帽识别系统
SCNet:Semantic Consistency Networks for 3D Object Detection
梅科尔工作室-DjangoWeb 应用框架+MySQL数据库第三次培训
Maykle Studio - HarmonyOS Application Development First Training
Use regex to verify whether the file name is legal
Maykel Studio - Django Web Application Framework + MySQL Database Third Training
安全帽识别系统-解决监管难题
Kotlin 增量编译的新方式 | 技术解析
梅科尔工作室-HarmonyOS应用开发的第二次培训
博客目录
CMT2380F32模块开发8-Base Timer例程
梅科尔工作室-PR第三次培训笔记(效果与转场及插件使用)
华为云IOT平台设备获取api调用笔记