STM32学习笔记(白话文理解版)—USART通信接口

发布于:2022-08-08 ⋅ 阅读:(579) ⋅ 点赞:(0)

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)初始化函数

步骤:

  1. 串口USART1时钟使能、GPIO时钟使能
  2. GPIO端口模式设置
  3. 串口参数初始化
  4. 初始化NVIC
  5. 开启串口中断
  6. 使能串口
  7. 编写中断处理函数
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 后查看