dma

STM32使用DMA控制器试验总结

偶尔善良 提交于 2020-02-11 14:32:57
在使用串口DMA试验过程中,遇到了一些问题,通过试验找到了问题所在,也对DMA的应用有了新的认识,仅以此分享给大家,不足之处请多多指教。 DMA初始化 // 串口对应的DMA请求通道 # define USART_TX_DMA_CHANNEL DMA1_Channel4 # define USART_TX_DMA_IRQ DMA1_Channel4_IRQn # define USART_TX_DMA_IRQHandler DMA1_Channel4_IRQHandler // 外设寄存器地址 # define USART_DR_ADDRESS (USART1_BASE+0x04) // 一次发送的数据量 # define SENDBUFF_SIZE 250 /** * @brief USARTx TX DMA 配置,内存到外设(USART1->DR) * @param 无 * @retval 无 */ void USARTx_DMA_Config ( void ) { DMA_InitTypeDef DMA_InitStructure ; DMA_DeInit ( USART_TX_DMA_CHANNEL ) ; // 开启DMA时钟 RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1 , ENABLE ) ; // 设置DMA源地址

linux DMA接口

淺唱寂寞╮ 提交于 2020-02-09 22:49:04
1.两种DMA映射类型 1.1. 一致性DMA映射(Consistent DMA mappings ) 主要用于映射长时间使用的区域。 CPU和DMA controller不需要考虑cache的影响。 这里的consistent实际上是coherent的概念,不能保证consistent,也就是说需要memory barrier来保证memory order。 1.2 流式DMA映射(streaming DMA mapping) 主要用于一次性DMA传输,传输完成后就会释放。 2.指定DMA设备的寻址范围 include/linux/dma-mapping.h 1 // 用于一致性内存映射的映射范围 2 static inline int dma_set_coherent_mask(struct device *dev, u64 mask) 3 // 用于流式内存映射的映射范围 4 static inline int dma_set_mask(struct device *dev, u64 mask); 3.DMA映射接口 3.1一致性DMA接口 分配较大DMA buffer 1 // dev DMA控制器设备 2 // size 要分配的DMA buffer大小 3 // dma_handle 返回DMA buf的物理地址 4 // flag 分配标志 5 // 返回值 DMA

使用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

Linux 内存管理一

别来无恙 提交于 2020-01-31 11:03:20
疫情在家,整理下以前的学习笔记, 作为linux 三个最重要的部分之一(进程,io,内存),内存管理是非常重要的,是深入理解linux各个部分的基础,linux的内存管理与其他rtos的内存管理不一样,他是一个“富” os,也就是支持很多的应用同时跑,还需要支持应用之间的内存隔离。Linux 内存不仅仅用于内存,比如作为硬盘的补充,硬盘本身也可以作为内存来使用。 硬件原理和分页管理 只要我们打开了MMU之后,CPU只能看到虚拟地址,最终这个虚拟地址通过MMU根据页表查询到对应的硬件地址。比如要访问虚拟地址0x1234560,其中0x560 是页内偏移, 0x1234 是页号, 比如查到0x1234 对应的物理地址是1G,CPU访问0x1234560 的时候,实际访问的是1G+0x560 的地址。 物理地址是页表下面的一个数值,所以物理地址本质上是一个整数,而不是指针。地址是以*p访问到的,其实从linux中物理地址的数据类型也可以看出来 页表除了可以查虚拟地址对应的物理地址以外,还承担了一项非常重要的权限管理(RWX),RWX指读写执行权限,对linux安全非常重要,比如代码段映射为只读读加可执行,那么无论是应用还是内核里面的任何错误行为都不会改写代码段,只要一改写硬件就会发生page fault,软件的错误行为就会被硬件拦截,硬件里面还可以管理另外一个重要的权限

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

老子叫甜甜 提交于 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接口 为什么使用接口 主机可能使用并行传输

设备驱动模型-device、driver、bus (1/2)

旧时模样 提交于 2020-01-29 01:49:52
目录 一. 总线(bus)、设备(device)、驱动(driver)模型 ​1.1 简介 1.2工作流程 二. bus 2.1 简介 2.2实例--platform总线 2.2.1 platform总线建立流程 2.2.2 相关函数讲解 三. device 3.1 简介 3.2 实例---platform_bus 虚拟平台设备 3.2.1 流程 3.2.2 接口函数 四. driver 4.1 简介 4.2 实例 内核版本:3.18.20 博客:https://blog.csdn.net/yj4231/article/details/7799245 https://blog.csdn.net/adc0809608/article/details/7254684 一. 总线(bus)、设备(device)、驱动(driver)模型 1.1 简介 大多数情况下, Linux内核中的设备模型代码会作为“幕后黑手” 处理好这些关系,内核中的总线和其他内核子系统会完成与设备模型的交互,这使得驱动工程师几乎不需要关心设备模型,只需要按照每个框架的要求,“填鸭式”地填充xxx_driver里面的各种回调函数(xxx是总线的名称)在 Linux 内核中,分别使用 bus_type、 device_driver 和 device 来描述总线、驱动和设备。 1.2工作流程 device

STM32-CUBE-ADC-DMA-STM32F13RCT6- PC1管脚

若如初见. 提交于 2020-01-28 12:01:58
1、配置cube RCC SYS 2、管脚定义 3、配置 4、DMA配置 5、NIVC配置 6、配置时钟,生成工程 7、 开始 :HAL_ADC_Start(&hadc1); 8、读取20次的值放入数值 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_ConvertedValue[0], 20); 9、 求电压值 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_ConvertedValue[0], 20); for(i = 0; i < 20; ++i) { ADC_Value += ADC_ConvertedValue[i]; } ADC_Value = ADC_Value / 20; ADC_Volt= ((float)ADC_Value/4096)*3.3; 来源: CSDN 作者: cw0617 链接: https://blog.csdn.net/cw0617/article/details/100160169

STM32L4使用DMA发送串口数据

∥☆過路亽.° 提交于 2020-01-25 21:19:15
在上一个工程的基础上添加使用DMA传输串口数据 (上次工程见 STM32使用LL库建立工程 ) 一、CubeMX的配置 依次点击Configuration->DMA即可进入DMA口详细配置界面。 点击【Add】添加DMA传输请求,然后选择USART1_TX请求; 其他设置如下即可 然后依旧是工程设置里,将HAL改成HAL 然后便可以生成代码 二、用户代码修改 代码生成后打开工程,我们可以看到,在 static void MX_USART1_UART_Init(void) 函数中多了这些和USART_TX的DMA相关配置代码 然后我们将其复制,在usart.c文件中添加 static void USART1_DMA_Init(void) 函数并粘贴,另外将 static void MX_DMA_Init(void) 函数中的DMA时钟使能代码复制到 USART1_DMA_Init() 函数头部; 另外添加外设和内存地址设置函数到 USART1_DMA_Init() 函数中,得到 //USART1_TX DMA Init static void USART1_DMA_Init ( void ) { //使能DMA1时钟 LL_AHB1_GRP1_EnableClock ( LL_AHB1_GRP1_PERIPH_DMA1 ) ; //DMA1通道4选择为USART1_TX请求 LL

Virtual address cache memory, processor and multiprocessor

房东的猫 提交于 2020-01-23 05:08:46
An embodiment provides a virtual address cache memory including: a TLB virtual page memory configured to, when a rewrite to a TLB occurs, rewrite entry data; a data memory configured to hold cache data using a virtual page tag or a page offset as a cache index; a cache state memory configured to hold a cache state for the cache data stored in the data memory, in association with the cache index; a first physical address memory configured to, when the rewrite to the TLB occurs, rewrite a held physical address; and a second physical address memory configured to, when the cache data is written to

linux MMC framework(2) - sdhci host driver

假如想象 提交于 2020-01-22 08:27:00
了解 sdhci host driver. 1.概述   The MultiMediaCard (MMC)/ Secure Digital (SD)/ Secure Digital Input Output (SDIO) host driver implements a standard Linux driver interface to the ultra MMC/SD host controller (microSDHC). The host driver is part of the Linux kernel MMC framework. 1.1.Kernel configuration You can manage the MMC driver support through the kernel configuration options: MMC/SD/SDIO (CONFIG_MMC) MMC block (CONFIG_MMC_BLOCK) Secure Digital Host Controller Interface support (CONFIG_MMC_SDHCI) SDHCI support on the platform-specific bus (CONFIG_MMC_SDHCI_PLTFM) 2.数据结构 2.1.struct sdhci_host