stm32通过串口(轮询,中断,DMA)发送信息来控制单片机(hal库+cubemx)

ps:1,本人是一位大一新生,初入大学才接触单片机,在上学期间自学了一些,写这篇文章为了记录一下自己的经历,也想帮助别人更快入门。有错误希望大佬们指正!

        2,本文更偏向于操作教学而非原理,想了解原理的小伙伴可以单独搜索。

(看懂本文需要大家先下载keil5,stm32cubemx。大家也要了解一下他们的用法。还要有一点c语言基础哦。)

(这个教学非常简单基础,大家学会了也不要骄傲哦。)

那下面我们直接开始:

一,cubemx基础配置。

1,首先,我们打开cubemx创建一个新项目。(这里我使用的是stm32f401ccu6)

先搜索我们的单片机型号,然后双击进入。

2,点进project manager栏,输入我们的项目名称,然后因为我们用keil5开发,所以下方改成MDK ARM,后面的版本号我们不用更改。

3,选择code generalor栏,然后更改为只复制必要文件(避免生成文件过大)还有单独生成.c和.h文件。

4,然后点进时钟树,将HCLK改为最大。

5,回到初始页面,点进rcc,开启高速晶振。

6,点进SYS,开启外部晶振。到此我们的基础工作全部做完,已经可以开始编写我们自己的东西了。

二,串口设置。

1,点进connectivity,然后选择串口1,选择异步通信,可以看到我们的PA9和PA10被自动配置了,这里我们默认的波特率是115200,现在不用更改。

然后我们可以点击GENERATE CODE生成代码然后进入。

三,代码部分。

关于keil5的配置就不赘述了,我们直接看代码。(这次操作全部在main.c这个主函数下进行)

1,为了让单片机接收我们发送的消息,我们需要先定义一个uint8_t来接收。

2,我们使用的HAL库对串口的最常用函数有:

(1)HAL_UART_Receive用于串口数据接收。

(2)HAL_UART_Transmit用于串口数据发送。

因此我们不妨直接在while(1)里写如下代码。

编译下载,然后打开串口助手调试,看到单片机正常回复了我们的信息,说明我们的测试成功了。

串口的基本操作其实已经实现了。在往后的代码编写中,我们只需要用接收函数接收,然后用if循环语句来控制接收每个数据后做出的反应,从而可以控制单片机的各种行为。

四,中断和DMA:

因为我们的串口一般是配合其他各种东西在一个单片机上起作用,而串口的轮询模式对cpu的占用太大,因而我们可以选择中断模式和DMA模式来使用串口接收和发送,达到更好的效果。

1,中断模式:我们先在cube中打开串口中断,然后生成代码。

2,我们只需要在我们的函数后面加上_IT即

HAL_UART_Receive_IT

HAL_UART_Transmit_IT

然后去掉括号最后部分的时间

再使用即可。

效果是差不多的(会疯狂给你发送你发给他的东西,虽然没什么影响)

但是如此对cpu占用还是大,我们需要一种更好的方式,那就是DMA。(没了解过的朋友们可以去了解一下,相当于一个信息搬运工)

配置DMA首先我们回到cubemx,点进串口配置界面,打开DMA配置,然后为串口的接收和发送都开启一个DMA通道,其他配置不用我们改。然后生成代码。

回到代码界面

我们在main函数外重新调用一个函数void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)串口中断回调函数(开始中断也可以在这个函数下写)

然后将我们写的代码移转到这个函数下。将

HAL_UART_Receive_IT

HAL_UART_Transmit_IT

改成

HAL_UARTEx_ReceiveToIdle_DMA

HAL_UART_Transmit_DMA

运用这个,我们也可以摆脱中断的限制,让串口接收不同长度的数据。

可以将开头的定义改的稍大一点,如uint8_t receivedate[50],然后我们在主函数中接收一次,剩下的写在回调函数中。(为了在多个串口使用时辨认出是串口一的数据,可以在此前加上一个串口判断即如图)

编译下载,然后看结果

这就说明我们成功了。你学会了吗?

看一个通过串口控制的灯捏(随手搓的,勿喷)

led

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值