keil接收别人发的工程打不开_STM32Cube08 | 使用USART发送和接收数据(DMA模式)

b1d0bb8093440aa497dc86c33a6bc300.png 更多精彩~点击上面蓝字关注我们呀!  89c2b7a0364b610a017eb700b44489eb.png

寻求更好的阅读体验,请点击阅读原文移步:Mculover666的个人博客。

本篇文章主要介绍如何使用STM32CubeMX初始化STM32L431RCT6的USART,并使用DMA模式发送数据和接收数据。

1. 准备工作

硬件准备

  • 开发板
    首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi):

6286b230b41010711c57fa0e06a7f4b9.png

软件准备

  • 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码;

  • 准备一个串口调试助手,这里我使用的是Serial Port Utility

Keil MDK和串口助手Serial Port Utility 的安装包都可以在文末关注公众号获取,回复关键字获取相应的安装包:

fefc44dd562b04e9995445ed769a08bf.png

2.生成MDK工程

选择芯片型号

打开STM32CubeMX,打开MCU选择器:

c29b554b9059608b4c00b7ec92f95dea.png

搜索并选中芯片STM32L431RCT6:

686bc24de8fb54c46407d7d28cb2112e.png

配置时钟源

  • 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;

  • 如果使用默认内部时钟(HSI),这一步可以略过;

这里我都使用外部时钟:

c3443ce6c8c0f6f5c95bdd383107e97b.png

配置串口

小熊派开发板板载ST-Link并且虚拟了一个串口,原理图如下:

dec60f0fd41337bede019ab000ab8477.png

这里我将开关拨到AT-MCU模式,使PC的串口与USART1之间连接。

接下来开始配置USART1

8cba8c0e78f8446d7577c355c662cb89.png

USART DMA配置

DMA

DMA 全称 Direct Memory Access(直接存储器访问), 是STM32的一个外设,它的特点在于:

不占用CPU的情况下将数据从存储器直接搬运到外设,或者从外设直接搬运到存储器,当然也可以从存储器直接搬运到存储器。

比如在需要串口发送大量数据的时候,CPU只需要发起DMA传输请求,然后就可以去做别的事情了,DMA会将数据传输到串口发送,DMA传输完之后会触发中断,CPU如果有需要,可以对该中断进行处理,这样一来CPU的效率是不是大大提高了?

在STM32L431RCT6中有 2 个 DMA 外设:DMA1 和 DMA2,每个DMA外设有 7 个通道,每个通道都是独立的,配置DMA的时候有几个关键点:

  • 数据从哪里来?

  • 数据到哪里去?

  • 有多少数据?

00548f94e1fcae7847d1a85c98aaf987.png

知识小卡片结束啦

451d844a7319e0d81ce2a2640377b06c.png

接下来我们配置DMA,将存储器(SRAM)中的数据直接搬运到串口外设去发送:

dbecb46ee04d89d95e3303a86c2fd3cc.png

配置时钟树

STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:

32b0d49822f93e94b369099d090332e7.png

生成工程设置

5859e7311d90b9d64847bdb8f1724930.png

代码生成设置

最后设置生成独立的初始化文件:

7ef2709a1df18ab60aca00ee3addf474.png

生成代码

点击GENERATE CODE即可生成MDK-V5工程:

1ea541f8f86d9221776793ec167235ba.png

3. 在MDK中编写、编译、下载用户代码

定义发送数据区域

/* Private user code ---------------------------------------------------------*/

在main函数中发起DMA传输

int main(void){

实验现象

编译下载运行后,实验现象如下:

0db8f5c8c34816324d45b886a0365083.png

4. 使用DMA接收串口数据

说明

  • 使用HAL库的时候不能同时使用DMA发送和接收数据,会出错。

  • 所有的步骤和发送时一样,这里我只给出需要修改的部分。

修改串口DMA配置

80de667e5d859651b0d47ff8cd15681d.png

添加串口接收缓冲区

/* Private user code ---------------------------------------------------------*/

修改main函数

int main(void){

添加串口接收中断回调函数

/* USER CODE BEGIN 4 */

实验现象

a1d6a566f380ed0114fc111b412d5352.png

至此,我们已经学会了如何配置USART使用DMA模式发送数据和接收数据,下一节将讨论实现printf()函数的多种方法。

更多精彩文章及资源,请关注我的微信公众号:『mculover666』。

c8ffa1585f2b0f40e75417f64e079196.png
151436c7ba18b467ca57bdf37f9f0f01.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值