STM32单片机的基本原理与应用(六)

串口测试实验

基本原理

在串口实验中,是通过mini_USB线搭建终端与电脑端(也可称终端,为做区分称电脑端)的"桥梁",电脑端的串口调试助手通过mini_USB线向终端发送信息,由CH340芯片将USB接口进行转换,转换为串口,通过串口将信息传给单片机,串口接收到信息后,产生中断响应,单片机进行处理,单片机处理后返回一个信息给串口调试助手。

在串口通信中,中断处理程序通常包括串口接收中断和串口发送中断两部分。串口接收中断用于处理接收到的数据,当串口接收到数据时,就会产生接收中断,并进入接收中断处理程序。在该程序中,可以从串口中读取接收到的数据,并进行相应的处理。串口发送中断用于处理发送数据,当发送缓冲区为空时,就会产生发送中断,并进入发送中断处理程序。在该程序中,可以从应用程序中读取要发送的数据,并将其写入串口发送缓冲区中。

在进行数据的收发过程中,UART模块显得尤为重要。

STM32的UART模块是用于串口通信的硬件模块,它支持全双工通信,可以同时进行发送和接收数据。它使用通用同步/异步接收/发送器(USART)来实现串行通信,可以与外部设备进行串行数据传输。

以下是USART中的几个函数,分别对应不同的功能:

(1)USART_DeInit():串口复位函数

(2)USART_Init():串口参数初始化函数

(3)USART_Cmd():串口使能函数

实验原理图

程序代码

1、UART初始化

c 复制代码
void uart_init(u32 bound)
{
	//GPIO端口设置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟

	//USART1_TX   GPIOA.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);//初始化GPIOA.9

	//USART1_RX	  GPIOA.10初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

	//Usart1 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寄存器

	//USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	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); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1 
}

2、对串口中断服务进行设置

3、主函数中调用执行

c 复制代码
int main(void)
 {		
 	u16 t;  
	u16 len;	
	u16 times=0;
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
 	while(1)
	{
		if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			printf("\r\n您发送的消息为:\r\n\r\n");
			for(t=0;t<len;t++)
			{
				USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
			}
			printf("\r\n\r\n");//插入换行
			USART_RX_STA=0;
		}else
		{
			times++;
			if(times%5000==0)
			{
				printf("\r\nSTM32实训平台 串口实验\r\n");
				printf("adfadfassdfasdfa\r\n\r\n");
			}
			if(times%200==0)printf("请输入数据,以回车键结束\n");  
			delay_ms(10);   
		}
	}	 
 }

实验现象

打开串口调试助手,注意设置波特率为115200,可以观察到串口反复收到字符串"请输入数据,以回车键结束",用串口助手向单片机发送任意字符串后单片机会回显该字符串。

相关推荐
染予42 分钟前
Ka 阵面星历下发与执行逻辑说明
stm32·嵌入式硬件
芯片人0071 小时前
武汉广昇科技的GMUX1308A模拟开关芯片成功导入中国台湾上市企业联昌电子,助力汽车电子供应链自主可控
科技·嵌入式硬件·物联网·汽车·芯片
恒锐丰科技林技术员4 小时前
EG2181D 半桥栅极驱动芯片详解:高压 MOS/IGBT 驱动实用器件
经验分享·嵌入式硬件·硬件工程
国科安芯4 小时前
面向卫星测控应答机的抗辐射MCU信号采集与定时控制研究
单片机·嵌入式硬件·mcu·架构·卫星·商业航天·抗辐射
CC城子5 小时前
EtherNet/IP I/O 丢包排查(linux系统)
linux·单片机·tcp/ip·ethernetip
新晨单片机设计5 小时前
S010A-基于STM32单片机水温控制系统(数码管显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·嵌入式硬件
事界见闻6 小时前
高性能电机控制MCU选型对比:精度、功耗与实时性如何兼得?
单片机·嵌入式硬件
Brilliantwxx6 小时前
【STM32】 初认识USART串口
linux·stm32·单片机·嵌入式硬件·架构
分享资料7 小时前
用小电容消除高频信号的原因
嵌入式硬件·硬件工程
沐欣工作室_lvyiyi7 小时前
基于STM32的人脸识别门禁系统的设计与实现(论文+源码)
stm32·单片机·嵌入式硬件