STM32串口通信的实例(内附详细代码)

这篇具有很好参考价值的文章主要介绍了STM32串口通信的实例(内附详细代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里我们使用串口1,来通过我们发送的数据来决定去实现相应的操作。

stm32串口通信例程,stm32,单片机,嵌入式硬件示例是当单片机串口接收到数据后控制LED1的亮灭,并且将数据发送到上位机

首先我们的LED1的初始化,当然PB0连接的是蜂鸣器,这边就一起配置,首先初始化这俩个引脚。

LED1灯和BUZZER的配置和相关函数

led.c

#include "stm32f10x.h"                  // Device header
#include "hal_led.h"

static void hal_ledconfig(void);//外部接口
void hal_LEDInit(void)
{
	hal_ledconfig();

}
static void hal_ledconfig(void)
{
		GPIO_InitTypeDef   GPIOInitStructure;//创建GPIO结构体变量
		//用到了GPIOA和GPIOB,打开
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开GPIOA的时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开GPIOB的时钟
		//用到什么外设就需要打开对应外设的时钟,不然初始化不会成功
		GPIOInitStructure.GPIO_Pin=LED1_Pin;//LED1_Pin是对GPIOA_Pin1的宏定义目的是便于移植
		GPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//这里我们需要控制灯所以将引脚设置成推挽输出模式
		GPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz;//速度一般设置成50MHZ,当然你们可以自己去配置成其他的
		
		GPIO_Init(LED1_PORT,&GPIOInitStructure);//将GPIOA_Pin_1的初始化结构体参数初始化
		GPIO_ResetBits(LED1_PORT,LED1_Pin);//关闭灯
		
		GPIOInitStructure.GPIO_Pin=BUZ_Pin;//再给GPIOB_Pin_0配置,BUZZER和LED1的配置相同这边就不重复说明了
		GPIOInitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
		GPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz;
		
		GPIO_Init(BUZ_PORT,&GPIOInitStructure);
		GPIO_ResetBits(BUZ_PORT,BUZ_Pin);
}


//通过该函数来控制灯的亮灭,当然这边形参的类型可以使用bool
void LED1Drive(unsigned char start)//当传入的start>0时都是将灯打开,=0时关闭灯
{
		if(start)
		{
		GPIO_SetBits(GPIOA,GPIO_Pin_1);
		}
		else
		{
		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
		}
}
//buzzer同LED1相同
void BUZZERDrive(unsigned char start)
{
		if(start)
		{
		GPIO_SetBits(GPIOB,GPIO_Pin_0);
		}
		else
		{
		GPIO_ResetBits(GPIOB,GPIO_Pin_0);
		}
}

void hal_Turn_led(void)//翻转LED1的引脚电平
{
		GPIO_WriteBit(GPIOA,GPIO_Pin_1,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)));
}

led.h

#ifndef  __HAL_LED_H
#define  __HAL_LED_H

#define LED1_PORT  GPIOA    
#define LED1_Pin  GPIO_Pin_1

#define BUZ_PORT  GPIOB
#define BUZ_Pin  GPIO_Pin_0

void hal_LEDInit(void);
void LED1Drive(unsigned char start);
void BUZZERDrive(unsigned char start);
void hal_Turn_led(void);
#endif

usart.c

#include "stm32f10x.h"                  // Device header
#include "hal_usart.h"
#include "hal_led.h"


static void hal_USARTConfig(void);//声明

void hal_USARTInit(void)//用初始化函数调用,初始化,留给外部一个接口//在主函数调用
{
		hal_USARTConfig();
}

static void hal_USARTConfig(void)//配置函数不让外部改变
{
		GPIO_InitTypeDef  GPIO_InitStructure;
		NVIC_InitTypeDef  NVIC_InitStructure;
		USART_InitTypeDef USART_InitStructure;
		
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);//打开串口1和GPIOA的时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开复用时钟AFIO
		 
		GPIO_InitStructure.GPIO_Pin = USART1_RX_Pin;//配置PA10引脚
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度配置成50MHZ
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //模式配置成浮空模式
		GPIO_Init(USART1_RX_PORT, &GPIO_InitStructure);//初始化函数来根据结构体参数来配置GPIO_Pin_10
	
		GPIO_InitStructure.GPIO_Pin = USART1_TX_Pin;//配置PA9
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度配置成50MHZ
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//模式配置成复用推挽输出 
		GPIO_Init(USART1_TX_PORT, &GPIO_InitStructure);//初始化函数来根据结构体参数来配置GPIO_Pin_9
	
	//串口1结构体内含的参数,根据参数来配置串口
		USART_InitStructure.USART_BaudRate=115200;//串口1的波特率
		USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//流控制,一般不打开,
		USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//模式设置成发送和接收
		USART_InitStructure.USART_Parity=USART_Parity_No;//将0 宏定义成USART_Parity_No,代表无校验
		USART_InitStructure.USART_StopBits=USART_StopBits_1;//0代表停止位是1位
		USART_InitStructure.USART_WordLength=USART_WordLength_8b;//数据长度是8位
		
		
		USART_Init(USART1,&USART_InitStructure);//将参数设置到串口1
		USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能接收中断
		USART_ITConfig(USART1,USART_IT_TXE,DISABLE);//关闭发送中断,发送中断由自己决定当有数据要发送时由程序打开,发送完后需要关闭
		USART_Cmd(USART1,ENABLE);//使能串口1
		
		
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//分组,将中断分到0组
		NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//确认中断是串口中断
		NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能中断
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//子优先级
		NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//主优先级
		NVIC_Init(&NVIC_InitStructure);//将参数配置到中断中
		
		
		
}

static void hal_DebugSendByte(unsigned char  Dat)//串口发送函数static代表仅在该.c文件中调用
{
	USART_SendData(USART1, Dat);//将接收到的数据发送出去//库函数
	USART_ITConfig(USART1, USART_IT_TXE, ENABLE); 	//使能发送中断
	
}



void USART1_IRQHandler(void)//串口1中断服务函数
{
	unsigned char dat;
	if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)//当有数据时
	{							
		dat = USART_ReceiveData(USART1);//将数据给dat

		if(dat==0)
		{
			LED1Drive(0);//关闭灯	
			hal_DebugSendByte(dat);//将接收到的数据在通过串口发送到串口助手
		}
		else 
		{
			//接收到的数据>1就是打开灯
			LED1Drive(dat);
			hal_DebugSendByte(dat);//将接收到的数据在通过串口发送到串口助手
		
		
		}


		USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除标志位
		
	}
	
	if(USART_GetITStatus(USART1,USART_IT_TXE) != RESET)//发送模式
	{
		 USART_ClearITPendingBit(USART1, USART_IT_TXE);//先清除标志位
		 USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//发送完成后将关闭发送中断
	}
		

}

usart.h

#ifndef  __HAL_USART_H__
#define  __HAL_USART_H__

#define  USART1_RX_PORT   GPIOA
#define  USART1_RX_Pin   GPIO_Pin_10

#define  USART1_TX_PORT   GPIOA
#define  USART1_TX_Pin   GPIO_Pin_9

#define  USART2_RX_PORT   GPIOA
#define  USART2_RX_Pin   GPIO_Pin_3

#define  USART2_TX_PORT   GPIOA
#define  USART2_TX_Pin   GPIO_Pin_2

#define DEBUG_TXBUFF_SIZE_MAX  400
void hal_USARTInit(void);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "hal_led.h"
#include "hal_usart.h"
int main()
{

		hal_LEDInit();
		hal_USARTInit();
		while(1)
		{	
			
			
		}
}

发送时注意,发送是ASCII码值,0对应的是\0,其他字符发送都是>0的数据

示例:

VID20230425103232

需要通过接收到的信息完成其他功能只需要在接收判断中加入想要完成的操作即可

如图:

stm32串口通信例程,stm32,单片机,嵌入式硬件

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

到了这里,关于STM32串口通信的实例(内附详细代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • HAL库 STM32运用DMA与IDLE中断实现高效串口通信 (附代码)

    最近想做一个控制电机的项目,其中会用到Pytho与单片机STM32之间的互同,最近也在看一些关于数据通信和拆包的相关知识,所以记录一下这段时间里对两者之间的互通所做的事情和发现的问题,以供自己和大家参考。 单片机的串口是我们常用的与电脑通信的外设,本次与P

    2024年01月22日
    浏览(39)
  • 使用标准库和HAL库的STM32单片机进行串口通信/解决因例程为HAL库的传感器,而其他模块都是标准库,需要将数据用串口传送给标准库的单片机的相关问题

    (本文使用STM32F103C8T6,在CubeMX里演示用的是RBT6,但实际上引脚是一样的)         本文 着重解决一个大工程中,某些传感器的例程是HAL库的,而其他模块(或算法)都是标准库,导致难以移植的问题。 本文的解决方法是:使用一片单片机用HAL库(CubeMX)配置例程,然后

    2024年02月06日
    浏览(36)
  • MKS SERVO42&57D 闭环步进电机_系列11 STM32_脉冲和串口例程

    MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口,支持MODBUS-RTU通讯协议,内置高效FOC矢量算法,采用高精度编码器,通过位置反馈,有效防止电机丢步。适合小型机械臂,3D打印机,雕刻机,写字机,

    2024年02月12日
    浏览(29)
  • P27[9-3]STM32:串口通信(串口发送)(内含:1.接线图+2.实物图+3.代码部分+4.解决串口发送数据,数据是汉字,结果发送结果为乱码的现象)

    1.接线图如下: 跳线帽接在4~5引脚,2,3引脚连接PA9和PA10引脚。下图也可得出USART接PA9和PA10引脚。 TX和RX是交叉连接。PA9(黄线)是TX,接RXD。PA9(绿线)是RXD,接TX. 图中的串口模块和STINK都接电脑上,使之拥有独立供电。 2.实物图: 黄色为跳线帽,接4~5引脚。

    2024年02月09日
    浏览(28)
  • STM32 学习————串口通信

    众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和自定义编写串口通信函数。 通信目的:的将一个设备数据传送到另一个设备,扩展硬件系统。 通

    2024年02月01日
    浏览(30)
  • 【STM32串口通信】

    每天更新STM32学习笔记 串口通信的数据按 位 顺序传输,其数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口,故串口通信至少需要两根线(GND和一根信号线)来实现单工通信。若要实现全双工通信,则要三根线(GND和两根信号线)。 串口通信的数据包由起始位、数

    2024年02月04日
    浏览(34)
  • STM32简单串口通信

    题目要求: 一. 了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解\\\"USB/TTL转232\\\"模块(以CH340芯片模块为例)的工作原理。 二. 安装 stm32CubeMX,配合Keil,使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验位,完成下列任务: 1)STM32系统给上

    2024年01月18日
    浏览(27)
  • 多串口通信(stm32)

    在做项目的过程中我们会同时使用多个串口,如:Esp8266wifl模块,HC-05蓝牙模块,还有串口下载,这些都需要多个串口通信。 串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。 现在基本上所有的 MCU 都会带有串口, STM32 自然也不例外。

    2024年04月29日
    浏览(29)
  • STM32—串口通信

    目录 通信基础知识 通信的本质 时钟信号划分 同步通信 异步通信 通信方式划分 串行通信 串行通信 串行传输 优点 缺点  并行通信 并行通信 并行传输 优点 缺点  通信方向划分 单工 半双工 全双工  总线协议(电气协议) USART  串口通信协议  数据帧格式 USART功能框图  流

    2024年02月04日
    浏览(32)
  • ESP32 与 STM32 串口通信

    ESP32 一共有三个 UART 通讯接口,设备号从 0~2,即 UART0,UART1,UART2。 每个UART控制器都是独立配置的,参数包括波特率、数据比特长度、位序、停止位数、奇偶校验位等。 本文章中使用ESP-WROOM-32开发板下载调试串口UART0和UART2(与STM32进行通信)实现。 STM32部分代码参照 正点原

    2024年02月11日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包