本章以串口为例讲解,HAL 库轮询,中断,DMA 三种编程模型。

1.前情回顾

在串行通信中,一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束。在进行传输之前,双方一定要使用同一个波特率设置。波特率就是每秒钟传输的数据位数。

常用的两种基本串行通信方式包括同步通信和异步通信。我们通常使用的是异步通信.异步通信规定传输的数据格式由起始位(start bit)、数据位(data bit)、奇偶校验位(parity bit)和停止位(stop bit)组成。

2.重定义printf函数。

打开STM32CubeMX新建工程,选择STMF746IGT6芯片,选择外部高速晶振(HSE)。USART1选择为异步通信方式。PA10设置RX接收,PA9设置为TX发送。

配置时钟系统时钟为216MHz,STMF746可以单独配置USART时钟,默认为108Mhz。

串口配置设置波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1.其他参数默认。

生成报告以及代码,编译程序。在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 __io_putchar(intch)函数,否则定义为int fputc(int ch, FILE *f)函数。

/* 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 */

其中HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);这个语句表示通过串口1发个一个字符。ch为字符的存储地址,0xFFFF为超时时间。在stm32f7xx_hal_uart.c文件中可以找到HAL_UART_Transmit函数。

在main.c文件中添加应用函数。

/* 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 */

编译程序并下载到开发板。用USB线连接开发板到电脑,在电脑上打开串口调试助手。选择对应的串口号,设置波特率为115200。按下复位按键会接收到如图信息。

打开stm32f7xx_hal_uart.h头文件,在文件后最后面可以看到有如下操作串口的函数。

串口的发送接收函数:

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在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。

3.中断模式。打开STM32CubeMX重新建工程,配置和前面一样。只是这个工程中,开启了串口中断。

生成报告以及代码,编译程序。在main函数前面添加两个数组变量。

/* 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 */

在main函数中添加两个语句通过串口中断发送aTxStartMessage数组的数据和接收数据10个字符,保存在数组aRxBuffer中。

/* 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 */

在main.c文件后面添加中断接收完成回调函数。中断回调函数中将接收到的数据又通过串口发送回去。

/* 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 */编译程序并下载到开发板。用USB线连接开发板到电脑,在电脑上打开串口调试助手。选择对应的串口号,设置波特率为115200。按下复位按键会接收到aTxStartMessage数组的数据。通过串口助手发送10个字符,串口助手回显示发送的数据。注意:串口要发够10个字符串,才会触发中断。少于10个字符则不会触发中断,串口不会显示发送的数据。超过10个字符,串口只会发送10个字符回来显示。

cubemx stm32 配置两个串口_STM32CubeMX系列教程5:串行通信(USART)相关推荐

  1. cubemx stm32 配置两个串口_STM32CubeMX的串口配置,以及驱动代码

    1.STM32CubeMX的配置没啥子好说的,使能然后改一下波特率和字长,然后在将中断勾选,把中断等级调到1(一定要比systick的优先级垃圾!!!) 2.驱动代码 在生成的it.c文件中,例如用的 ...

  2. stm32cubemx生成不了keil工程文件_STM32CubeMX系列教程03_创建并生成代码工程

    说明: 本文原创作者『strongerHuang』 首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop 标签:STM32. STM32CubeMX. LL库. H ...

  3. cubemx 读卡器_STM32CubeMX系列教程25:USB Device

    本章不打算详细讲解USB的协议,本章只是介绍如何通过STM32CubeMX软件生成应用程序. 在看本教程之前建议先看ST官方关于USB的培训视频,示例 一.USB简介stm32F746系列芯片有USB ...

  4. cubemx stm32 陶晶驰 串口屏 基于YXY通信原理的串口屏驱动代码

    陶晶驰串口屏 资料 陶晶驰串口屏是本质是一个MCU,屏幕是MCU的模块,一般是一块TFT屏幕.在串口屏厂商提供的软件上面编写界面,然后通过串口直接烧到串口屏的MCU上,然后在屏幕上展示出来. 串口屏资 ...

  5. docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器

    不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案. 不同于传 ...

  6. E-puck2机器人系列教程

    E-puck2机器人系列教程 目录 1.E-puck2机器人系列教程-1.开关机 2.E-puck2机器人系列教程-2.LED代表的含义 3.E-puck2机器人系列教程-3.USB调试 4.E-pu ...

  7. freemarker ftl模板_Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

    今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...

  8. 推荐系统系列教程之十六:深度和宽度兼具的融合模型

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十五期,今天按约推出第十六期:深度和宽度兼具的融合模型.希望粉丝朋友们多点"在看",多多转发,我会在&q ...

  9. 推荐系统系列教程之十五:一网打尽协同过滤、矩阵分解和线性模型

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十四期,今天按约推出第十五期:一网打尽协同过滤.矩阵分解和线性模型.希望朋友们多点"在看",多多转发,我 ...

最新文章

  1. python 判断字符串是否包含另一个字符串_强烈推荐:Python字符串(string)方法整理(一)...
  2. CCF201403-1 相反数(100分)
  3. IntelliJ IDEA中Maven插件无法更新索引之解决办法
  4. 在OSGi中为Karaf构建Camel-CXF REST服务–组播和聚合
  5. 4-3:TCP协议之UDP协议
  6. generatorConfig.xml头文件报红
  7. 在单例Bean中依赖原型Bean问题解决
  8. C语言联合体基本内容
  9. 异步编程不会?我教你啊!CompletableFuture(JDK1.8)
  10. js摇号程序_车管所怎么摇号流程及查询
  11. UE4 Slate四 SlateUI如何做动画
  12. 打开excel表格会自动打开一个空表格
  13. Request和Response的概述及其方法
  14. Matlab中隐函数绘制方法
  15. “古董级” 诺基亚功能机跑Linux是怎样的画风?
  16. vue 调用移动录像_Vue 莹石摄像头直播视频实例代码
  17. Testlink使用文档
  18. 我们的天空 - BEYOND
  19. Oracle删除带有默认值的字段
  20. win7打开计算机一片空白,win7系统打开本地连接属性一片空白的解决方法

热门文章

  1. 利用 html 和 css 实现导航栏下拉(display block、display none)
  2. linux发挥不出显卡性能,Ubuntu 9.04 显卡性能不佳问题的解决
  3. 分布式系统:数据库、操作系统、集群、协调、接口、多处理器、共享、I/O
  4. DPDK examples cmdline完全注释(添加quit功能)
  5. 外链引入css有哪些方式_CSS 文件的4种引入方式
  6. python修饰符用法_c#教程之C#语言中的修饰符汇总
  7. Spring在tomcat下使用JTA事务
  8. php 5.4.39 安装,Lamp 安装(CentOS6.6, php-5.4.39, httpd-2.4.12, mysql-5.6.24)
  9. wsl Java开发_微软开源 WSL 样本,在 Windows 上体验 Linux
  10. dev控件调用html页面,Chrome开发工具 扩展 DevTools