首页 > 其他分享 >STM学习记录(六)————串口的发送接收

STM学习记录(六)————串口的发送接收

时间:2024-06-17 12:57:11浏览次数:18  
标签:USART STM void 发送 InitStructure 串口 GPIO USART1

文章目录


前言

一个学习单片机的小白~ 有错误评论区或私信指出~

一、串口结构体及库函数

串口USART结构体:
 typedef struct
 {
 uint32_t USART_BaudRate;           
uint16_t USART_WordLength;         
uint16_t USART_StopBits;             
uint16_t USART_Parity;            
uint16_t USART_Mode;                
uint16_t USART_HardwareFlowControl; 
} USART_InitTypeDef;
串口USART相关库函数:
void USART_DeInit(USART_TypeDef* USARTx);
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* 
USART_InitStruct);
 void USART_StructInit(USART_InitTypeDef* USART_InitStruct);
 void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* 
USART_ClockInitStruct);
 void USART_ClockStructInit(USART_ClockInitTypeDef* 
USART_ClockInitStruct);
 void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
 void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, 
FunctionalState NewState);
 void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, 
FunctionalState NewState);
 void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address);
 void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp);
 void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t 
USART_LINBreakDetectLength);
 void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState);
 void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
 uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
 void USART_SendBreak(USART_TypeDef* USARTx);
 void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t 
USART_GuardTime);
 void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t 
USART_Prescaler);
 void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode);
 void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState);
 FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t 
USART_FLAG);
 void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);
 ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
 void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t 
USART_IT);

二、实现串口发送(库函数)

1.程序设计

软件流程设计

  • 初始化系统
    • 初始化GPIO、串口外设时钟
    • 初始化串口引脚
  • 串口发送

2.代码

//初始化系统
void Usart_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	//TX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//RX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);

	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	
	USART_Init(USART1,&USART_InitStructure);
	USART_Cmd(USART1,ENABLE);
	
}
	#include "stm32f10x.h"
	#include "main.h"
	#include "usart.h"
	
	int  main()
	{
		Usart_Init();
		
	   while(1)
		 {
			USART_SendData(USART1,'O');
			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET );
			USART_SendData(USART1,'K');
			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET );
		 }
	}

三.串口接收

1.串口接收(普通)

软件流程设计

  • 初始化系统
    • 初始化GPIO、串口外设、LED时钟
    • 初始化串口和LED引脚
  • 串口发送控制LED灯
//串口初始化
#include "usart.h"
#include "stm32f10x.h"                  // Device header
#include <stdio.h>


void Usart_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	//TX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//RX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);

	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	
	USART_Init(USART1,&USART_InitStructure);
	USART_Cmd(USART1,ENABLE);
}
#include "stm32f10x.h"
#include "main.h"
#include "usart.h"
#include "LED.h"
#include <stdio.h>

int  main()
{
	LED_Init();
	Usart_Init();
	char temp;
	
   while(1)
	 {
			if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET)//判断是否接受到数据
			{
					temp = USART_ReceiveData(USART1);//读收到的数据
					if(temp == 'A')
					{
						USART_SendData(USART1,temp);
						GPIO_ResetBits(GPIOA,GPIO_Pin_1);
					}
					if(temp == 'B')
					{
						USART_SendData(USART1,temp);
						GPIO_SetBits(GPIOA,GPIO_Pin_1);
					}
			}
			USART_ClearFlag(USART1,USART_FLAG_RXNE);//清除标志位
	 }  
}

2.串口中断接收

软件流程设计

  • 初始化系统
    • 初始化GPIO、串口外设、串口中断、NVIC、LED时钟
    • 初始化串口和LED引脚
    • 写串口中断控制语句
  • 串口发送控制LED灯
#include "usart.h"
#include "stm32f10x.h"                  // Device header
#include <stdio.h>


void Usart_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	//TX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//RX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);

	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	
	USART_Init(USART1,&USART_InitStructure);
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//配置串口中断
	USART_Cmd(USART1,ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	
	NVIC_Init(&NVIC_InitStructure);
}
#include "stm32f10x.h"
#include "main.h"
#include "usart.h"
#include "LED.h"
#include <stdio.h>

int  main()
{
	LED_Init();
	Usart_Init();
	
   while(1)
	 {

	 }
		 
   
}
//串口中断函数
void USART1_IRQHandler(void)
{
	char temp;
	
	if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET )//判断串口中断接收是否产生
	{
		temp = USART_ReceiveData(USART1);//读数据
		if(temp == 'A')
		{
			putchar(temp);
			GPIO_ResetBits(GPIOA,GPIO_Pin_1);
		}
		if(temp == 'B')
		{
			putchar(temp);
			GPIO_SetBits(GPIOA,GPIO_Pin_1);
		}
		
	}
	USART_ClearITPendingBit(USART1,USART_IT_RXNE);

}

3. 串口发送字符串函数

思路:C语言字符串类似于字符数组最后一位是’\0’,可以用循环遍历,每遍历一遍发送一个数据,遍历到’\0’时结束循环,本质上还是传输一个字符数据不过是一次发一连串字符。

代码实现:

void USART_SendString(USART_TypeDef* USARTx, char * String)
{
	uint16_t i = 0;
	do
	{
		USART_SendData(USARTx,*(String + i));
		while( USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET );
		i++;
	}while(*(String + i) != '\0');
	while( USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET );	
}

4.串口实现printf(重定向)

修改printf底层代码,重载函数fputc

代码实现:

int fputc(int ch,FILE *f)
{
	
	USART_SendData(USART1,(uint8_t)ch);
	while( USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET );	
	
	
	return (ch);
}

5. 串口实现scanf(重定向)

修改scanf底层代码,重载函数fgetc

代码实现:

int fgetc(FILE *f)
{
	
	while( USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET );	
	
	
	return (int)USART_ReceiveData(USART1);
}

注:使用priintf、scanf记得勾选UseMicroLIB
在这里插入图片描述

标签:USART,STM,void,发送,InitStructure,串口,GPIO,USART1
From: https://blog.csdn.net/qq_63556165/article/details/139728733

相关文章

  • curl命令行发送post/get请求
    文章目录curl概述post请求get请求curl概述curl是一个命令行实用程序,允许用户创建网络请求curl在Windows、Linux和Mac上皆可使用post请求一个简单的POST请求-X:指定与远程服务器通信时将使用哪种HTTP请求方法curl-XPOSThttp://example.comPOST......
  • gitlab自动定时备份文件,备份失败发送邮件
    一、需求为预防gitlab出现故障,每天定时备份,备份完成后把之前的备份文件删除,备份成功或失败的时候自动发送邮件提醒,这里的gitlab为docker部署。二、备份命令准备1)备份命令 创建一个gitlab_auto_backup.sh文件,文件内容#!/bin/bash#进入GitLab容器并执行备份--gitlab为do......
  • 上位机图像处理和嵌入式模块部署(h750 mcu和usb虚拟串口)
    【 声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:[email protected]】    对于mcuusb而言,大部分情况下,它和上位机之间的关系都是device的关系。一般usb,可以成成host和device。如果mcu是host,那么意味着它可以主动访问别的usb设备,比如u盘、相机之类的设备。如......
  • 基于STM32和人工智能的智能家居监控系统
    目录引言环境准备智能家居监控系统基础代码实现:实现智能家居监控系统4.1数据采集模块4.2数据处理与分析4.3控制系统4.4用户界面与数据可视化应用场景:智能家居环境监控与管理问题解决方案与优化收尾与总结1.引言随着智能家居技术的发展,智能家居监控系统在提升家居安......
  • 51单片机有开发板A和开发板B,通过串口,实现开发板A的按键,控制开发板B的LED亮灭。
    1、功能描述有开发板A和开发板B,通过串口,实现开发板A的按键,控制开发板B的LED亮灭。2、实验原理1.串口通信(UART)串口通信是一种异步通信方式,它允许单片机通过两条线(发送线TX和接收线RX)进行数据传输。在51单片机中,串口通信是通过两个主要寄存器(SCON、SMO/SM1)和中断(RI、TI)......
  • STM32定时器篇——Systick定时器的使用(实现delay延时函数)
    一、Systick定时器的简介:        Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器对于CM3,CM4内核芯片,都有Systick定时器。当Systick计到0时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在......
  • Http压缩zip,加密base64发送与获取
    //数据压缩成Zip再发送publicstaticstringZipBasebyte(stringxml){byte[]bytesToCompress=Encoding.GetEncoding("GBK").GetBytes(xml);MemoryStreamms=newMemoryStream();ZipEntryze=newZipEntry("servlets......
  • 抖音验证签名和接口含中文签名,需要在发送端加上utf8编码
    抖音验证签名和接口含中文签名,需要在发送端加上utf8编码抖音验签和抖音异步通知回调验签解决:是对整个接收的字符串做验签,而不是部分数据做验签解决中文参数问题,否则中文乱码报验签错误 签名算法https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/serve......
  • 史上最简单的bootloader【STM32F767】[【二】
    继上一篇史上最简单的bootloader【STM32F767】后,最近进一步研究了下bootloader。任务:bootloader不变,app自我复制,将app搬运到sram中运行。目的:1)学习bootloader;     2)没什么大用处,主要是学习---->看资料说是代码在sram中运行会快一点,本人没有测试过学习过程有点......
  • Postman简介
    目录1.概述2.诞生背景3.历史版本4.安装和卸载5.菜单和菜单项6.使用7.应用场景8.示例8.1.简单的GET请求8.2.POST请求提交数据8.3.查询参数9.未来展望10.总结1.概述Postman是一款用于API开发、测试和文档管理的综合性工具。允许开发者和测试人员创建、分享、测......