当前位置首页视频解说10部迷雾重重的侦探日剧,每部都在燃烧你的cpu
10部迷雾重重的侦探日剧,每部都在燃烧你的cpu

推理剧一直是人们喜欢的类型之一,不仅考验观众的智商,还能给人带来紧张刺激的观剧体验。以下精选5部推理剧,让观众们在看剧的同时也能体验推理的魅力。《绅士刑警》以互动式的方式呈现案件过程,让观众先了解案件的经过,再让主角找破绽破案,相比传统的推理剧变得更为新颖。田村叔游刃有余的风范,让人印象深刻。同时,演员阵容也非常出色,不仅有美女帅哥云集,更是演技出众,让剧情更为引人入胜。《金田一少年事件簿》的案件难度和可看性非常高,主人公金田一的形象也很有爷爷的风范。每个案子都堪比柯南经典大案子,推理比柯南高级点,更有恐怖氛围。

尤其是高强度出现的暴风雪山庄和孤岛模式小单元,让人看得非常过瘾。单集案情可爱,剧情复杂并且有反转,非常精彩。《神探伽利略》以科学破案为特色,剧情不仅有趣,而且引人入胜。作为一位特立独行、不食人间烟火的科学怪咖,伽利略出手破案,用多学科知识揭开那些不可能发生事件背后的真相。每一集都需要找点物理相关知识,虽然编剧不易,但案子都非常有意思。演员演技的化学作用非常强,让这部剧成为观剧体验十分良好的作品。《勿言推理》虽然有些瑕疵,但依然展现出了整部剧的精彩。最后两集的时间线穿插非常巧妙。

整部剧吸引人的不仅是推理,更是阿整丰富的内心世界和治愈又令人回味的言语。主角以妹妹的消逝为线索收集信息,展开调查,让两个人对彼此人格的吸引和信任体现得淋漓尽致。菅田将晖的演技非常不错,反转和无厘头搞笑也非常精彩。《大川端侦探社》充满了烟雾缭绕的氛围,阴暗诡谲的气氛,让人难以忘怀。每一集都是一个独立的故事,描绘着不同的众生相。剧中的配乐、背景等设置非常用心,越看越能感受到它的舒适感。虽然每个故事都有点套路,但却非常抓人,让人感到温暖。总之,这5部推理剧各有特色,虽然都强调推理元素,但是也各自注重情感、氛围以及演员的表演。

对于喜欢推理剧的观众来说,这5部作品可以满足观众对于推理剧的不同需求。最后,如果你必须选择一部,你会选择哪一部呢?今日头条:探案剧Top 5,氛围优秀,剧情精彩,让你惊喜连连!在海量的探案剧中,有五部剧集在氛围和剧情上脱颖而出,给观众带来了极大的惊喜。这些剧集或许在推理上稍显薄弱,但却在日常生活和感情线上写得温柔动人。今天,我们就来一一介绍这五部引人入胜的探案剧。排名第六的是《掟上今日子的备忘录》。这部剧兼具悬疑和纯爱的元素,让人沉浸在推理和感情的交织之中。每集都有一个小故事,其中第七集中推理小说家以配角的形式出场,让整个故事更具浪漫情怀。

最后,厄介对今日子说:“无论你忘记多少次,我都会重新爱上你”,令人感动不已。第七名是《SPEC》。这部剧以主演户田惠梨香的独特气质为特点,虽然推理逻辑稍显薄弱,但节奏和设定都不错。女主角是一个聪明而古灵精怪的人物,她的神经大条和非正常行为让人喜欢。剧中还有许多搞笑点,给观众带来了一种漫画般的即视感。第八名是《灵媒侦探城塚翡翠》。这是一部轻松的探案剧,最后一集的反转令人惊喜。剧中的几位主要角色演技出色,不会让观众产生出戏的感觉。尤其是第五集中翡翠的逻辑推理,令人印象深刻。女主角清源果耶的漂亮可爱也吸引了观众的注意。第九名是《圈套》。

这部剧在破案上主要依靠女主角魔术师的能力,同时取景和音效也很独特。虽然推理逻辑不够严密,但剧中的冷幽默和无厘头风格令人捧腹大笑。女主演员仲间由纪惠姐姐在这个角色中完美呈现了她神经大条的一面,令人眼前一亮。最后一部是《脑神探》。这部剧在每集的反转上做得非常出色,而且密集。剧中的案件设计也很不错,每集都有豪华大咖女演员的精彩表演。整部剧以当时的眼光看,破案手法新颖,覆土风格建筑也很时尚。这五部探案剧各具特色,虽然推理元素不是最突出的部分,但其氛围和剧情却让观众难以忘怀。它们带给我们的不仅仅是惊喜和欢乐,更是对当下生活的一种思考。

探案剧中的推理和解谜,正如生活中的种种困难和挑战,我们需要勇敢面对,积极应对。探案剧不仅仅是娱乐,它们也带给我们一些启示和思考。在每个小故事中,我们能够看到人性的光辉和黑暗,看到生活的真实和虚幻。这些剧集让我们明白,不要等到明天,活好每一个今天才是最重要的。在你看过的这些探案剧中,你最喜欢的是哪一部呢?它们给你带来了怎样的感受和启示?探案剧中的人物和故事是否能够给你带来一些思考?欢迎留言分享你的看法和观点!脑科学,你了解多少?脑科学是研究人类大脑的结构和功能的一门学科。

在这个信息爆炸的时代,我们对大脑的了解越发深入,对于我们的生活也越发重要。那么,你知道人类大脑的结构有哪些吗?又知道大脑的功能是如何实现的吗?最近,一部充满好奇心的男主角的科普脑科学电影引起了我的兴趣,他的不正经与好奇心使得僵硬的脑科学知识活化了。这让我想到了另一种充满悬疑和好奇心的剧集——侦探日剧。这些剧集中,每一部都是迷雾重重,让你的CPU不断燃烧。今天,我们就一起来了解一下这些侦探日剧吧。首先,我们来了解一下人类大脑的结构。人类大脑主要包括大脑皮层、边缘系统和脑干。大脑皮层是大脑最外层的一层,控制着人类的认知和思维能力。

边缘系统包括海马体、杏仁核、下丘脑等部位,主要负责情感和记忆等功能。脑干控制着人类的基本生命活动,例如呼吸和心跳等。那么,大脑的这些结构又是如何实现各种复杂的功能的呢?这就要涉及到神经元和突触传递的机制了。神经元是神经系统的基本单元,通过突触与其他神经元联系在一起,形成神经回路,实现各种功能。突触传递的机制主要包括化学和电学传递两种方式,化学传递主要是通过神经递质来实现,电学传递则是通过神经元本身的电信号传递来实现。通过对大脑的结构和功能的了解,我们可以更好地理解人类的思维和行为,甚至可以帮助我们更好地应对一些疾病和心理问题。

而这些都离不开科学家们的不断探索和研究。除了脑科学,侦探日剧也是让我着迷的一种艺术形式。这些剧集往往都充满了悬疑和推理,让观众们跟随剧情一同寻找真相。其中,有一部叫做《名侦探柯南》的动画剧集,已经播出了超过1000集,以小学生柯南为主角,通过推理破案的方式吸引了大量的粉丝。此外,还有一部叫做《半泽直树》的剧集,讲述了一个正直的银行职员与贪污的上司斗争的故事,深受观众的喜爱。侦探日剧的成功离不开剧情的设计和演员的表演。在这些剧集中,经常会出现各种离奇的案件和犯罪,这就需要剧情的设计者们有足够的想象力和推理能力。

同时,演员们也需要有出色的表演和演技,才能让观众们完全沉浸在剧情中。总之,脑科学和侦探日剧都是让人着迷的领域。通过对大脑的了解,我们可以更好地理解自己和世界,而侦探日剧则可以让我们在推理和寻找真相的过程中感受到无穷的乐趣。那么,你最喜欢的侦探日剧是哪一部呢?你又是如何看待脑科学的呢?欢迎在评论区和我们分享你的观点。

已完结

10部迷雾重重的侦探日剧,每部都在燃烧你的cpu

类型:动作 微电影 枪战 印度 2000 

主演:史蒂夫·蒂英楚 Rasmane Ouedraogo Issaka Sa 

导演:陈枫 

剧情简介

「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验

1)实验平台:【正点原子】 NANO STM32F103 开发板

2)摘自《正点原子STM32 F1 开发指南(NANO 板-HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子

第二十二章 DMA 实验

本章我们将向大家介绍 STM32F1 的 DMA。在本章中,我们将利用 STM32F1 的 DMA

来实现串口数据传送,并在串口助手打印显示。本章分为如下几个部分:

22.1 STM32F1 DMA 简介

22.2 硬件设计

22.3 软件设计

22.4 下载验证

22.1 STM32 DMA 简介

DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 传输将数据从一个

地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由

DMA 控制器 来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的

内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工

作。DMA 传输对于高效能嵌入式系统算法和网络是很重要的。DMA 传输方式无需 CPU 直接

控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备

开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。

STM32 最多有 2 个 DMA 控制器(DMA2 仅存在大容量产品中,中容量只有 DMA1),DMA1 有 7

个通道。DMA2 有 5 个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。

还有一个仲裁起来协调各个 DMA 请求的优先权。

STM32 的 DMA 有以下一些特性:

●每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件触发。这些功能

通过软件来配置。

●在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如

在相等优先权时由硬件决定(请求 0 优先于请求 1,依此类推) 。

●独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和

目标地址必须按数据传输宽度对齐。

●支持循环的缓冲器管理

●每个通道都有 3 个事件标志(DMA 半传输,DMA 传输完成和 DMA 传输出错),这 3 个

事件标志逻辑或成为一个单独的中断请求。

●存储器和存储器间的传输

●外设和存储器,存储器和外设的传输

●闪存、SRAM、外设的 SRAM、APB1 APB2 和 AHB 外设均可作为访问的源和目标。

●可编程的数据传输数目:最大为 65536

STM32F103RBT6 有一个 DMA 控制器,DMA1,本章,我们仅针对 DMA1 进行介绍。

从外设(TIMx、ADC、SPIx、I2Cx 和 USARTx)产生的 DMA 请求,通过逻辑或输入到

DMA 控制器,这就意味着同时只能有一个请求有效。外设的 DMA 请求,可以通过设置相应的

外设寄存器中的控制位,被独立地开启或关闭。

表 22.1.1 是 DMA1 各通道一览表:

这里解释一下上面说的逻辑或,例如通道 1 的几个 DMA1 请求(ADC1、TIM2_CH3、TIM4_CH1),

这几个是通过逻辑或到通道 1 的,这样我们在同一时间,就只能使用其中的一个。其他通道也

是类似的。

这里我们要使用的是串口 1 的 DMA 传送,也就是要用到通道 4。接下来,我们介绍一下 DMA

设置相关的几个寄存器。

第一个是 DMA 中断状态寄存器(DMA_ISR)。该寄存器的各位描述如图 22.1.1 所示:

图 22.1.1 DMA_ISR 寄存器各位描述

我们如果开启了 DMA_ISR 中这些中断,在达到条件后就会跳到中断服务函数里面去,即使

没开启,我们也可以通过查询这些位来获得当前 DMA 传输的状态。这里我们常用的是 TCIFx,

即通道 DMA 传输完成与否的标志。注意此寄存器为只读寄存器,所以在这些位被置位之后,只

能通过其他的操作来清除。

第二个是 DMA 中断标志清除寄存器(DMA_IFCR)。该寄存器的各位描述如图 27.1.2 所示:

图 22.1.2 DMA_IFCR 寄存器各位描述

DMA_IFCR 的各位就是用来清除 DMA_ISR 的对应位的,通过写 0 清除。在 DMA_ISR 被置位后,

我们必须通过向该位寄存器对应的位写入 0 来清除。

第三个是 DMA 通道 x 配置寄存器(DMA_CCRx)(x=1~7,下同)。该寄存器的我们在这里就

不贴出来了,见《STM32 参考手册》第 150 页 10.4.3 一节。该寄存器控制着 DMA 的很多相关信

息,包括数据宽度、外设及存储器的宽度、通道优先级、增量模式、传输方向、中断允许、使

能等都是通过该寄存器来设置的。所以 DMA_CCRx 是 DMA 传输的核心控制寄存器。

第四个是 DMA 通道 x 传输数据量寄存器(DMA_CNDTRx)。这个寄存器控制 DMA 通道 x 的每

次传输所要传输的数据量。其设置范围为 0~65535。并且该寄存器的值会随着传输的进行而减

少,当该寄存器的值为 0 的时候就代表此次数据传输已经全部发送完成了。所以可以通过这个

寄存器的值来知道当前 DMA 传输的进度。

第五个是 DMA 通道 x 的外设地址寄存器(DMA_CPARx)。该寄存器用来存储 STM32 外设的地

址,比如我们使用串口 1,那么该寄存器必须写入 0x40013804(其实就是&USART1_DR)。如果

使用其他外设,就修改成相应外设的地址就行了。

最后一个是 DMA 通道 x 的存储器地址寄存器(DMA_CMARx),该寄存器和 DMA_CPARx 差不多,

但是是用来放存储器的地址的。比如我们使用 SendBuf[5200]数组来做存储器,那么我们在

DMA_CMARx 中写入&SendBuff 就可以了。

DMA 相关寄存器就为大家介绍到这里,此节我们要用到串口 1 的发送,属于 DMA1 的通道 4

(表 27.1.1),接下来我们就介绍 HAL 库配置步骤和方法。首先这里我们需要指出的是,DMA

相关的库函数文件在文件 stm32f1xx_hal_dma.c/stm32f1xx_hal_dma_ex.c 以及对应的头文件

中,同时因为我们是用串口的 DMA 功能,所以还要加入串口相关的文件 stm32f1xx_hal_uart.c。

具体步骤如下:

1)使能 DMA1 时钟

__HAL_RCC_DMA1_CLK_ENABLE(); //DMA1 时钟使能

2)初始化 DMA 通道 4,包括配置通道,外设地址,存储器地址,传输数据量等参数

DMA 的某个数据流各种配置参数初始化是通过 HAL_DMA_Init 函数实现的,该函数声明为:

HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma);

该函数只有一个 DMA_HandleTypeDef 结构体指针类型入口参数,结构体定义为:

typedef struct __DMA_HandleTypeDef

{

DMA_Channel_TypeDef *Instance;

DMA_InitTypeDef Init;

HAL_LockTypeDef Lock;

HAL_DMA_StateTypeDef State;

void *Parent;

void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma);

void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma);

void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma);

void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma);

__IO uint32_t ErrorCode;

DMA_TypeDef *DmaBaseAddress;

uint32_t ChannelIndex;

}DMA_HandleTypeDef;

成员变量 Instance 是用来设置寄存器基地址,例如要设置为 DMA1 的通道 4,那么取值为

DMA1_Channel4。

成员变量 Parent 是 HAL 库处理中间变量,用来指向 DMA 通道外设句柄。

成员变量 XferCpltCallback(传输完成回调函数),XferHalfCpltCallback(半传输完成回调

函数),XferErrorCallback(传输错误回调函数),XferAbortCallback(传输中止回调函数)是

四个函数指针,用来指向回调函数入口地址。

成员变量 DmaBaseAddress 和 ChannelIndex 是通道基地址和索引好,这个是 HAL 库处理的

时候会自动计算,用户无需设置。

其他成员变量 HAL 库处理过程状态标识变量,这里就不做过多讲解。接下来我们着重看

看成员变量 Init,它是 DMA_InitTypeDef 结构体类型,该结构体定义为:

typedef struct

{

uint32_t Direction; //传输方向,例如存储器到外设 DMA_MEMORY_TO_PERIPH

uint32_t PeriphInc; //外设(非)增量模式,非增量模式 DMA_PINC_DISABLE

uint32_t MemInc; //存储器(非)增量模式,增量模式 DMA_MINC_ENABLE

uint32_t PeriphDataAlignment; //外设数据大小:8/16/32 位。

uint32_t MemDataAlignment; //存储器数据大小:8/16/32 位。

uint32_t Mode; //模式:循环模式/普通模式

uint32_t Priority; //DMA 优先级:低/中/高/非常高

} DMA_InitTypeDef;

该结构体成员非常多,但是每个成员变量配置的基本都是 DMA_SxCR 寄存器和

DMA_IFCR 寄存器的响应为。我们把结构体各个成员通过注释的方式列出来了。例如本实验我

们要用到 DMA1_Channel4。把内存中数组的值发送到串口外设发送寄存器 DR,所以方向为寄

存器到外设 DMA_MEMORY_TO_PERIPH,一个一个字节发送,需要数字索引自动增加,所以

是存储器增量模式 DMA_MINC_ENABLE,存储器和外设的字宽都是字节 8 位。具体配置如下:

DMA_HandleTypeDef UART1TxDMA_Handler; //DMA 句柄

UART1TxDMA_Handler.Instance=DMA1_Channel4; //通道选择

UART1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH; //存储器到外设

UART1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式

UART1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式

UART1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;

//外设数据长度:8 位

UART1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;

//存储器数据长度:8 位

UART1TxDMA_Handler.Init.Mode=DMA_NORMAL; //外设普通模式

UART1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级

这里大家要注意,HAL 库为了处理各类外设的 DMA 请求,在调用相关函数之前,需要调

用一个宏定义标识符,来连接 DMA 和外设句柄。例如要使用串口 DMA 发送,所以方式为:

__HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler);

其 中 UART1_Handler 是 串 口 初 始 化 句 柄 , 我 们 在 usart.c 中 定 义 过 了 。

UART1TxDMA_Handler 是 DMA 初始化句柄。hdmatx 是外设句柄结构体的成员变量,在这里

实际就是 UART1_Handler 的成员变量。在 HAL 库中,任何一个可以使用 DMA 的外设,它的

初始化结构体句柄都会有有个 DMA_HandleTypeDef 指针类型的成员变量,是 HAL 库用来做相

关指向的。Hdmatx 就是 DMA_HandleTypeDef 结构体指针类型。

这 句 话 的 含 义 就 是 把 UART1_Handler 句 柄 的 成 员 变 量 hdmatx 和 DMA 句 柄

UART1TxDMA_Handler 连接起来,是纯软件处理,没有任何硬件操作。

这里我们就点到为止,如果大家要详细了解 HAL 库指向关系,请查看本实验宏定义标识

符__HAL_LINKDMA 的定义和调用方法,就会很清楚了。

3)使能串口 DMA 发送

串口 1 的 DMA 发送实际是串口控制寄存器 CR3 的位 7 来控制的,在 HAL 库中,多次操作该

寄存器来使能串口 DMA 发送,但是它并没有提供一个独立的使能函数,所以这里我们可以通过

直接操作寄存器方式来实现:

USART1->CR3 | =USART_CR3_DMAT;//使能串口 1 的 DMA 发送

HAL 库还提供了对串口的 DMA 发送的停止,暂停,继续等操作函数:

HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart);//停止

HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart);//暂停

HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart);//恢复

这些函数使用方法这里我们就不累赘了。

4) 使能 DMA1 通道 4,启动传输。

使能串口 DMA 发送之后,我们接着就要使能 DMA 传输通道:

HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress,

uint32_t DstAddress, uint32_t DataLength);

这个函数比较好理解,第一个参数是 DMA 句柄,第二个是传输源地址,第三个是传输目

标地址,第四个是传输的数据长度。

通过以上 4 步设置,我们就可以启动一次 USART1 的 DMA 传输了。

5)查询 DMA 传输状态

在 DMA 传输过程中,我们要查询 DMA 传输通道的状态,使用的函数是:

__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TC4);

获取当前传输剩余数据量:

__HAL_DMA_GET_COUNTER(&UART1TxDMA_Handler);

6)DMA 中断使用方法

DMA 中断对于每个通道都有一个中断服务函数,比如 DMA1_Channel4 的中断服务函

数为 DMA1_Channel4_IRQHandler。同样,HAL 库也提供了一个通用的 DMA 中断处理函

数 HAL_DMA_IRQHandler,在该函数内部,会对 DMA 传输状态进行分析,然后调用响应

的中断处理回调函数:

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);//发送完成回调函数

void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);//发送一半回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);//接收完成回调函数

void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//接收一半回调函数

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);//传输出错回调函数

对于串口 DMA 开启,使能数据流,启动传输,这些步骤,如果使用了中断,可以直接调

用 HAL 库函数 HAL_USART_Transmit_DMA,该函数声明如下:

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart,

uint8_t *pData, uint16_t Size);

22.2 硬件设计

所以本章用到的硬件资源有:

1) 指示灯 DS0、DS2

2) KEY0 按键

3) 串口

4) DMA

本章我们将利用外部按键 KEY0 来控制 DMA 的传送,每按一次 KEY0,DMA 就传送一次数据到

USART1,同时 DS2 灯作为传输进度灯。DS0 还是用来做为程序运行的指示灯。

本章实验需要注意 P5 口的 RXD 和 TXD 是否和 PA9 和 PA10 连接上,如果没有,请先连接。

22.3 软件设计

打开我们的 DMA 传输实验,可以发现,我们的实验中多了 dma.c 文件和其头文件 dma.h,

同时我们要引入 dma 相关的库函数文件 stm32f1xx_hal_dma.c 和 stm32f1xx_hal_dma.h。

打开 dma.c 文件,代码如下:

DMA_HandleTypeDef UART1TxDMA_Handler; //DMA 句柄

//DMA1 的各通道配置

//这里的传输形式是固定的,这点要根据不同的情况来修改

//从存储器->外设模式/8 位数据宽度/存储器增量模式

//chx:DMA 通道选择,DMA1_Channel1~DMA1_Channel7

void MYDMA_Config(DMA_Channel_TypeDef *chx)

{

__HAL_RCC_DMA1_CLK_ENABLE();//DMA1 时钟使能

__HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler);

//将 DMA 与 USART1 联系起来(发送 DMA)

//Tx DMA 配置

UART1TxDMA_Handler.Instance=chx; //通道选择

UART1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH; //存储器到外设

UART1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式

UART1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式

UART1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;

//外设数据长度:8 位

UART1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;

//存储器数据长度:8 位

UART1TxDMA_Handler.Init.Mode=DMA_NORMAL; //外设普通模式

UART1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级

HAL_DMA_DeInit(&UART1TxDMA_Handler);

HAL_DMA_Init(&UART1TxDMA_Handler);

}

//开启一次 DMA 传输

//huart:串口句柄

//pData:传输的数据指针

//Size:传输的数据量

void MYDMA_USART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData,

uint16_t Size)

{

HAL_DMA_Start(huart->hdmatx, (u32)pData, (uint32_t)&huart->Instance->DR, Size);

//开启 DMA 传输

huart->Instance->CR3 |= USART_CR3_DMAT;//使能串口 DMA 发送

}

该部分代码仅仅 2 个函数,MYDMA_Config 函数,基本上就是按照我们上面介绍的步骤来使

能 DMA 时钟和初始化 DMA 的,该函数是一个通用的 DMA 配置函数,DMA1 的所有通道,都可以利

用该函数配置,不过有些固定参数可能要适当修改(比如位宽,传输方向等)。该函数在外部

只能修改 DMA 通道号,更多的其他设置只能在该函数内部修改。MYDMA_USART_Transmit 函数就

是按照 22.1 小节讲解的步骤 3 和步骤 4 来启动串口 DMA 传输的。对照前面的配置步骤的详细讲

解来分析这部分代码即可。

dma.h 头文件内容比较简单,主要是函数声明,这里我们不细说。

接下来我们看看 main 函数如下:

const u8 TEXT_TO_SEND[]={"ALIENTEK NANO STM32 DMA 串口实验"};

#define TEXT_LENTH sizeof(TEXT_TO_SEND)-1

//TEXT_TO_SEND 字符串长度(不包含结束符)

u8 SendBuff[(TEXT_LENTH+2)*100];

int main(void)

{

u16 i;

u8 t=0;

HAL_Init(); //初始化 HAL 库

Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M

delay_init(72); //初始化延时函数

uart_init(115200);

//串口初始化为 115200

LED_Init();

//初始化与 LED 连接的硬件接口

KEY_Init();

//按键初始化

MYDMA_Config(DMA1_Channel4); //初始化 DMA1 通道 4

printf("NANO STM32\r\n");

printf("DMA TEST\r\n");

printf("KEY0:Start\r\n");

//显示提示信息

for(i=0;i<(TEXT_LENTH+2)*100;i++)//填充 ASCII 字符集数据

{

if(t>=TEXT_LENTH)//加入换行符

{

SendBuff[i++]=0x0d;

SendBuff[i]=0x0a;

t=0;

}else SendBuff[i]=TEXT_TO_SEND[t++];//复制 TEXT_TO_SEND 语句

}

i=0;

while(1)

{

t=KEY_Scan(0);

if(t==KEY0_PRES)//KEY0 按下

{

printf("\r\nDMA DATA:\r\n");

HAL_UART_Transmit_DMA(&UART1_Handler,SendBuff,

(TEXT_LENTH+2)*100);//启动传输

//等待 DMA 传输完成,此时我们来做另外一些事,点灯

//实际应用中,传输数据期间,可以执行另外的任务

while(1)

{

if(__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,

DMA_FLAG_TC4))//等待 DMA1 通道 4 传输完成

{

HAL_DMA_CLEAR_FLAG(&UART1TxDMA_Handler,

DMA_FLAG_TC4);//清除 DMA1 通道 4 传输完成标志

HAL_UART_DMAStop(&UART1_Handler);

//传输完成以后关闭串口 DMA

break;

}

LED2=!LED2;

delay_ms(50);

}

LED2=1;

printf("Transimit Finished!\r\n");//提示传送完成

}

i++;

delay_ms(10);

if(i==20)

{

LED0=!LED0;//提示系统正在运行

i=0;

}

}

}

main 函数的流程大致是:先初始化内存 SendBuff 的值,然后通过 KEY0 开启串口 DMA 发

送,在发送过程中,通过__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler),获取当前是否传

输结束,并且 DS2 闪烁。最后在传输结束之后清除相应标志位,提示已经传输完成。

至此,DMA 串口传输的软件设计就完成了。

22.4 下载验证

在代码编译成功之后,我们下载代码到 ALIENTEK NANO STM32F103 上,我们打开串口

调试助手,可以看到串口显示如图 22.4.1 所示:

图 22.4.1 DMA 串口实验实物测试图

伴随 DS0 的不停闪烁,提示程序在运行。然后按 KEY0,DMA 数据开始传输,DS2 快闪

以表示数据正在传输,正常可以看到串口显示如图 22.4.2 所示的内容:

图 22.4.2 串口收到的数据内容

可以看到串口收到了 NANO STM32F103 发送过来的数据。

至此,我们整个 DMA 实验就结束了,希望大家通过本章的学习,掌握 STM32F1 的 DMA

使用。DMA 是个非常好的功能,它不但能减轻 CPU 负担,还能提高数据传输速度,合理的应

用 DMA,往往能让你的程序设计变得简单。

猜你喜欢

💟「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验相关问题

1、问:「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验什么时候上映时间?

答:这部影片的上映时间是2024-04-22 01:28:57

2、问:「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验国产剧在哪个电视台播出?

答:「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验目前只有华数TV、1905电影网、咪咕视频、河塘影视等线上播出,而且还没有在电视上播出。

3、问:国产剧「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验演员表

答:在线观看非常完美是由达达执导,史蒂夫·蒂英楚,Rasmane Ouedraogo,Issaka Sawadogo,Abdoul Karim Konaté,Koné Bakary,Digbeu Jean Cyrille领衔主演的国产剧。

4、问:哪个平台可以免费看「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验

答:免vip在线观看地址http://vk126.com/html/76202.html

5、问:手机版免费在线点播有哪些网站?

答:hao123影视百度视频锦祥剧情百科网PPTV电影天堂

6、问:在线观看非常完美评价怎么样?

Mtime时光网网友评价:2023热播10部迷雾重重的侦探日剧,每部都在燃烧你的cpu,楚岩笑了笑,也不否认,继续道可前辈有没有想过,这一次结束后,上古前辈突破十二界,实力又提升了一大层,那此地的压力,必然也会增长,没有新的力量进入,这压力可就要前辈们自己承受了。

丢豆网网友评论:王勇强行挤出点笑容来,期盼着江虎能接受他的提议。结果江虎给了他一窝脚,冷笑道:你当老子是傻子吗刚刚老子可是亲眼看到有鬼手从宅子里伸出来,明显有鬼,这地方谁还敢要,谁敢住还两亿,二块钱老子也不要

游客bx5NOD3网友评论:2023热播 10部迷雾重重的侦探日剧,每部都在燃烧你的cpu等到第六层的时候,在这里终于感受不一样的气息,一团团属于地狱之塔的力量,在和那股奇异的力量相互僵持着,而在这个中间的地方,一个通天的白色石柱耸立在那里,在他的四周无数涟漪不断翻腾升起。

Copyright © 2008-2018

统计代码