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串口控制程序
- 会收发数据后,我们就可以利用串口联合电脑对单片机进行控制,可以用电脑控制单片机小灯的亮灭,可以将单片机按键信息,显示到电脑上
- 此部分本小白也有点马马虎虎,就不多介绍了,可参考杨桃电子超级终端控制程序
本文含有隐藏内容,请 开通VIP 后查看