精华内容
下载资源
问答
  • DMA 中断

    2021-01-16 22:15:51
    multiblock用contiguous和auto-loading时,如果使能了中断,那么每次blocktransfer完成后,会暂停。

     

    multiblock用contiguous和auto-loading时,如果使能了中断,那么每次blocktransfer完成后,会暂停。

    展开全文
  • 无FIFO摄像头 DMA传送(关闭DMA中断).zip
  • STM32F407 USART DMA中断方式收发数据
  • 关于STM32F407 一次DMA中断事件进入两次中断 我这里用的是stm32f407 spi2的dma接收中断,原理是一样的。经过测试,dma使能不会触发中断,但是即使没有数据传输事件完成,但是使能之后,单独运行关闭使能语句,会...

    关于STM32F407 一次DMA中断事件进入两次中断

    我这里用的是stm32f407 spi2的dma接收中断,原理是一样的。经过测试,dma使能不会触发中断,但是即使没有数据传输事件完成,但是使能之后,单独运行关闭使能语句,会改写中断传输标志位,从而触发一次中断,这也就是为什么在传输事件触发中断后会再一次触发中断,建议在DMA_Cmd(DMA1_Stream3,DISABLE);后务必要加一句清除中断标志位的语句DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);

    展开全文
  • STM32F103 使用定时器触发ADC,并使用DMA中断+双缓冲实现数据采集。
  • 今天在调试STM32G0 ADC+DMA中断时发现一个问题: ADC配置为连续采样模式,调试时发现程序一直在中断中运行。导致主循环不运行,猜测是因为中断触发频率过高导致。 ADC改为单次触发模式,果然问题解决。 为什么连续...

    今天在调试STM32G0 ADC+DMA中断时发现一个问题:
    ADC配置为连续采样模式,调试时发现程序一直在中断中运行。导致主循环不运行,猜测是因为中断触发频率过高导致。
    ADC改为单次触发模式,果然问题解决。

    为什么连续采样模式会这样呢?目前没空查找。 将采样速度调低,不知道能不能解决。

    展开全文
  • GD32E230F6p6的串口DMA中断收发及printf简介一、初始化配置选择DMA通道串口&DMA初始化二、串口DMA收发及printfDMA发送DMA收发中断处理DMA方式printf三、实际效果 简介 通过DMA中断的方式实现USART0串口数据收发...

    简介

    通过DMA中断的方式实现USART0串口数据收发可以尽量少的占用mcu,提高系统的实时性,同时,printf也可以用DMA方式实现!

    一、初始化配置

    选择DMA通道

    根据GD32的用户手册确定使用DMA-CH1发送USART0-TX数据,DMA-CH2接收USART-RT数据,如下图:
    在这里插入图片描述

    头文件

    #define ARRAYNUM(arr_nanme)      (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme)))
    #define USART0_TDATA_ADDRESS      ((uint32_t)0x40013828)  
    #define USART0_RDATA_ADDRESS      ((uint32_t)0x40013824)
    
    
    /* 串口IO初始化 */
    void com_gpio_init(void);
    /* 串口初始化 */
    void com_usart_init(void);
    /* 串口DMA初始化 */
    void com_dma_init(void);
    
    /* 串口DMA发送 */
    void com_dma_send_data(uint8_t *buffter, uint8_t length);
    
    /* 串口DMA方式printf */
    void dma_printf(const char *format,...);
    

    串口&DMA初始化

    //串口发送buffer
    uint8_t txbuffer[128] = {0};
    //串口接收buffer
    uint8_t rxbuffer[4] = {0};
    
    extern uint8_t com_recv_STA;//串口DMA接收状态		1=数据接收完成
    extern uint8_t	com_recv_num;//串口接收字节数		
    
    /* 串口IO初始化 */
    void com_gpio_init(void)
    {
        
        rcu_periph_clock_enable(RCU_GPIOA);
        gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
    	gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);
       
        gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
        gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);
       
        gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
        gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10);
    }
    
    /* 串口初始化 */
    void com_usart_init(void)
    {
        /* enable USART clock */
        rcu_periph_clock_enable(RCU_USART0);
    
        /* USART configure */
        usart_deinit(USART0);
        usart_baudrate_set(USART0, 115200U);
        usart_receive_config(USART0, USART_RECEIVE_ENABLE);
        usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
    
        usart_enable(USART0);
    }
    
    void com_nvic_config(void)
    {
    	nvic_irq_enable(DMA_Channel1_2_IRQn, 0);
    }
    
    /* 串口DMA初始化 */
    void com_dma_init(void)
    {
    	dma_parameter_struct dma_init_struct;
        /* enable DMA clock */
        rcu_periph_clock_enable(RCU_DMA);
    
        /* initilize the com */
        com_gpio_init();
        com_usart_init();
    	com_nvic_config();
    	
    	
     /* initialize DMA channel1 */
        dma_deinit(DMA_CH1);
        dma_struct_para_init(&dma_init_struct);
        dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
        dma_init_struct.memory_addr = (uint32_t)txbuffer;
        dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
        dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
        dma_init_struct.number = ARRAYNUM(txbuffer);
        dma_init_struct.periph_addr = USART0_TDATA_ADDRESS;
        dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
        dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
        dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
        dma_init(DMA_CH1, &dma_init_struct);
        /* initialize DMA channel2 */
        dma_deinit(DMA_CH2);
        dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
        dma_init_struct.memory_addr = (uint32_t)rxbuffer;
        dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
        dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
        dma_init_struct.number = ARRAYNUM(rxbuffer);
        dma_init_struct.periph_addr = USART0_RDATA_ADDRESS;
        dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
        dma_init_struct.memory_width = DMA_PERIPHERAL_WIDTH_8BIT;
        dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
        dma_init(DMA_CH2, &dma_init_struct);
        /* configure DMA mode */
        dma_circulation_disable(DMA_CH1);
        dma_memory_to_memory_disable(DMA_CH1);
        dma_circulation_disable(DMA_CH2);
        dma_memory_to_memory_disable(DMA_CH2);
        /* USART DMA enable for reception */
        usart_dma_receive_config(USART0, USART_DENR_ENABLE);
        /* enable DMA channel2 transfer complete interrupt */
        dma_interrupt_enable(DMA_CH2, DMA_INT_FTF);
        /* enable DMA channel2 */
        dma_channel_enable(DMA_CH2);
        /* USART DMA enable for transmission */
        usart_dma_transmit_config(USART0, USART_DENT_ENABLE);
        /* enable DMA channel1 transfer complete interrupt */
        dma_interrupt_enable(DMA_CH1, DMA_INT_FTF);
        /* enable DMA channel1 */
        dma_channel_enable(DMA_CH1);
    }
    

    二、串口DMA收发及printf

    DMA发送

    void com_dma_send_data(uint8_t *buffter, uint8_t length)
    {		//串口DMA发送函数
    	uint8_t i;//txbuffer[128];
    	dma_parameter_struct dma_init_struct;
    	for (i = 0; i < length; i ++)
    	{
    		txbuffer[i] = buffter[i];
    	}
    	dma_channel_disable(DMA_CH1);
    	dma_memory_address_config(DMA_CH1, (uint32_t)txbuffer);
    
    	dma_transfer_number_config(DMA_CH1, (uint32_t)length);
    	/* enable DMA channel1 */
    	dma_channel_enable(DMA_CH1);
    	/* USART DMA enable for transmission */
    	usart_dma_transmit_config(USART0, USART_DENT_ENABLE);
    }
    

    DMA收发中断处理

    void DMA_Channel1_2_IRQHandler(void)//DMA串口发送接收中断
    {
        if(RESET != dma_interrupt_flag_get(DMA_CH1, DMA_INT_FLAG_FTF))
    	{//DMA串口发送触发中断
            dma_interrupt_flag_clear(DMA_CH1, DMA_INT_FLAG_G);
        }
        if(RESET != dma_interrupt_flag_get(DMA_CH2, DMA_INT_FLAG_FTF))
    	{//DMA串口接收触发中断
    		dma_channel_disable(DMA_CH2);
            dma_interrupt_flag_clear(DMA_CH2, DMA_INT_FLAG_G);
    		dma_flag_clear(DMA_CH2, DMA_FLAG_G);
    		com_recv_num = 4;//获取字节数
    		com_recv_STA = 1;//接收数据就绪
    		dma_transfer_number_config(DMA_CH2,ARRAYNUM(rxbuffer));
    		dma_channel_enable(DMA_CH2);
    		
        }
    }
    

    DMA方式printf

    /* DMA方式printf */
    void dma_printf(const char *format,...)
    {
    	uint32_t length;
    	va_list args;
     
    	va_start(args, format);
    	length = vsnprintf((char*)txbuffer, sizeof(txbuffer), (char*)format, args);
    	va_end(args);
    	com_dma_send_data(txbuffer,length);
     
    }
    

    三、实际效果

    这里我发送FANR读取转速的命令给mcu,mcu通过串口DMA方式printf当前值(这里我直接将转速检测的IO接的3.3V,实际最高1.1W转,而不是75W)。测试完成,串口DMA中断收发正常,自定义的prinf也可以使用。
    在这里插入图片描述

    展开全文
  • [STM32H743] DMA中断服务函数编写流程

    千次阅读 2019-11-18 21:09:46
    [STM32H743] DMA中断服务函数判断条件 1:首先->配置中断 /* 开启DMA1 Stream0的中断 */ HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);//抢占优先级0,子优先级0 HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn)...
  • 本程序实现STM32 DMA中断模式下ADC多通道数据采集,并经过简单的均值滤波,亲测可用。 若有错误之处,希望读者指出,大家共同学习,一起进步!
  • 一、总进DMA中断 1、问题描述 DMA在使用循环取数据(DMA_CIRCULAR)的时候会一直进中断把主函数拖住 2、解决方法 在中断服务函数里面最后增加HAL_ADC_Stop(&AdcHandle)函数,在主程序中增加HAL_ADC_Start(&...
  • STM32F407 双ADC同步采样,TIM3触发,DMA中断存储,使用战舰开发板,程序是从安富莱改过来的。不用改配置直接可以用,从USART1以1115200输出结果。主要可用于交流采样
  • STM32F103 串口 +DMA中断实现数据收发

    千次阅读 热门讨论 2020-11-12 15:50:53
    01 STM32F103 串口DMA + 空闲中断 实现不定长数据收发 02 文章目录1. 代码讲解1.1 uart_dma.c1.2 uart_dma.h1.3 main.c1.4 stm32f10x_it.c1.5 效果演示     上一篇串口DMA + 空闲中断 实现不定...
  • 一次进入不了DMA中断服务函数问题的排查,主要原因是在中断服务函数里面使用了printf函数。详细情况是:我用独立模式分别运行ADC2和ADC3,并在他们的DMA传输中断函数里面编写算法。ADC2的采样和DMA传输和中断的处理...
  • STM32L151,HAL库,ADC多通道使用DMA中断传输,解决ADC通道错乱问题。OLED显示,STM32 stop低功耗模式。
  • DMA HAL_DMA_Start_IT函数中,将所有的中断都打开了,我们只需要将需要打开的中断使能位置1即可 将半传输完成中断屏蔽,如下: if(hdma-&gt;XferHalfCpltCallback != NULL) { // hdma-&gt;Instance-&gt;...
  • 单片机I/O设备的控制方式主要有三种:程序循环检测、中断驱动和直接内存访问。
  • dma中断定长发送本来很简单的一个问题让hal搞的头大,调来调去的,说好的彻底封装呢,确实很彻底啊,不废话了,实测之后说说的理解吧,不对的话请大佬指正。 hal_uart_transmit_dma如果配置好了dam,开启了通道,...
  • xilinx DMA中断不响应

    2020-09-20 21:11:00
    本人习惯使用ADI公司开源的DMA IP核,最近有个项目使用ADI的ip将数据从PS发往PL时有点问题,发现PS的数据有时不更新,暂时没找到问题的原因,所以寻思直接采用xilinx的IP,但是使用之初发现无法实现数据搬移,最终...
  • STM32 hal库DMA中断实验

    千次阅读 2020-02-17 22:24:46
    //DMA内存传输到串口完成中断实验,自己编写回调函数并注册到dma句柄即可 usart.h--------extern DMA_HandleTypeDef hdma_usart1_tx; main.c---------- int i=0; void USART1_DMA_TX_CpltCallback( struct __DMA_...
  • 从FPGA视角来看DMA中断

    2019-11-09 14:06:22
    题外话 从学习一些高档的单片机就能看到DMA的作用。DMA可以让外设不经过CPU的干预,直接把数据搬运到内存。这样做不仅仅是体现在不需要CPU干涉,而且...在非突发,并行采集的条件下,AD转换器每秒需要中断CPU 51200...
  • DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_...
  • STM32的DMA中断

    千次阅读 2013-05-28 15:31:01
    当设置DMA_BufferSize后,只有当传送完所设的大小后,才会产生一个DMA_IT_TC中断。如果使能了HTIF,则当传送了一半大小的数据后就会产生一个中断。 例如,DMA用在USART的接收上,当把DMA_BufferSize设置成4后,...
  • 一、DMA 简介 DMA(Direct Memory Access)—直接...DMA 控制器包含了 DMA1 和 DMA2,其中 DMA1 有 7 个通道,DMA2 有 5 个通道,这里的通道可以理解为传输数据的一种管道。要注意的是 DMA2 只存在于大容量的单片机中.
  • 只有一个串口USART1,与以往用DMA+IDLE中断接收数据不同,这个串口在不停地发送数据(25bytes * 100Hz),因此IDLE中断不仅仅由接收事件产生,也在不停地由发送事件产生;此外还有一些其它的问题。正好从没用过DMA...
  • DMA 中断和查询三者的区别

    千次阅读 2017-03-14 10:21:45
    DMA(DIRECT MEMORY ACCESS) 即直接存储器存取,是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。  要把外设的数据读入内存或把内存的数据传送到外设,一般都要通过CPU控制完成,如CPU程序查询或...
  • 项目简介:stm32f407实现定时器3(Timer3)触发ADC双通道同时采样并在DMA中断读取每次转换的结果 项目需求:  对两路信号进行ADC同时采样。由于一路信号将作为参考信号解调另一路信号,所以要确保两路信号的每次...
  • DMA 中断 查询三者的区别

    万次阅读 2014-09-12 09:36:43
    DMA(DIRECT MEMORY ACCESS) 即直接存储器存取,是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。  要把外设的数据读入内存或把内存的数据传送到外设,一般都要通过CPU控制完成,如CPU程序查询或...
  • 本项目代码利用HAL库中DMA中断方式,向串口1发送大量数据,芯片为STM32F407,通过串口助手来接收并显示数据。具体步骤如下: 1、配置MCU的引脚功能。 2、初始化DMA功能。 3、初始化USART1功能。 4、初始化TIM...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,736
精华内容 19,494
关键字:

dma中断