stm32---串口接收与发送(针对USART1的Rx和Tx引脚)

这篇具有很好参考价值的文章主要介绍了stm32---串口接收与发送(针对USART1的Rx和Tx引脚)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图文概述: 

stm32配置rx和tx,stm32,嵌入式硬件,单片机stm32配置rx和tx,stm32,嵌入式硬件,单片机stm32配置rx和tx,stm32,嵌入式硬件,单片机

stm32配置rx和tx,stm32,嵌入式硬件,单片机 

stm32配置rx和tx,stm32,嵌入式硬件,单片机

代码:

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>


/*对应的引脚号*/
#define USART1_TX GPIO_Pin_9 
#define USART1_RX GPIO_Pin_10 


/*模块需要使用到的端口:GPIOA或GPIOB*/
#define BUS GPIOA         

uint8_t Serial_RxData;
uint8_t Serial_RxFlag;


/**
  * @brief  Serial_Init---对串口通信的初始化配置(针对发送数据即USART1外设的TX引脚)
  * @param  无
  * @retval 无
  */
void Serial_Init(void)
{
	//1.开启APB2外设的时钟---USART1是APB2的外设
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//2.初始化GPIO的引脚配置(即USART1外设的TX引脚)
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/* TX引脚是USART1外设控制的输出脚,需要选复用推挽输出模式 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
	GPIO_InitStructure.GPIO_Pin = USART1_TX;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(BUS, &GPIO_InitStructure);
	
	/* RX引脚是USART1外设控制的输出脚,需要选浮空输入或上拉输入 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入模式
	GPIO_InitStructure.GPIO_Pin = USART1_RX;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(BUS, &GPIO_InitStructure);
	
	//3.初始化USART的各项配置
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600; //波特率---9600
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件数据流控选择---不需要流控
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//串口模式---同时开启发送模式和接收模式
	USART_InitStructure.USART_Parity = USART_Parity_No;//数据帧的校验位---不需要校验
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//数据帧的停止位---选择1位的停止位
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据帧字长---选择8位
	USART_Init(USART1, &USART_InitStructure);
	
	/* 当RXNE标志位一旦置1,就向NVIC申请中断,可以使用中断函数接收数据 */
	//开启触发RXNE标志位到NVIC的输出
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC优先级分组
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //NVIC中断通道配置为USART1通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级设为1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级设为1
	NVIC_Init(&NVIC_InitStructure);
	
	//4.开启USART
	USART_Cmd(USART1, ENABLE);
}	

/**
  * @brief  Serial_SendByte---发送1位字节数据
  * @param  Byte---发送的字节数据
  * @retval 无
  */
void Serial_SendByte(uint8_t Byte)
{
	//1.发送数据
	USART_SendData(USART1, Byte);
	//2.判断发送数据寄存器为空的标志位(标志位为1则表示数据转移到移位寄存器,为0则还没有转移到移位寄存器)
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}


/**
  * @brief  Serial_SendArray---发送数组元素是字节数据的数组
  * @param  *Array---发送的数组的首地址指针
  * @param  Length---发送的数组的长度
  * @retval 无
  */
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for(i = 0; i < Length; i++)
	{
		Serial_SendByte(Array[i]);
	}
}

/**
  * @brief  Serial_SendString---发送一串字符串
  * @param  *String---发送的字符串的地址指针
  * @retval 无
  */
void Serial_SendString(char *String)
{
	uint8_t i;
	for(i = 0; String[i] != '\0'; i++)
	{
		Serial_SendByte(String[i]);
	}
}

/**
  * @brief  Serial_Pow---计算X的Y次方值
  * @param  X---底数
  * @param  Y---指数
  * @retval Result---计算的结果值
  */
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while(Y--)
	{
		Result *= X;
	}
	return Result;
}

/**
  * @brief  Serial_SendNumber---发送无符号整型数据(即数字)
  * @param  Number---要发送的数字数据
  * @param  Length---数字数据的长度
  * @retval 无
  */
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for(i = Length; i > 0; i--)
	{
		Serial_SendByte((Number / Serial_Pow(10, i-1)) % 10 + '0');
	}
	
}

/**
  * @brief  fputc---printf的底层函数(移植printf函数,使printf输出到串口)
  * @param  ch---需要输出的字符
  * @param  *f---指定的某个指针地址
  * @retval ch---输出的字符
  */
int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}


/**
  * @brief  Serial_Printf---对sprintf进行封装,便于数据输出到串口
  * @param  *format---接收的格式化字符串
  * @param  ...---接收可变参数列表
  * @retval 无
  */
void Serial_Printf(char *format, ...)
{
	char String[100];
	va_list arg;//va_list---列表名
	va_start(arg, format);//从format位置后开始接收参数表,放在arg
	vsprintf(String, format, arg);/* vsprintf---使用参数列表发送格式化输出到字符串。 */
	va_end(arg);//释放参数表
	Serial_SendString(String);//串口发送字符串
}

uint8_t Serial_GetRxFlag(void)
{
	if(Serial_RxFlag == 1)
	{
		Serial_RxFlag = 0;
		return 1;
	}
	return 0;  //返回状态值
}

uint8_t Serial_GetRxData(void)
{
	return Serial_RxData; //返回接受数据寄存器的值
}

//USART1通道的中断函数
void USART1_IRQHandler(void)
{
	//获取USART的接收数据寄存器不为空中断标志位
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) 
	{
		//获取接收数据寄存器中的值
		Serial_RxData = USART_ReceiveData(USART1); 
		//置变量Serial_RxFlag为1(表示接收到数据)
		Serial_RxFlag = 1;  
		//手动清除清除USART1的中断挂起位(如果获取接收寄存器则会自动清除标志位)
		USART_ClearITPendingBit(USART1, USART_IT_RXNE); 
	}

}

关键步骤:

1. 开启APB2外设的时钟---USART1是APB2的外设(需要查看手册了解对应芯片上的USART1_TX和USART1_RX的引脚分布在哪个GPIO口上)

	//1.开启APB2外设的时钟---USART1是APB2的外设
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2. 初始化GPIO的引脚配置(即USART1外设的TX引脚) 

	//2.初始化GPIO的引脚配置(即USART1外设的TX引脚)
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/* TX引脚是USART1外设控制的输出脚,需要选复用推挽输出模式 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
	GPIO_InitStructure.GPIO_Pin = USART1_TX;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(BUS, &GPIO_InitStructure);
	
	/* RX引脚是USART1外设控制的输出脚,需要选浮空输入或上拉输入 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入模式
	GPIO_InitStructure.GPIO_Pin = USART1_RX;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(BUS, &GPIO_InitStructure);

3. 初始化USART的各项配置

	//3.初始化USART的各项配置
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600; //波特率---9600
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件数据流控选择---不需要流控
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//串口模式---同时开启发送模式和接收模式
	USART_InitStructure.USART_Parity = USART_Parity_No;//数据帧的校验位---不需要校验
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//数据帧的停止位---选择1位的停止位
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据帧字长---选择8位
	USART_Init(USART1, &USART_InitStructure);

补充:如果需要接收数据后进入中断,则还需要配置NVIC ,即如下代码:

	/* 当RXNE标志位一旦置1,就向NVIC申请中断,可以使用中断函数接收数据 */
	//开启触发RXNE标志位到NVIC的输出
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC优先级分组
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //NVIC中断通道配置为USART1通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级设为1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级设为1
	NVIC_Init(&NVIC_InitStructure);

4. 开启USART

	USART_Cmd(USART1, ENABLE);

5. 发送字节数据的基础函数:

/**
  * @brief  Serial_SendByte---发送1位字节数据
  * @param  Byte---发送的字节数据
  * @retval 无
  */
void Serial_SendByte(uint8_t Byte)
{
	//1.发送数据
	USART_SendData(USART1, Byte);
	//2.判断发送数据寄存器为空的标志位(标志位为1则表示数据转移到移位寄存器,为0则还没有转移到移位寄存器)
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

 6. 接收字节数据的基础函数(在触发的中断函数中接收数据):

//USART1通道的中断函数
void USART1_IRQHandler(void)
{
	//获取USART的接收数据寄存器不为空中断标志位
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) 
	{
		//获取接收数据寄存器中的值
		Serial_RxData = USART_ReceiveData(USART1); 
		//置变量Serial_RxFlag为1(表示接收到数据)
		Serial_RxFlag = 1;  
		//手动清除清除USART1的中断挂起位(如果获取接收寄存器则会自动清除标志位)
		USART_ClearITPendingBit(USART1, USART_IT_RXNE); 
	}

}

     

 文章来源地址https://www.toymoban.com/news/detail-760441.html

到了这里,关于stm32---串口接收与发送(针对USART1的Rx和Tx引脚)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 江科大32——USART串口发送&串口发送+接收代码

     1.程序初始化流程 1)开启USART和GPIO时钟。 2)GPIO初始化,把TX配置成复用输出,RX配置成输入。 3)使用结构体配置USART。 如果只需发送功能,直接开启USART就行了。 如果需要发送和接收,需要在开启USART之前加上 ITConfig 和 NVIC 的代码。 初始化完成,只需调用特定函数就能完

    2024年02月12日
    浏览(37)
  • STM32F103RCT6 -- 基于FreeRTOS 的USART1 串口通讯

    使用 FreeRTOS 提供的队列(Queue)机制来实现数据的接收和发送 TX - PA9 RX - PA10 波特率:9600 数据位:8bit 校验位:无 停止位:1bit 数据格式: RX: 55 AA 06 00 06 31 02 24 01 FC 80 TX: 55 AA 06 00 06 32 01 24 01 B8 70 55 AA – 帧头 06 - 数据字节数,不包括帧头,不包括校验位 00 06 – 模块 31 02 24

    2024年02月16日
    浏览(49)
  • APM32F072单片机进入STOP模式,并通过RTC Wakeup Timer和USART1串口接收事件唤醒

    串口初始化(注意USART1时钟源要选择HSI): 使用power_init函数初始化RTC,然后调用power_enter_stop_mode(n)函数进入STOP模式,n秒后自动唤醒,或由USART1接收唤醒:

    2024年02月13日
    浏览(52)
  • FPGA:uart原理+tx发送模块+rx接收模块

    处理器与外部设备通信的两种方式: 串行通信: 指数据的各个位使用多条数据线同时进行传输。 并行通信: 将数据分成一位一位的形式在一条数据线上逐个传输。 串行通信的通信方式: 同步通信: 带时钟同步信号的数据传输,发送方和接收方在同一时钟控制下,同步传输

    2024年02月12日
    浏览(36)
  • 关于STM32F407ZGT6的USB损坏后使用ST-Link和USART1实现串口功能

    开发板:STM32F407ZGT6; 目标:想使用软件“串口调试助手” 情况:开发板上的USB_UART口所在器件损坏或者直接没有;   解决办法:查看该开发板的原理图,可得:串口1的RX接TXD,串口1的TX接RXD,那么按如下步骤操作: 1、现在使用USB转TTL模块,将串口1的RX接USB转TTL模块的TXD,

    2024年02月08日
    浏览(49)
  • vivado GTX ip核接收端RX与发送端TX数据对齐的方法

    当8B/10B编码的K码为K28.5时,当txdata中某一字节为8\\\'hBC时(为什么是BC,请搜索8B/10B编码相关文章),设置txcharisk对应的比特位为1即可实现txdata与rxdata对齐。 举例说明 示例1 txdata低8位为BC,设置txcharisk最低位为1。 可以发现,接收数据与发送数据32bit实现了对齐。   示例2 txdat

    2024年02月15日
    浏览(36)
  • STM32单片机(九)USART串口----第三节:USART串口实战练习(串口发送)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(59)
  • 关于STM32F407ZGT6的USB_UART端口损坏后使用ST-Link和USART1实现串口功能

    开发板:STM32F407ZGT6; 目标:想使用软件“串口调试助手” 情况:开发板上的USB_UART口所在器件损坏或者直接没有;   解决办法:查看该开发板的原理图,可得:串口1的RX接TXD,串口1的TX接RXD,那么按如下步骤操作: 1、现在使用USB转TTL模块,将串口1的RX接USB转TTL模块的TXD,

    2024年02月07日
    浏览(51)
  • STM32-串口通信(串口的接收和发送)

    本文在于记录自己的学习过程中遇到的问题和总结,各种情况下串口通信在STM32的实际使用方面占有很大的比重,本文主要对 串口通信 做一个简要的总结。 在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输 并行数据 ,是 全双工 , 异步时钟控制 ,设备之间是

    2024年02月03日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包