【CubeIDE】STM32 HAL库史上最详细教程(一):UART串口收发

博主能力有限,有错误望大佬指出
  

0x00 文章内容:

  1. UART阻塞方式收发
  2. UART中断方式收发
  3. UART中断回调函数
  4. UART DMA方式收发
  5. printf()函数串口重定向

0x01 UART阻塞方式收发

CubeMX or CubeIDE配置

1.开启debug
在这里插入图片描述
2.使用外部晶振
    如果你的板子上没有晶振的话,就不要开了,不然stm32跑不起来
在这里插入图片描述
时钟配置(根据自己板子上的晶振频率酌情设置)
在这里插入图片描述

注: HSE:外部高速晶振        LSE:外部低速晶振

3.设置USART1为异步模式,无硬件流控
在这里插入图片描述
4.设置参数
在这里插入图片描述
5.生成代码
    快捷键:Alt+K 或者 点图中的小齿轮
在这里插入图片描述
我们已经完成了基本配置并生成了初始化代码

UART阻塞方式收发

接下来学习UART阻塞方式发送数据
1.编写代码
    打开main.c
在这里插入图片描述
添加要发送的字符串
在这里插入图片描述
先看一下要用到的函数
在这里插入图片描述
    可以看到,这个函数一共有四个参数,
    第一个参数是要使用的串口句柄地址,比如要使用U(S)ART1,参数就设置为U(S)ART1的句柄地址&huart1
    第二个参数是要发送的数据缓冲区首地址
    第三个参数是发送的数据长度,这里可以直接用sizeof()函数获取发送缓冲区的长度
    第四个参数是超时时间,单位是ms,如果超过设置的时间,则函数返回HAL_TIMEOUT,如果设置为HAL_MAX_DELAY,处理器就会一直等到数据发送完成再执行下一条语句。

2.使用函数
在main.c的while循环中添加代码
在这里插入图片描述

3.烧录运行
   连接stlink/jlink到板子
   连接USB/TTL到板子上,rx,tx分别接stm32板子上tx,rx
   然后点图中的绿色三角 或者 按下快捷键R+R

在这里插入图片描述
如果一切正常的话,就会看到
在这里插入图片描述
然后用串口助手打开TTL的端口就可以看到
ps:如果没有串口助手可以点这个链接下载sscom v5.13
在这里插入图片描述

我们已经完成了UART阻塞方式发送数据

再尝试一下UART阻塞方式接受数据

1.需要学习的函数
在这里插入图片描述
    同HAL_UART_Transmit()函数一样,这个函数也有四个参数
    第一个参数是要使用的串口句柄地址,比如要使用U(S)ART1,参数就设置为U(S)ART1的句柄地址&huart1
    第二个参数是接受数据的缓冲区首地址
    第三个参数是接受的数据长度,这里可以直接用sizeof()函数获取接受缓冲区的长度
    第四个参数是超时时间,单位是ms,如果超过设置的时间,则函数返回HAL_TIMEOUT,如果设置为HAL_MAX_DELAY,处理器就会一直等到接受到设置好的数据数量再执行下一条语句。

目标:将接受到的数据发送回主机

2.编写代码

    设置好接收缓冲区

    Tip:接受缓冲区长度可以大于要接受数据的长度,但是不能小于要接受的数据长度。
在这里插入图片描述
在while()编写业务代码

在这里插入图片描述

3.烧录测试
    连接好TTL和stlink

    快捷键R+R下载

一位16进制数正好是4bit,所以两位16进制正好是1byte(8bit)
我设置的缓冲区类型是uint8_t(8bit),长度是4
所以我要发送8位16进制数正好填满缓冲区
ps:串口助手要打开HEX发送和HEX接收
在这里插入图片描述

效果
在这里插入图片描述

串口printf()重定向

使用HAL_UART_Transmit发送字符串很不方便
可以重定向printf()函数使printf通过串口打印字符串
上代码

#include "stdio.h"

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

编写业务代码
在这里插入图片描述
效果

在这里插入图片描述

UART中断方式收发

1.CubeMX/CubeIDE 图形化配置

使能USART1 全局中断

在这里插入图片描述
2.需要学习的函数

中断方式发送函数
在这里插入图片描述
中断方式接受函数
在这里插入图片描述
中断方式的收发函数只有三个参数
第一个参数时要使用的串口句柄地址
第二个参数是发送/接受缓冲区的首地址,用于存放要发送/接收的数据
第三个参数是发送/接受缓冲区长度

前三个参数和阻塞方式完全一致,为什么没有超时时间了呢?
因为中断(IT)方式配置完成寄存器之后不需要再占用CPU,会在接受完成后触发中断。

    阻塞方式就好比你要拿快递,就一遍遍都前台询问快递到没到,在这期间你不能干别的,
中断方式是你告诉前台快递到了给你打电话,在这期间你是可以腾出身子来干别的事情。

由此可见,中断方式效率大于阻塞方式,极端情况下,中断方式的安全性也高于阻塞方式

接收中断回调函数
在这里插入图片描述
顾名思义,该函数是当中断方式串口接收触发中断(接收完成)所调用的函数

    该函数的返回值为__weak,表示这个函数需要用户自己去编写,最终会执行用户所自行编写的回调函数(如果用户不编写,也会执行自带的回调函数,只不过自带的HAL_UART_RxCpltCallback()函数是空函数,所以等同于什么也没有做)

注意:用户自行编写的回调函数返回值不能为__weak。

会有同学问,有没有发送中断回调函数呢?

答案是,有的,但是直接把发送完要执行的语句写到发送语句的后面不就好了吗T^T

3.代码编写

目标:

  1. 使用HAL_UART_Receive_IT()函数接受指定数量的数据存到指定缓冲区;
  2. 编写接受回调函数,回调函数作用是当回调函数被执行后判断是否是usart1所触发的中断,如果是,就使用HAL_UART_Transmit_IT()函数给主机发送指定内容的应答数据。

动手操作:

声明一个接受缓冲区(Rxbuf)和应答数据(ACKbuf)
在这里插入图片描述
main()中编写业务代码
在这里插入图片描述
重写回调函数
在这里插入图片描述
4.烧录测试
    快捷键R+R或者点绿色小三角烧录
效果:
在这里插入图片描述

DMA方式串口收发

1.什么是DMA

知识拓展链接:百度-DMA

    前文说过中断方式就好比你告诉前台,等快递到了给你打电话,让你亲自来取,假设你正在做着一些重要的事情,正好来了电话让你取快递,这样一来就会耽误事。
     这怎么办呢?雇个保姆不就好了吗,DMA就好比这个保姆,你告诉她在哪里取快递,她就会等快递到了之后自己帮你把快递拿回家。

2.软件配置(一定要看图啊)
在这里插入图片描述
3.需要学习的函数

    DMA方式串口发送函数
在这里插入图片描述

该函数一共有三个参数
参数类型和中断类型串口发送函数一样,不再赘述

    DMA方式串口接收函数
在这里插入图片描述

该函数一共有三个参数
参数类型和中断类型串口发送 函数一样,不再赘述

3.代码编写
任务:
    使用DMA方式串口收发方式进行回环测试

声明一个缓冲区
在这里插入图片描述
编写业务代码
在这里插入图片描述
编写中断回调函数:

    注意:UART一旦开启DMA之后,DMA收发中断都是强制开启的,所以DMA收发函数也可以编写回调函数。
在这里插入图片描述
4.烧录测试
    快捷键R+R或者点绿色小三角烧录

效果:
在这里插入图片描述
拒绝白嫖,点个赞吧

### 回答1: Elasticsearch 是个基于 Lucene 的搜索引擎,可以用来存储、搜索和分析大量的数据。以下是些常用的 Elasticsearch 查询语句: 1. 简单查询:match 和 term - `match` 查询会搜索指定字段中包含指定文本的所有文档。例如: ``` GET /index/_search { "query": { "match": { "title": "elasticsearch" } } } ``` - `term` 查询会搜索指定字段中包含指定词条的所有文档。例如: ``` GET /index/_search { "query": { "term": { "status": "published" } } } ``` 2. 复合查询:bool 和 must/should/must_not - `bool` 查询可以将多个查询条件组合在起。例如: ``` GET /index/_search { "query": { "bool": { "must": [ { "match": { "title": "elasticsearch" } }, { "match": { "content": "search" } } ] } } } ``` - `must` 查询要求查询结果必须满足指定条件。例如: ``` GET /index/_search { "query": { "bool": { "must": [ { "match": { "title": "elasticsearch" } }, { "term": { "status": "published" } } ] } } } ``` - `should` 查询要求查询结果应该满足指定条件之。例如: ``` GET /index/_search { "query": { "bool": { "should": [ { "match": { "title": "elasticsearch" } }, { "match": { "content": "search" } } ] } } } ``` - `must_not` 查询要求查询结果不能满足指定条件。例如: ``` GET /index/_search { "query": { "bool": { "must_not": [ { "term": { "status": "draft" } } ] } } } ``` 3. 范围查询:range - `range` 查询可以搜索指定字段中的数值或日期范围。例如: ``` GET /index/_search { "query": { "range": { "price": { "gte": 10, "lte": 100 } } } } ``` 4. 全文查询:match_phrase 和 match_phrase_prefix - `match_phrase` 查询要求查询结果必须包含指定短语。例如: ``` GET /index/_search { "query": { "match_phrase": { "title": "elasticsearch query" } } } ``` - `match_phrase_prefix` 查询要求查询结果必须包含指定前缀的短语。例如: ``` GET /index/_search { "query": { "match_phrase_prefix": { "title": "elasticsearch que" } } } ``` 以上是些常用的 Elasticsearch 查询语句,还有很多其他类型的查询和参数可以使用。详细的文档可以参考 Elasticsearch 官方文档。 ### 回答2: Elasticsearch是个高性能的分布式全文搜索和分析引擎,可以用于快速地存储、搜索和分析大量数据。Elasticsearch使用标准的JSON格式来操作数据,查询语句也是用JSON格式表示。 在Elasticsearch中,查询语句通过HTTP请求发送给Elasticsearch服务器。查询语句可以包含多个条件和过滤器,以实现灵活的搜索和过滤。以下是些常用的查询语句示例: 1. 匹配查询(Match Query):通过指定个字段和个值来进行匹配。例如,{"match": {"title": "apple"}}将返回包含"title"字段中包含"apple"的文档。 2. 多字段查询(Multi Match Query):可以在多个字段中搜索相同的值。例如,{"multi_match": {"query": "apple", "fields": ["title", "description"]}}将在"title"和"description"字段中搜索包含"apple"的文档。 3. 范围查询(Range Query):根据某个字段的值的范围进行搜索。例如,{"range": {"price": {"gte": 10, "lte": 100}}}将返回"price"字段值在10到100之间的文档。 4. 过滤查询(Filtered Query):可以将个查询结果再次过滤。例如,{"filtered": {"query": {"match": {"title": "apple"}}, "filter": {"term": {"category": "fruit"}}}}将返回标题包含"apple"并且类别为"fruit"的文档。 5. 分组查询(Aggregations):可以根据某个字段对结果进行分组和统计。例如,{"aggs": {"group_by_category": {"terms": {"field": "category"}}}}将按照"category"字段对结果进行分组。 以上只是些查询语句的简单示例,Elasticsearch还提供了更多丰富的查询语法和功能,如模糊查询、排序、分页等。根据具体需求,可以结合这些功能来构建更复杂和高效的查询语句。 ### 回答3: Elasticsearch是个强大的分布式搜索和分析引擎,可以通过查询语句对其进行检索。以下是关于Elasticsearch查询语句的简要介绍: 1. match查询:match查询是基于文本匹配的简单查询,它会根据查询条件返回匹配的文档。 2. term查询:term查询用于精确匹配个字段的值,不进行分词处理。 3. range查询:range查询用于匹配个范围内的字段值,可以设置上限和下限。 4. bool查询:bool查询是个复合查询,可以组合多个条件查询,并设置逻辑关系(AND、OR、NOT)。 5. wildcard查询:wildcard查询可以使用通配符进行模糊匹配。 6. prefix查询:prefix查询用于匹配以指定前缀开头的文档。 7. match_phrase查询:match_phrase查询可以匹配与查询条件完全匹配的文档,而不是仅仅匹配其中的个词。 8. fuzzy查询:fuzzy查询用于模糊匹配,可以处理拼写错误。 9. exists查询:exists查询用于检查某个字段是否存在于文档中。 10. match_all查询:match_all查询可以匹配所有文档,常用于获取全部文档。 以上是些常用的Elasticsearch查询语句,通过它们可以对文档进行灵活和高效的搜索。同时,Elasticsearch还支持更多复杂的查询语句和特性,可以根据实际需求进行定制化查询。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值