STM32 HAL库串口接收与发送教程

前言

        在此之前,我们已经学习了单片机串口通信的原理(江科协),再写一遍我个人认知:世界上任何两个事物如果要进行交流的话,那必然需要两个东西进行通信的,就像两个人之间,两个国人之间用普通话就能够清楚的交流,但是让我们中国人和外国人去交流可能会有点费力了,假设一个英国人在那,你要是想和他聊天,那必然是你学英语或者他学汉语才行,这里的你们之间交流用的语言就是单片机中的  通信协议   。假设汉语是串口通信,英语是I2C通信,那这两个是不兼容的,所以必须要统一语言,统一协议才行。所以是说,不同的芯片所用的通信协议是不一样的,我们要根据需要有针对性的选择学习。

Cubemax配置

        在B站视频中我们可以看到老师写的代码,看着操作挺多的,如果让自己写的话那肯定是大部分人都挺费劲的。但是!!!!如果我们用Cubemax配置(偷懒神技)的话那就会很轻松了,同样只需要选择自己所需要的参数就能够完成目的。话不多说,直接看步骤:

注意,在配置的时候,RCC(Reset and Clock Control,即复位和时钟控制)要配置为外部晶振

 

这里的SYS配置选Serial Wire

然后选择串口为asynchronous(异步通信),然后下面就会生成波特率,数据宽度,停止位,校验位等,这里一般用默认的就好,因为刚开始学习时接触的大多数都是这个配置。

 然后可以根据自己的需要把中断或者DMA模式打开。

配置好后别忘了配置时钟树,一般只用选择完红圈里的东西后点回车就行了。

usart_x264

keil端

生成代码之后呢,我们就需要知道哪些是我们所需要的代码了,接下来,我们在keil中打开stm32f1xx_hal_uart.c文件:

         在这个文件里我们能看到很多代码,很多注释,乱七八糟的,但是我们只需要看我们所需要的就行了,在此之前,你需要积累一些常用的函数。怎么在左下角可以看到有个Functions,我们点开然后再点串口的文件,可以看到这个文件里所有的函数都呈现出来了:

其中有几个最为常用的函数需要大家熟记(具体函数的用法以及原理规则就不跟大家介绍了,网上一查很多):

 举例

        给大家举几个简单的例子说明一下:

串口发送

HAL_UART_Transmit(&huart1,"hello,world",11,HAL_MAX_DELAY);
HAL_UART_Transmit_IT(&huart1,"hello,world",11);
HAL_UART_Transmit_DMA(&huart1,"hello,world",11);

        这是3种不同的方式发送数据 hello,world, 第一种是轮询模式就是单片机按个去发送数据,大家排好队一个一个来,这种发送方式比较稳定,建议以后大家非必要就用这个发。

        第二个是用中断发送发送数据,这句程序的工作过程是,还是排好队一个一个发,但是当单片机发送11个数据之后,单片机需要进一次中断,中断回调函数为:HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart),但是由于是中断模式,需要进行中断处理,倘若单片机在进行中断处理时又一次进入中断的话,单片机就会出现错误,因此中断发送不能两个中断发送函数连着使用,但是需要间隔多长时间呢?有点小复杂,我还没探究过> <。DMA模式好像也有类似问题,因此前期学系的话只用轮询就够了。

串口接收

uint8_t ReBuf[8];
HAL_UART_Receive(&huart1,ReBuf,8,HAL_MAX_DELAY);
HAL_UART_Receive_IT(&huart1,ReBuf,8);

         在进行串口接收前,单片机需要知道接收到的数据放在哪里,因此就需要接收缓存区:ReBuf。程序种轮询接收意思是接收依次接收8个数据存放在ReBuf中,中断接收呢是依次接收8个数据后进入接收中断里,串口接收中断的回调函数为:

 HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

我们可以根据需要在中断回调函数里进行所需要的操作。或者是在主程序中操作也是可以的,可以根据自己程序的不同逻辑酌情选择。

        另外附上我在stm32与openmv进行串口收发的相关代码

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  uint16_t tempt  /*定义临时变量存放接受的数据*/;
  if(huart->Instance==USART2)
  {
    tempt=ReBuff[0];
    Openmv_Receive_Data(tempt);
		/*调运数据接收处理函数,每次进入中断都对数据进行理处
		,由于需要接收器个数据,因此要进入七次断理*/
  }	
HAL_UART_Receive_IT(&huart2,(uint8_t*)&ReBuff,1);/*再次开启接收中断*/
}

作者:Long___s

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 HAL库串口接收与发送教程

发表评论