dma方式

【连载】【FPGA黑金开发板】NIOS II那些事儿--NIOS II 常见问题(FAQ)

。_饼干妹妹 提交于 2020-03-06 09:55:20
为了帮助初学者快速入门NIOS II,在此建立NIOS II FAQ,希望大家把自己遇到的问题提出来,然后在这里总结起来,以帮助以后遇到同样问题的人。 首先需要声明一点,下面部分问题来自网络,如果版权问题,请及时通知,我将会将其删除 在此提几点要求和规定: 1.此贴是NIOS II FAQ,所以不收录其他相关内容; 2.大家通过回帖方式进行提问,如果有其他人可以解决,也是通过回帖方式进行解决; 3.问题解决以后,我会将其编入这个贴内,然后将问题跟帖删除,避免跟帖过多的影响。 4.禁止在回帖中涉及与NIOS II无关内容,一经发现立即删除。 -------------------------------------------华丽的分割线---------------------------------------------------------------------- 1.NIOS能做浮点运算么? 答:NIOS可以进行浮点运算,完全可以替代MCU,时钟可以跑到100Mhz,比ARM7还要快,ARM7时钟一般为72Mhz左右。 2.NIOS是否可以不使用SDRAM和并行FLASH? 答:首先说明一下,SDRAM是用来运行程序的,FLASH是用来存储程序代码的(SDRAM掉电丢失,FLASH则不会),每次上电的时候,都需要将FLASH中的程序代码放到SDRAM中,然后再运行。

289_S32K144串口的查询接收模式

余生长醉 提交于 2020-03-01 08:22:46
完整的S32K144的学习汇总如下: https://github.com/GreyZhang/g_s32k144 继续S32K144的学习,还是继续串口的学习。因为我觉得前面实现的这种阻塞收发模式虽然稳定,但是还有改进空间。尤其是DMA的使用,在这种模式下似乎是不奏效的。其实,发送功能倒还好一点,接收功能,我觉得还是得实现查询的方式。 查看接口信息,发现其实这个似乎也是已经实现了的一个功能。我找到了下面的这个接口: 使用这个做一下实现,测试代码修改如下: 做一下简单的测试。 看得出,这个接收的可靠性还是很高的。以上的测试是基于中断的传输模式实现的,切换成DMA其实也有同样的效果。切换DMA的配置之后,测试结果如下: 完整的S32K144的学习汇总如下: https://github.com/GreyZhang/g_s32k144 来源: CSDN 作者: grey_csdn 链接: https://blog.csdn.net/grey_csdn/article/details/104580702

基于stm32mini开发板的简易函数发生器和简易示波器

五迷三道 提交于 2020-02-27 11:00:48
基于stm32 mini开发板的简易函数发生器和简易示波器 前言:这是我学习完stm32基础知识后做的第一个比较综合的项目,由于本人学习时间不长,在程序设计方面能力不强,故展示的代码或者方法可能有误,还请各位大佬海涵,我也很高兴大家能在评论区提出建议和意见,谢谢。 一、项目整体思路和实现的功能 这个项目是基于正点原子stm32 mini开发板设计的,使用芯片为STM32F103RCT6,相关配置步骤和基础知识,可以在正点原子论坛找到。 (一)、简易示波器思路和功能 利用stm32强大的ADC功能,在一定时间内采集IO口电压,将采集到的一定数值保存在数组中,经过数据处理后,显示在LCD上。 能实现正电压下,0~3.3v电压的显示,以及最高10KHZ的频率显示(10K以上显示将不清晰)。能通过两个按键实现对ADC采样周期的转换,分为us级和ms级。 (二)、简易函数发生器思路和功能 利用stm32强大的DAC和DMA功能,以定时器2触发DAC转换,以DMA传送需要转换的数值,以达到目标波形的输出。 能实现正弦波,三角波,方波,锯齿波,甚至模拟噪声波等多种波形的输出,可以调节输出波形的幅值和频率。 二、程序设计和部分原理解释 (一)、外围按键设计 这部分主要涉及改变ADC采样周期,由于整个程序有延时,必须采用中断的方式读取键值并改变采样周期标志位,这样才能达到按一次改变一次的效果

利用DMA双缓冲或半完成中断实现串口不定长数据的接收

最后都变了- 提交于 2020-02-26 18:44:30
在《 HAL版本DMA循环模式串口数据收发 》中介绍了利用DMA循环模式进行串口数据的收发,STM32F4xx的DMA还提供了双缓冲的功能,采用双缓冲模式,可以在一个DMA完成接收后,对其缓冲区内数据进行处理的过程中,将此时接收到的数据放入第二个DMA缓冲区。双缓冲模式尤其对高速数据接收有着明显的优势,本文以上述循环接收方案为基础,提供实现双缓冲接收数据的实现方式。 首先,从寄存器的角度讲,要实现双缓冲,需要将CR寄存器的DBM位置1,将该位置1后,硬件会强制使用循环模式,当一个缓冲满后,会自动交换缓冲区的地址。但我们采用HAL库版本的程序时,不太需要关注这些,但是值得注意的是,HAL库的stm32f4xx_hal_uart.c中并没有提供实现双缓冲的接口,因此需要我们对HAL库的程序进行一些改写: HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) { /*省略库中起始部分的程序*/ /* Set the DMA abort callback */ huart->hdmarx->XferAbortCallback = NULL; /* Enable the DMA stream */ //HAL_DMA_Start_IT(huart-

总线主控DMA

给你一囗甜甜゛ 提交于 2020-02-17 18:30:38
DMA都是主控总线的,这里的总线主控DMA是指设备本身具备DMA功能,而无需使用系统DMA控制器。 总线主控DMA的设备,有两种基本的DMA方式 基于包的DMA传输 使用公共缓冲区的传输 基于包的DMA传输一般是这样的过程: IRP到达Dispacher Dispacher分配一个通道 AllocateAdapterChannel ,这个例程会在一个合适的时候调用它的一个回调函数 回调函数内部会根据IRP的MDL得到内核虚拟地址,接着 MapTransfer ,调用会得到物理地址,这个物理地址是指总线相关的物理地址 得到物理地址后,一般是写入硬件寄存器,并且通知启动DMA传输 真正的DMA传输就开始了 这种方式的DMA是可以直接把硬件的数据DMA到应用层的,效率相当高。另外DDK文档说明了一些Cache的控制,以及映射寄存器(x86是软件模拟的)的一些关系。需要仔细推敲和理解 使用公共缓冲区的传输是比较简单的: 在StartDevice时, AllocateCommonBuffer 得到一个公共缓冲区,这个缓冲区是物理连续的,有时候是会失败的。如果失败,那么StartDevice应该返回STATUS_INSUFFICIENT_RESOURCES. 和基于包的一样,IRP到达Dispacher,Dispacher直接使用缓冲区域地址编程硬件就可以启动DMA了

STM32F4x系列的DMA配置

不想你离开。 提交于 2020-02-15 20:47:28
以SPI2 为例,将存储器中的数据,通过DMA方式搬运到外设,DMA配置步骤: 1、选择DMA1还是DMA2:通过图1可查看到SPI2是在DMA1表里,所以选择DMA1。   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE); 2、选择数据流:该配置应该放在所有信息配置完在使能。   DMA_Cmd(DMAX_StreamY, ENABLE);   其中X = 1、2,Y=0、1…7,有两个DMA,分别是DMA1和DMA2,每个DMA控制器有又有8个数据流。   问题1:一个外设怎么知道选哪个数据流呢?   答:先查看参考手册,找到DMA1/2请求映射表,如下图1、2 图1 图2   比如现在用到外设SPI2_TX(存储器的数据搬运到外设,所以得找发送) ,选择数据流4。   DMA_Cmd(DMA1_Stream4, ENABLE); 3、通道选择,有8个通道,不是随便选择的,得查看图1和图2,SPI2外设所对应的通道0。   DMA_InitStructure.DMA_Channel = DMA_Channel_0; 4、设置外设基地址。   DMA_InitStructure.DMA_PeripheralBaseAddr = 0Xxxxx;    问题2:怎么知道当前选用外设的基地址?看人家例子都是写好了的,到时换其他外设

使用STM32F407驱动鹰眼摄像头

风格不统一 提交于 2020-01-31 23:28:09
ctime:2018-07-06 13:14:33 +0800|1530854073 标签(空格分隔): 未分类 鹰眼摄像头一般用在智能车比赛上,因此现在网上大部分都是用K60来驱动。但K60没有像STM32的HAL、STD库那样的官方库,都是爱好者或者商家(野火、逐飞)等写的民间库,水平也参差不齐。而STM32不仅有官方库,还有STM32QubeMX这种方便的GUI来直接配置底层。 因此,在2018年的创意组上,我们决定使用STM32来驱动鹰眼,这样,以后在Robocon中也能用得上。 STM32F407实际上是有DCMI摄像头接口的,但由于鹰眼摄像头是硬件二值化过的输出,因此似乎不能用DCMI。(我没尝试,因为如果使用DCMI的话,就不能用中断+DMA的方式来驱动了,如果DCMI失败只能重新打板。) 保险起见我直接将鹰眼的D0-D7接到407的PD0-PD7上,然后场中断接PC9的外部中断,PCLK接PC8(TIM8的CH4)。 驱动方式与K60基本一样,即场中断来时,开启DMA传输,设置传输源地址为 &GPIOD->IDR ,传输目的地址为图像数组首地址,传输长度为数组的size。 这个DMA是TIM8 CH4的输入捕捉DMA,因此每次PCLK脉冲过来,都会触发一次。 需要注意的是,一开始我以为DMA传输从 GPIOD->IDR 到 img_buffer

计算机组成:输入输出系统

老子叫甜甜 提交于 2020-01-29 18:22:09
输入输出系统 通道可以看做是DMA的升级版,通道有自己的控制器甚至是存储器、内存 通道可以执行由通道指令编写的程序,由操作系统完成 如果使用通道,就不是连接接口了,而是连接设备管理器 I/O处理机可以使用微处理器甚至直接使用和主处理器相同的处理器来做,当然这就不是家用电脑的范畴了,强大的I/O处理机甚至在没有IO工作时,可以作为主机的处理器来使用 I/O和主机的连接方式 统一编址:将io地址看成内存地址的一部分。这种方式实现了io和内存的统一不需要单独的io指令,CPU指令集相对简单,如果内存空间比较大(eg.64位)可以采用这种方式 单独编址: 串行速度慢,但是适合长距离传输 不便于增删设备 外部设备输出的数据可以先缓存到io接口,进行数据格式的转换等操作再输入主机 便于增删设备、采用标准接口,可移植性强 信息传送的控制方式 CPU直接对IO进行管理 缺点就是广为人知的,浪费CPU DMA请求:向CPU申请占用一个存取周期的总线控制权从而将外部设备的数据加载到内存中,这个周期内CPU不能使用总线对内存进行访问,但是这段时间CPU依然可以正常使用(由于CPU会预先取一部分指令,这段时间不能访问内存有可能影响不大) 外部设备简介 主观图像:用户绘制的图像,由点线面构成,就是简单的那种 客观图像:eg.GUI A:模拟信号 D:数字信号 IO接口 为什么使用接口 主机可能使用并行传输

第十五章 内存映射和DMA

拜拜、爱过 提交于 2020-01-20 03:03:29
1、mmap设备操作 映射一个设备意味着将用户空间的一段内存与设备内存关联起来。无论何时当程序在分配的地址范围内读写时,实际上访问的就是设备。不是所有的设备都能进行mmap抽象。比如像串口和其他面向流的设备就不能。mmap的另一个限制是:必须以PAGE_SIZE为单位进行映射。 mmap方法是file_operation结构的一部分,并且执行mmap系统调用时将调用该方法。为了执行mmap,驱动程序只需要为该地址范围建立合适的页表,并将vma->vm_ops替换为一系列的新操作即可。 有两种建立页表的方法:使用remap_pfn_range函数一次全部建立,或者通过nopage方法每次建立一个页。 2、执行直接IO访问 如果需要传递的数据量非常大,直接进行数据传输,而不需要额外的从内核空间拷贝数据操作的参与,这将会大大提高速度。使用直接IO并不在任何情况下都能提高性能。设置直接IO的开销很大,而又没有使用IO缓存的优势。比如,使用直接IO需要write系统调用同步执行;否则应用程序将会不知道什么时候能再次使用他的IO缓冲区。在每个写操作完成之前不能停止应用程序,这样会导致关闭程序缓慢,这就是使用直接IO的应用程序也使用异步IO的原因。 在字符设备中执行直接IO是不行的,也是有害的。只有确定设置缓冲IO的开销特别大,才使用直接IO。块设备和网络设备不担心实现直接IO的问题

【STM32H7教程】第46章 STM32H7的ADC应用之DMA方式多通道采样

那年仲夏 提交于 2020-01-16 15:42:09
完整教程下载地址: http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第46章 STM32H7的ADC应用之DMA方式多通道采样 本章教程为大家讲解ADC+DMA方式的多通道数据采集,实际项目中有一定的使用价值,使用一路ADC就可以采集多个通道的数据。 46.1 初学者重要提示 46.2 ADC稳压基准硬件设计 46.3 ADC驱动设计 46.4 ADC板级支持包(bsp_adc.c) 46.5 ADC驱动移植和使用 46.6 实验例程设计框架 46.7 实验例程说明(MDK) 46.8 实验例程说明(IAR) 46.9 总结 46.1 初学者重要提示 学习本章节前,务必优先学习第44章,需要对ADC的基础知识和HAL库的几个常用API有个认识。 开发板右上角有个跳线帽,可以让ADC的稳压基准接3.3V或者2.5V,本章例子是接到3.3V。 STM32H7的ADC支持偏移校准和线性度校准。如果使用线性度校准的话,特别要注意此贴的问题: http://www.armbbs.cn/forum.php?mod=viewthread&tid=91436 。 ADC的专业术语诠释文档,推荐大家看看: http://www.armbbs.cn/forum.php?mod=viewthread&tid=89414 。