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

1.前情回顾

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

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

2.重定义printf函数

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

配置时钟

串口配置设置波特率为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文件后面添加如下代码

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

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

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

打开stm32f1xx_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函数前面添加两个数组变量。

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

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

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

上面是指定数据长度接收,而且中断接收函数放在while外面只能接受一次。接下来实现串口+DMA+空闲中断接收不定长数据。

本章节文档:https://download.csdn.net/download/zdw6868/10655193

配置如下,其他配置跟上面一样

添加应用程序

Usart.h中

Usart.c

Stm32f1xx_.c

Main.c

编译程序并下载到开发板。

STM32Cube-USART相关推荐

  1. STM32Cube中usart的使用

    篮球组运动组任务(12.29到1.7任务) 理论学习: (可以多复习一下C语言的指针,数组和结构体) 1.了解STM32的usart基本原理 2.了解在STM32Cube中如何使用usart和参数的设 ...

  2. 【STM32Cube】学习笔记(二):超声波传感器

    文章目录 摘要 一.简介 1.超声波 2.超声波测距原理 3.HC-SR04超声波测距模块 3.输入捕获原理 二.硬件电路设计 三.软件设计 1.CubeMX配置 2.CubeIDE代码 3.结果显示 ...

  3. 精雕细琢见真章《STM32Cube高效开发教程》

    我们编写的新书<STM32Cube高效开发教程(基础篇)>终于在各大电商平台上架销售了,这是值得众多STM32开发者入手的一本新书,它是目前市面上第一本采用STM32CubeMX和STM3 ...

  4. 【STM32Cube笔记】11-中断控制器NVIC

    [STM32Cube笔记]系列文章目录 1-基于STM32的VSCode入门级教程前言 2-STM32Cube安装教程 3-STM32CubeIDE汉化 4-STM32Cube配置时钟设置 5-跑马灯 ...

  5. STM32Cube配置等精度测频和测相位差

    标题STM32Cube配置等精度测频和测相位差 一.测量精度: 1.频率精度 频率测量.周期测量的信号频率范围扩展为1Hz-20MHz(这里由于信号发生器最高产生20MHz频率,所以更高频率未尝试,预 ...

  6. 【STM32Cube】学习笔记(六):DHT11温湿度传感器

    文章目录 摘要 一.简介 1.DHT11数字温湿度传感器 2.DHT11性能参数 2.DHT11数据结构 2.DHT11传输时序 二.硬件电路设计 1.模块内部电路 2.与单片机相连接电路 三.软件设 ...

  7. 1、STM32CubeMX和STM32Cube库(HAL)详细介绍

    目录 前言 STM32Cube生态 STM32Cube 是什么? STM32Cube 软件工具套件 STM32Cube Embedded 软件 STM32CubeMX ​编辑 前言 也许大家在学习正点 ...

  8. STM32Cube的串口实战(一)GPS+BD模块

    串口系列 STM32Cube的串口设置(一)即学即用 STM32Cube的串口设置(二)一个串口接收另一个串口发送 通过串口设置之前的部分大家应该基本会使用多个串口配合了,今天就来找个东西练练手,第一 ...

  9. 【STM32Cube】学习笔记(三):六轴传感器

    文章目录 摘要 一.简介 1.I2C原理 2.MPU6050介绍 3.MPU6050寄存器介绍 4.DMP使用 二.硬件电路设计 三.软件设计 1.CubeMX配置 2.CubeIDE代码 3.结果显 ...

  10. 一文弄通STM32F103基于simulink自动代码生成CAN/USART/GPIO/TIM(stm32cubemx+stm32target+matlab2018b)

    一文弄通STM32F103基于simulink自动代码生成CAN/USART/GPIO/TIM(stm32cubemx+stm32target+matlab2018b) 写在前面 1.stm32cub ...

最新文章

  1. FAQ宝典之常见问题排查与修复方法
  2. 文献管理工具mendeley登录问题
  3. c#实现对sqlserver的增删改操做 1117
  4. LeetCode每日一题——两数之和
  5. matlab中求雅克比矩阵的方法及cov函数的用法,协方差矩阵—Hessian矩阵—正定矩阵
  6. 中国书法之美 No。2017-08-30
  7. 时域,频域与傅立叶变换 - 慕水 - CSDNBlog
  8. 图解通信原理与案例分析-2:如何用电信号来表示和传输0和1,远远比我们想象的要复杂得多
  9. 怎样检测和应对数据集的Outliers
  10. 如何使用纯 CSS(border-radius 和 clip)属性画出半圆
  11. 递归中的return
  12. QT 图片浏览器(一)
  13. Container is running beyond physical memory limits
  14. [hbase] hbase写操作时对wal和memstore的操作顺序
  15. 【知识整理】聊聊web app开发的那些事
  16. 第13课 Altium Designer20(AD20)+VESC6.4实战教程:将元器件封装导入到PCB(北冥有鱼)
  17. 透明质酸改性乳清白蛋白/肌白蛋白/豆清白蛋白/蓖麻蛋白/豌豆白蛋白1b ( PA1b)纳米粒HA-PA1b
  18. 国产数据库神通下载安装使用jdbc
  19. 在notepad++中安装jslint插件
  20. C/C++固定位宽类型

热门文章

  1. 华尔街借助软件甄别忠诚员工
  2. python 端口扫描 东京_GitHub - w2n1ck/portscan: 一个基于Python+Go的端口扫描及服务探测脚本...
  3. 云开发(微信-小程序)笔记(五)----云函数,就这(上)
  4. 绿盟赛—鲲鹏计算平台软件移植
  5. ***杂记-2013-07-13
  6. C-------------使用scanf输入字符串的故事;
  7. Python飞机大战两个问题, 1.字体font 2.import路径
  8. 单片机基础知识之定时计数器和寄存器
  9. win7计算机iis,Win7系统怎么打开iis功能?Win7系统打开iis功能的方法
  10. 远程办公:在外随时远程控制公司电脑