当前位置:首页 > 单片机 > STM32CubeMX > 正文内容

STM32CubeMX系列教程4:基本串行通信

ouyang7个月前 (09-30)STM32CubeMX2064



一、摘要

  本章讲解STM32单片机的串行通信使用方法,主要讲解STM32 HAL库的轮询与中断方式的串口通信。实现单片机将串口接收到的数据再次发送出去。

二、配置工程

  复制《STM32CubeMX系列教程0:创建工程》创建的工程目录GPIO_test,修改文件目录名称为USART,双击打开GPIO_test.ioc。
  如果需要安装必备的开发环境,可参考《STM32开发环境安装》

1. 轮询方式发送

1-1. 启用串口通信

  配置USART1为异步通信方式,默认波特率为115200bps,同时自动设置PA9与PA10为串口的发送与接收引脚。其他参数默认,无需更改。设置完成,点击生成代码。
enter description here

1-2. 编写用户代码

  打开生成的代码,打开mian.c入口文件,找到main(void)函数,删除while中原有的代码。
enter description here
  添加新的代码

	HAL_UART_Transmit(&huart1,(uint8_t *)"USART_TEST\r\n",12,100);  //以轮询的方式发送字符串
   	HAL_Delay(500);								//延时500ms


enter description here

  HAL_UART_Transmit(&huart1,(uint8_t*)"USART_TEST\r\n",12,100);
  这句的功能是以串口1发送字符串“USART_TEST\r\n”,12表示12个字符,100表示超时时间100ms。这个函数来自于stm32f4xx_hal_uart.c
enter description here


1-3. 编译下载

  代码编写完成后,编译下载进入单片机。STM32单片机程序下载方法有多种,有需要请转《STM32程序下载》专题查阅,选择你所需要的下载方法。http://oynote.top/?tags=57
  下载完成,点击复位。打开串口助手,连接到相应的端口,设置波特率为115200,即可接收到单片机发送的数据。
enter description here

2. 中断方式收发

2-1. 启动串口中断

  回到STM32CubeMX,其他参数不变,依然是选中串口1,启动异步通信,打开中断设置,勾选USART1全局中断。
enter description here

2-2. 编写用户代码

  配置完成后,重新生成代码后,打开生成的代码,在main.c文件的用户变量去建立串口接收缓冲区数组。uint8_t rx1_buf[10];
enter description here
  找到主函数,在while语句之前,开始通过串口中断接收数据。
  HAL_UART_Receive_IT(&huart1,rx1_buf,10);
   这句话的意思是以中断的方式从串口1接收数据,接收道到的数据存在rx1_buf数组中,每次接收10个字节。
enter description here
这个函数的实现实在stm32f4xx_hal_uart.c中。
enter description here

删除while语句中的程序。

2-3. 编写中断回调函数

  在main.c文件的下方,填入串口中断接收回调函数,

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){	if(huart == &huart1)   //判断中断是否来自于串口1
	{
		HAL_UART_Transmit_IT(&huart1,rx1_buf,10);  //将接收到的数据通过中断的方式发送出去
		HAL_UART_Receive_IT(&huart1,rx1_buf,10);	//开始接收下一轮数据
	}
}


enter description here


2-4. 编译下载

  代码编写完成后,编译下载进入单片机。STM32单片机程序下载方法有多种,有需要请转《STM32程序下载》专题查阅,选择你所需要的下载方法。http://oynote.top/?tags=57
  下载完成,点击复位。打开串口助手,连接到相应的端口,设置波特率为115200,从串口助手向单片机发送10个字节的数据,单片机将会把发过去的数据在返回给串口助手。必须发够10个字节的数据,才能够触发中断。
![enter description here](./1601472748603.png

三、串口相关函数

串口的发送接收函数:
HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。
HAL_UART_Receive();串口轮询模式发送,使用超时管理机制。

HAL_UART_Transmit_IT();串口中断模式发送,
HAL_UART_Receive_IT();串口中断模式发送

HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Receive_DMA();串口DMA模式发送

串口相关的中断函数:
HAL_UART_TxHalfCpltCallback():一半数据(half transfer)发送完成后,通过中断处理函数调用。
HAL_UART_TxCpltCallback():发送完成后,通过中断处理函数调用。
HAL_UART_RxHalfCpltCallback():一半数据(half transfer)接收完成后,通过中断处理函数调用。
HAL_UART_RxCpltCallback():接收完成后,通过中断处理函数调用。
HAL_UART_ErrorCallback():传输过程中出现错误时,通过中断处理函数调用。

可看到串口发送和就是有三种通信模式:
第一种是上面用到的轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。
第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。
第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。

    扫描二维码至手机访问

    扫描二维码推送至手机访问。

    版权声明:本文由电子科技Blog发布,如需转载请注明出处。

    转载请注明出处:http://oynote.top/?id=356

    分享给朋友:

    相关文章

    STM32CubeMX系列教程3:基本定时器中断

    STM32CubeMX系列教程3:基本定时器中断

    一、摘要二、配置工程1-1. 使能定时器1-2. 配置定时器参数1-3. 开启定时器中断1. 配置定时器参数2. 生成工程三、编写用户程序1. 编写中断回调函数2. 启动定时器四、编译下载程序一、摘要...

    STM32CubeMX系列教程5:串口接收不定长数据

    STM32CubeMX系列教程5:串口接收不定长数据

    一、摘要二、配置工程1. 配置串口及DMA2. 生成源码三、修改源码1. 重定向printf2. 添加串口接收所需变量3. 添加串口及IDLE处理函数4. 声明变量及函数5. 启用IDLE中断6. 修...

    STM32CubeMX系列教程1:GPIO输入与输出

    STM32CubeMX系列教程1:GPIO输入与输出

    一、摘要二、创建工程1-1. 配置RCC与Debug1-2. 选择GPIO引脚与功能1-3. 配置GPIO1. 配置外设与IO2. 时钟配置3. 工程输出设置三、编写用户代码1. 插入用户代码2. 编...

    STM32CubeMX系列教程2:外部中断EXIT

    STM32CubeMX系列教程2:外部中断EXIT

    一、摘要二、配置工程3-1. 中断优先级分组3-2. 中断优先级1. 修改引脚模式2. 配置GPIO3. 开启外部中断4. 生成工程三、编写用户程序1. 编写中断回调函数四、编译下载程序1. 注意一、...

    STM32CubeMX系列教程0:创建工程

    STM32CubeMX系列教程0:创建工程

    STM32Cube 是一个全面的软件平台,包括了ST产品的每个系列。平台包括了STM32Cube 硬件抽象层(一个STM32抽象层嵌入式软件,确保在STM32系列最大化的便携性)和一套的中间件组件(R...

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。