匿名
未登录
登录
丢石头百科
搜索
查看“STM32CubeMX系列教程5:串行通信(USART)”的源代码
来自丢石头百科
名字空间
页面
讨论
更多
更多
页面选项
查看
查看源代码
历史
←
STM32CubeMX系列教程5:串行通信(USART)
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
本章以串口为例讲解,HAL 库轮询,中断,DMA 三种编程模型。 <b style="background-color: inherit;">1.前情回顾</b> 在串行通信中,一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束。在进行传输之前,双方一定要使用同一个波特率设置。波特率就是每秒钟传输的数据位数。 常用的两种基本串行通信方式包括同步通信和异步通信。我们通常使用的是异步通信.异步通信规定传输的数据格式由起始位(start bit)、数据位(data bit)、奇偶校验位(parity bit)和停止位(stop bit)组成。 [[File:114753bqgs5kuu0d055hch.png]] <b>2.重定义printf函数。</b> 打开STM32CubeMX新建工程,选择STMF746IGT6芯片,选择外部高速晶振(HSE)。USART1选择为异步通信方式。PA10设置RX接收,PA9设置为TX发送。 [[File:114753zzqqgeaj1raaar1p.png]] [[File:114753nsx3v1aszl6qxvv9.png]] 配置时钟系统时钟为216MHz,STMF746可以单独配置USART时钟,默认为108Mhz。 [[File:114753gjf6fpffljd66ttj.png]] 串口配置设置波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1.其他参数默认。 [[File:114754ez66di196ii6itmz.png]] 生成报告以及代码,编译程序。在usart.c文件中可看到串口1的初始化函数MX_USART1_UART_Init(void),以及管脚配置函数HAL_UART_MspInit()。 C语言中的标准库中所用的标准输出函数,默认的输出设备是显示器,要实现串口或LCD的输出,必须重新定义标准库函数里与输出函数相关的函数。例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:只要自己添加一个int fputc(int ch, FILE *f)函数,能够输出字符就可以了。 在usart.c文件后面添加如下代码,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int <syntaxhighlight lang="python"> __io_putchar(</syntaxhighlight><syntaxhighlight lang="python"> int</syntaxhighlight> <syntaxhighlight lang="python"> ch)函数,否则定义为int fputc(int ch, FILE *f)函数。</syntaxhighlight> <syntaxhighlight lang="python"> /* USER CODE BEGIN 1 */ #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ /** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */ HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); return ch; } /* USER CODE END 1 */</syntaxhighlight> <syntaxhighlight lang="python"> 其中</syntaxhighlight>HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);这个语句表示通过串口1发个一个字符。ch为字符的存储地址,0xFFFF为超时时间。在stm32f7xx_hal_uart.c文件中可以找到HAL_UART_Transmit函数。 [[File:114914pyzpe6e7jyk76b7o.png]] 在main.c文件中添加应用函数。 <syntaxhighlight lang="python"> /* USER CODE BEGIN 2 */ printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r"); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ printf("\n\r welcome to www.waveshere.com !!!\n\r"); HAL_Delay(1000); } /* USER CODE END 3 */</syntaxhighlight> 编译程序并下载到开发板。用USB线连接开发板到电脑,在电脑上打开串口调试助手。选择对应的串口号,设置波特率为115200。按下复位按键会接收到如图信息。 [[File:114754hw1f1fwb6zqoqonf.png]] 打开stm32f7xx_hal_uart.h头文件,在文件后最后面可以看到有如下操作串口的函数。 [[File:115008jksts5tk8a8jurss.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在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。 <b style="background-color: inherit;">3.中断模式。</b> 打开STM32CubeMX重新建工程,配置和前面一样。只是这个工程中,开启了串口中断。 [[File:114755k1jh9iukj9k1ukkh.png]] 生成报告以及代码,编译程序。在main函数前面添加两个数组变量。 <syntaxhighlight lang="python"> /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ uint8_t aTxStartMessage[] = "\r\n****UART-Hyperterminal communication based on IT ****\r\nEnter 10 characters using keyboard :\r\n"; /* Buffer used for reception */ uint8_t aRxBuffer[20]; /* USER CODE END PV */</syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> <syntaxhighlight lang="python"> 在main函数中添加两个语句通过串口中断发送aTxStartMessage数组的数据和接收数据10个字符,保存在数组aRxBuffer中。 </syntaxhighlight> <syntaxhighlight lang="python"> <syntaxhighlight lang="python"> /* USER CODE BEGIN 2 */ HAL_UART_Transmit_IT(&huart1, (uint8_t *)aTxStartMessage, sizeof(aTxStartMessage)); HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10); /* USER CODE END 2 */</syntaxhighlight> <code style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; color: rgb(0, 130, 0) !important; font-size: 1em !important; background-color: inherit;"> </syntaxhighlight> <syntaxhighlight lang="python"> 在main.c文件后面添加中断接收完成回调函数。中断回调函数中将接收到的数据又通过串口发送回去。 </syntaxhighlight> <syntaxhighlight lang="python"> <syntaxhighlight lang="python"> /* USER CODE BEGIN 4 */ /** * @brief Rx Transfer completed callbacks * @param huart: uart handle * @retval None */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ UNUSED(huart); /* NOTE : This function should not be modified, when the callback is needed, the HAL_UART_RxCpltCallback can be implemented in the user file */ HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF); } /* USER CODE END 4 */</syntaxhighlight> 编译程序并下载到开发板。用USB线连接开发板到电脑,在电脑上打开串口调试助手。选择对应的串口号,设置波特率为115200。按下复位按键会接收到aTxStartMessage数组的数据。通过串口助手发送10个字符,串口助手回显示发送的数据。注意:串口要发够10个字符串,才会触发中断。少于10个字符则不会触发中断,串口不会显示发送的数据。超过10个字符,串口只会发送10个字符回来显示。</syntaxhighlight></code> [[File:114755yqjq4hon6oh4zd3h.png]] 串口不定长接收程序:<a class="attach" href="portal.php?mod=attachment&id=1211" style="line-height: 1.8em;" target="_blank">USART CMD - 不定长接受.zip
返回至
STM32CubeMX系列教程5:串行通信(USART)
。
导航
导航
首页
最近更改
随机页面
MediaWiki帮助
首页
首页
树莓派
主机
配件包
外壳
键鼠
电源
扩展板
显示屏
墨水屏
摄像模块
通信模块
继电器
电机驱动板
游戏机
产品分类
树莓派
Arduino
micro:bit
STM32
Espressif
WiFi模块
蓝牙模块
无线模块
LoRa模块
4G模块
GSM
GPRS
以太网
导航模块
北斗卫星
GPS
LCD
墨水屏
OLED
摄像头
USB模块
串口模块
RS232
RS485
CAN
传感器
温度模块
湿度模块
气压模块
继电器
电机模块
指纹模块
电平转换
音频模块
编程器
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志