【STM32基础篇之串口透传】

串口介绍

串口作为单片机一种最基础的数据传输手段,在日常开发单片机过程中都有着不错的效果。这些天在做ESP8266模块关于串口透传的功能在网上找了很久都没有一个满意的答案,琢磨了几天之后终于弄清楚了。

实验内容

通过两个串口来达到初始化ESP8266的目的。

  1. 实验开发板是正点原子的STM32F103ZET6
  2. 所用到的串口主要是串口1和串口3

实现的功能:串口1可以将串口调试助手的信息发送给串口3,串口3可以将ESP8266初始化信息返回给串口三,同时可以将初始化信息显示在串口调试助手。

原理图

 系统架构
这张图对应时钟线,也就是说在不同APB时钟线下挂载的资源也是不一样的。红色标记是本次实验所用的板载外设。

原理图

ESP8266引脚

STM32最小系統
可以看到模块对应最小系统的PB10和PB11引脚

代码(标准库版本)

串口1初始化

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 

}

void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 res;
	res=USART_ReceiveData(USART1);
	USART_SendData(USART3, res);
} 

串口1中断服务函数,我们从串口调试助手发送数据,串口1收到数据之后会把数据临时存储到res中,然后通过串口3发送函数发送到串口3中

串口3初始化

void ESP_UART3_init(u32 bound)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);      //使能PB端口时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);    //USART3时钟
	
	//GPIO初始化 对照最小系统原理图 初始化的IO引脚为PB10 PB11
	
	//GPIOB.10 RX
	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	//GPIOB.11 TX
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	//中断优先级初始化
	NVIC_InitStructure.NVIC_IRQChannel = USART3_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_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(USART3, &USART_InitStructure);
	
	//使能串口3
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
	USART_Cmd(USART3, ENABLE);
}
void USART3_IRQHandler(void)											//串口3中断服务程序
{
	u8 Res;  
	Res=USART_ReceiveData(USART3);
	USART_SendData(USART1, Res);
}


串口3中断函数。串口3接收函数将ESP8266初始化的结果存放在Res中,通过串口以就可以实现功能了

实验结果

实验结果

关于ESP8266初始化问题。日后我会详细写一篇文章,主要针对大学生毕设问题重点说明。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: STM32串口透传是指通过STM32微控制器将串口接收到的数据直接传递给串口发送,实现数据的透明传输。透传可以通过HAL库来实现。 首先,我们需要设置串口的相关参数,如波特率、数据位、停止位等。通过HAL库提供的函数,可以方便地配置串口的工作模式。 其次,需要使用中断来实现串口的接收功能。通过HAL库提供的中断回调函数,可以在串口接收到数据时自动触发中断,并将接收到的数据存储在缓冲区中。 然后,我们需要使用DMA来实现串口的发送功能。通过HAL库提供的函数,可以设置DMA传输的起始地址和传输数据的长度,并将数据发送给目标设备。 最后,我们需要在主循环中不断地检查缓冲区中是否有接收到的数据。如果有接收到数据,则可以直接将数据通过串口发送出去,实现串口透传功能。 整个过程中,我们需要注意同步问题,即接收到的数据是否完整并且按照正确的顺序进行处理。可以通过使用信号量或者互斥锁等机制来实现数据的同步和保护。 总之,通过使用HAL库提供的函数和硬件资源,可以方便地实现STM32串口透传功能。这种方法不仅简单、高效,而且可靠性较高,适用于各种串口通信应用。 ### 回答2: STM32是一款32位的微控制器,可以用于各种嵌入式系统和应用中。串口透传是指通过串口将数据从一个设备传输到另一个设备的过程。透传HAL是在STM32中使用的一种硬件抽象层,它提供了一套API函数,方便开发人员使用串口进行透传通信。 串口透传可以实现不同设备之间的数据传输和通信。在STM32中,可以使用HAL来配置和操作串口,使得透传功能更加方便。通过HAL库中提供的函数,可以设置串口的波特率、数据位数、停止位数和校验位等参数,还可以使用中断或DMA方式进行数据的接收和发送。 使用串口透传HAL时,首先要初始化串口并配置相关参数。通过调用HAL库中的函数,可以设置串口的工作模式、波特率和其他通信参数。然后,在数据传输过程中,可以使用HAL库中的接收和发送函数来实现数据的透传透传HAL可以充分发挥STM32串口通信功能,提供了一套方便快捷的API函数,可以简化开发人员的工作。通过透传HAL,可以在不同的STM32芯片和外设之间实现可靠的串口通信,使得系统的数据传输更加高效和稳定。 总之,STM32串口透传透传HAL提供了一种方便易用的方式来实现串口通信。开发人员可以通过简单的配置和调用HAL库中的函数,快速搭建串口透传系统,实现设备之间的数据传输和通信。 ### 回答3: STM32是意法半导体(STMicroelectronics)推出的一系列32位微控制器的产品线。它具有强大的性能和丰富的外设资源,因此在嵌入式系统开发中得到广泛应用。 串口透传是一种通信方式,通过UART(通用异步收发传输)实现。通常用于将数据从一个串口接收并透传到另一个串口上,实现不同设备间的数据传输。 HAL(Hardware Abstraction Layer)是意法半导体针对STM32系列微控制器提供的一种软件库,用于简化产品开发过程中的驱动程序编写。HAL库提供了一系列接口函数,包含了对GPIO、串口、定时器、中断等硬件资源的操作。通过使用HAL库,开发者可以更加便捷地访问底层硬件功能。 在使用STM32进行串口透传时,可以通过HAL库来实现。需要先初始化两个串口,并配置它们的参数,如波特率、数据位数、停止位等。然后,通过HAL库提供的接口函数,可以在主循环中进行数据的接收和发送。一旦接收到数据,可以通过HAL库提供的函数将其发送到另一个串口,从而实现透传。 总结来说,STM32串口透传透过HAL库的使用,可以简化开发者的工作,提供了丰富的接口函数和功能,使得串口通信变得更加便捷和高效。当开发者需要进行串口透传时,可以借助STM32和HAL库来实现该功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值