首页 > 其他分享 >STMF4串口通信使用

STMF4串口通信使用

时间:2024-07-14 16:08:43浏览次数:14  
标签:USART 串口 通信 NVIC InitStructure GPIO STMF4 USART1

目录

STMF4串口通信使用

前提回顾:
串口通信概念介绍1
STM32串口通信概念介绍2
针对特定stm32F4板子的串口接线

折叠文本 USART指的是通用同步异步收发器,是STM32中的串行通信设备,STM32F407ZET6一共提供了6个串行接口供用户使用,其中4个为USART,2个为UART。UART指的是通用异步收发器,其实就是在USART的基础上裁掉了同步通信的功能,只保留了异步通信。 可以看到STM32中的USART采用工业标准中常用的NRZ编码进行通信,NRZ码指的是不归零码(Non-Return-Zero),指的是每次传输1bit数据后电平不归零,其实还有一种RZ码,指的是归零码(Return-Zero),指的是每次传输1bit数据后需要电平归零。

平时大家一般都是使用串口的异步通信功能,区分同步还是异步其实很简单,就是看是否在通信是对外提供时钟输出。

USART的使用流程

  1. 打开KEIL5工程,然后把ST公司提供的标准外设库的关于USART的源文件添加到工程中

  2. 参考并分析ST公司提供的代码例程以及提供的关于USART源文件的开头注释,进行理解

image

点击查看代码

void USART1_Config(u32 baud)
{
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	//打开了GPIO端口时钟  PA9和PA10
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	
	//打开USART1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	
	//选择GPIO引脚的复用功能
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9 , GPIO_AF_USART1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
	
	//配置GPIO引脚 注意:复用模式
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_9|GPIO_Pin_10;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	//配置串口参数+对串口初始化
	USART_InitStructure.USART_BaudRate = baud;																			        
    //波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;											//数据位
	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);

	//配置NVIC参数 + 对NVIC初始化
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
	
	//选择USART1的中断源,接收到数据则触发中断
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	//打开串口
	USART_Cmd(USART1, ENABLE);
}

//利用串口发送一个字符串
void  USART1_SendString(const char *str)
{
	while(*str)
	{
		while( USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET );
		 USART_SendData(USART1,*str++);
		 		
	}
}

//前台程序就是中断服务程序,该程序是不需要手动调用的,当中断触发之后CPU会自动跳转过来执行该函数
void USART1_IRQHandler(void)
{
	uint8_t data;
  //判断中断是否发生
  if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
  {   
		//从USART1中接收一个字节
		data = USART_ReceiveData(USART1);  //一次只能接收一个字节   
		
		//把接收到的数据转发出去
		USART_SendData(USART1,data);
  }
}

int main()
{
	
	//1.硬件的初始化
	USART1_Config(9600);
	
	while(1)
	{
		 	//把接收到的数据转发出去
		  USART_SendData(USART1,'h');
		  delay_ms(500);
		
	}
}





注意

  • 如果打算串口发送字符串,由于字符串属于字符序列,所以按照顺序发送字符,由于串口外设的发送数据寄存器是8bit的,所以每次只能发送1个字符,并且只有等上一次字符发送完成,才可以发送下一个字符。
  • 可以通过检测串口外设的发送数据寄存器是否为空,来判断待发送的字节是否发送完成,所以需要检测状态标志。
  • 配置GPIO引脚 注意:复用模式
  • 接收数据用上中断,要用上NVIC->NVIC、EXIT学习

参考李明轩老师第9天的笔记

标签:USART,串口,通信,NVIC,InitStructure,GPIO,STMF4,USART1
From: https://www.cnblogs.com/shishusheng/p/18301629

相关文章

  • USART串口协议 和va_list,va_start,va_end,vsprintf
    串口接口通信的目的:将一个设备的数据传送到另一个设备扩展硬件系统通讯协议:制定通信的规则,通信双方按照协议规则进行数据收发。注意:差分信号一般传输速度和距离都会非常高。多设备相当于老师在教师给所有同学讲课,点对点相当于老师找你到办公室谈话。串口是一种应用......
  • C#与PLC通信——如何检测电脑与PLC之间的网络是否通畅
    前言:电脑和PLC的IP地址设置好以后,可以先通过一些手段来测试电脑和PLC之间的网络是否通畅,如果确认了网络通畅以后,我们再测试通信程序。1、同时按下键盘的windows键+"R"键,如下图:下面两张图是两种键盘的情况,并且能弹出”运行“窗口2、在窗口中输入“cmd”,然后点击“确定......
  • STM32串口通信概念介绍2
    STM32串口通信(1) 硬件接线说明采用4针的串口(TXD、RXD、GND、VCC),然后通过CH340芯片进行转换,就可以直接通过USB口转串口的方式达到和计算机通信的目的。如果采用有线方式与PC机进行通信,则需要用到CH340转换芯片,数据会通过USART1串口传输。(1) 串口通信参数串口通信属于全双......
  • 针对特种stm32F4板子的串口接线
    硬件接线说明直接采用4针的串口(TXD、RXD、GND、VCC),然后通过CH340芯片进行转换,就可以直接通过USB口转串口的方式达到和计算机通信的目的。如果采用有线方式与PC机进行通信,则需要用到CH340转换芯片,数据会通过USART1串口传输。如果采用无线方式与手机进行通信,则不需要用到CH......
  • F103VET6+HAL库+UART串口空闲中断+DMA收发数据
    声明串口接收一段数据需要进入中断的次数太多了,为了充分利用CPU,使用空闲中断是更好的选择步骤一、CubeMX生成有关串口的配置串口全局中断勾上、DMA和DMA的中断勾上二、在main函数里使能两个串口的中断        第一个空闲中断、第二个接收寄存器不为空中断(后面解......
  • OpenFlow 是一个网络通信协议,它允许网络管理员通过中央控制器(如 OpenFlow 控制器)来编
    OpenFlow是一个网络通信协议,它允许网络管理员通过中央控制器(如OpenFlow控制器)来编程定义网络中的数据包转发行为。OpenFlow协议通常用于软件定义网络(SDN)架构中,其中网络控制平面与数据转发平面是分离的。在Python中,直接编写与OpenFlow交换机交互的代码通常涉及使用......
  • 温湿度传感器的学习及基于串口和逻辑分析仪的验证
    目录温湿度传感器温湿度传感器的基本概述测量精度硬件接线时序分析接收数据分析代码全局变量配置DHT11为输出模式配置DHT11为输入模式配置初始化DHT11发送开始信号判断DHT11温湿度传感器是否应答接收一位数据接收一个字节的数据接收DHT11传输的数据串口USART1的初始化利用串口发送......
  • Java中的线程通信详解
    Java中的线程通信详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在多线程编程中,线程之间的通信是一个重要且复杂的主题。为了确保多线程程序的正确性和效率,线程需要能够互相通信并协调工作。Java提供了多种方式来实现线程间的通信,如wait()、notify......
  • 【IEEE出版】第六届电子与通信,网络与计算机技术国际学术会议(ECNCT 2024,7月19-21)
    第六届电子与通信,网络与计算机技术国际学术会议(ECNCT2024)将于2024年7月19日-21日在中国·广州举办,为期三天。会议由广东工业大学自动化学院主办,会议将安排主旨报告,口头报告以及海报展示,主题包括通信技术及应用,计算机工程,网络工程和应用技术,电子和电气工程等。本......
  • 【高录用、快检索、过往5届均已检索、SPIE 出版】第六届无线通信与智能电网国际会议(IC
    随着科技的飞速发展和能源需求的日益增长,智能电网技术逐渐成为电力行业的重要发展方向。与此同时,无线通信技术在近年来也取得了显著的进步,为智能电网的发展提供了强有力的支持。为了进一步推动无线通信与智能电网的结合与发展,第六届无线通信与智能电网国际会议(ICWCSG2024......