精华内容
下载资源
问答
  • PIO模式DMA模式的区别

    千次阅读 2019-06-11 17:40:32
    硬盘和内存之间数据传送两种方式:一是PIO模式,二是DNA... DMA模式下,CPU并不全程参与数据传送工作,只需下达命令即可。DMA方式下有控制器和通道,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据传送...

            硬盘和内存之间数据传送的两种方式:一是PIO模式,二是DNA模式

            PIO模式下通过CPU来控制硬盘和内存之间的数据传输,是一种通过CPU执行I/O端口指令来进行数据的读写的数据交换模式。;

            DMA模式下,CPU并不全程参与数据的传送工作,只需下达命令即可。DMA方式下有控制器和通道,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率。DMA模式与PIO模式的区别就在于,DMA模式不过分依赖CPU,可以大大节省系统资源,二者在传输速度上的差异并不十分明显。DMA模式又可以分为Single-Word DMA(单字节DMA)和Multi-Word DMA(多字节DMA)两种,其中所能达到的最大传输速率也只有16.6MB/s。

            DMA需要传送数据时和程序中断来临时先处理哪一个?

            DMA 传送方式的优先级高于程序中断,两者的区别主要表现在对CPU的干扰程度不同。程序中断请求不但使CPU停下来,而且要CPU执行中断服务程序为中断请求服务,这个请求包括了对断点和现场的处理以及CPU与外设的传送,所以CPU付出了很多的代价;DMA请求仅仅使CPU暂停一下,不需要对断点和现场的处理,并且是由DMA控制外设与主存之间的数据传送,无需CPU的干预,DMA只是借用了一点CPU的时间而已。还有一个区别就是,CPU对这两个请求的响应时间不同,对程序中断请求一般都在执行完一条指令的时钟周期末尾响应,而对DMA的请求,由于考虑它的高效性,CPU在每条指令执行的各个阶段之中都可以让给DMA使用,是立即响应。 DMA主要由硬件来实现,此时高速外设和内存之间进行数据交换不通过CPU的控制,而是利用系统总线。DMA方式是I/O系统与主机交换数据的主要方式之一,另外还有程序查询方式和中断方式。

    展开全文
  • 查阅大量资料和各个论坛 ...ADC采集工作在多通道连续扫描模式和连续转换模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; DMA配置中 开启连续传输 (DMA_In...

    查阅大量资料和各个论坛 都没有得到一个全面详尽的答案  

    ADC多通道采集和DMA缓冲区传输数据的详细过程

    ADC采集工作在多通道连续扫描模式和连续转换模式  ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

    DMA配置中 开启连续传输 (DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  ;)

    首先DMA传输三个大致步骤 1.外设请求DMA传输   2.DMA传输数据到内存  3.传输完成进行下次传输或者停止传输(根据是否配置连续传输)

    经过测试发现 

    1.DMA连续传输模式下 DMA产生中断请求后  进入中断函数后 DMA传输依然持续 除非ADC停止请求DMA传输 

    2.DMA是传输一次是传输整个DMA缓冲区   还是外设申请一次传一次  ?完成整个传输后产生中断标志:

    手册中说

    DMA_CNDTRx 寄存器对应 DMA_InitStructure.DMA_BufferSize = sizeof(DMA_Adc)/sizeof(vu16);  数据量大小为  30个u16

    volatile u16 DMA_Adc[M][N];    //M=10 N=3

    DMA_InitStructure.DMA_BufferSize = sizeof(DMA_Adc)/sizeof(vu16);  缓冲区大小为  30个u16

    ADC1的通道1 完成一次扫描  ADC1转换完成后 申请DMA传输  ADC1将其12位数据寄存器的数据 存到DMA的缓存区 

    ADC1的通道2 完成一次扫描  ADC1转换完成后 申请DMA传输  ADC1将其12位数据寄存器中数据 存到DMA的缓存区  

    缓存区存满后 DMA传输数据到内存区 传输完成产生中断 这样的话就不高效 违背了DMA的初衷 而且手册中并未提到DMA可以缓存 

    所以DMA只是个桥接作用不起缓存作用  ADC1的通道1 完成一次扫描  ADC1转换完成后 申请DMA传输 DMA传输数据到内存

    DMA_CNDTRx 寄存器减一  减到0 产生中断请求

     

    有错误的地方还请指教

     

    主函数就只有基本的初始化和while空循环和ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ADC开始采集的启动函数

    #include "adc.h"

    volatile u16 DMA_Adc[M][N]; // M= 10 N=3 3¸öͨµÀ ÿ¸öͨµÀ²É¼¯10´Î volatile u16==vu16
    u16 ADC_Value[N];
    vu8 flag=0;
    void ADC_Init_User()

         ADC_InitTypeDef ADC_InitStructure; 
        GPIO_InitTypeDef GPIO_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;            /* Configure the NVIC Preemption Priority Bits */ 

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1    , ENABLE );      //ʹÄÜADC1ͨµÀʱÖÓ
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //ÉèÖÃADC·ÖƵÒò×Ó6 72M/6=12,ADC×î´óʱ¼ä²»Äܳ¬¹ý14M

        //PA1 ×÷ΪģÄâͨµÀÊäÈëÒý½Å                         
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //¶ÔÓ¦adcͨµÀµÄ1 2 3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //Ä£ÄâÊäÈëÒý½Å
        GPIO_Init(GPIOA, &GPIO_InitStructure);    
        
            
      //DMA1 Configuration ADC1¹ÒÔØÔÚDMA1µÄͨµÀ1
        DMA_DeInit(DMA1_Channel1);   //¸´Î»DMA1ͨµÀ1
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;//ÍâÉèADC1×÷Ϊ»ùµØÖ· &USART1->DR ÍâÉè´®¿Ú×÷Ϊ»ùµØÖ·
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DMA_Adc; //¶¨ÒåDMA1µÄͨµÀµÄÄÚ´æ»ùµØÖ·
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //DMA´«Êä·½Ïò(ÍâÉèµ½ÄÚ´æ)
        DMA_InitStructure.DMA_BufferSize = sizeof(DMA_Adc)/sizeof(vu16); //¶¨ÒåÖ¸¶¨DMAͨµÀµÄDMA»º´æ´óС
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //É趨ÍâÉèµØÖ·¼Ä´æÆ÷µÝÔöÓë·ñ£¬²»±ä£¬Disable
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //É趨ÍâÉèµØÖ·¼Ä´æÆ÷µÝÔöÓë·ñ£¬µÝÔö£¬Enable
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ; //ÍâÉèÊý¾Ýµ¥Î»
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;    //ÄÚ´æÊý¾Ýµ¥Î»
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  ; //DMAģʽ£ºÑ­»·Ä£Ê½
        DMA_InitStructure.DMA_Priority = DMA_Priority_High ; //¸ÃͨµÀÓÅÏȼ¶£º¸ß
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;   //½ûÖ¹ÄÚ´æµ½ÄÚ´æµÄ´«Êä
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);  //³õʼ»¯DMA1ͨµÀ1
        
        DMA_Cmd(DMA1_Channel1,ENABLE);//Æô¶¯DMA1µÄͨµÀ1    
        DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); //¿ªÆô´«Êä½áÊøÖжÏ
        
            //ÖжÏÓÅÏȼ¶NVICÉèÖÃ
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;  //TIM3ÖжÏ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //ÏÈÕ¼ÓÅÏȼ¶0¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //´ÓÓÅÏȼ¶3¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀ±»Ê¹ÄÜ
        NVIC_Init(&NVIC_InitStructure);  //³õʼ»¯NVIC¼Ä´æÆ÷
        

      //ADC1 Configuration  ×¢ ADC1 2 3 ¸÷¸öͨµÀ¶ÔÓ¦µÄIO»ù±¾¶¼ÊÇÒ»ÖµÄ
        ADC_DeInit(ADC1);  //¸´Î»ADC1 
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //ADC¹¤×÷ģʽ:ADC1ºÍADC2¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;    //DISABLE=Ä£Êýת»»¹¤×÷ÔÚµ¥Í¨µÀģʽ
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;    //DISABLE=Ä£Êýת»»¹¤×÷ÔÚµ¥´Îת»»Ä£Ê½
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //ת»»ÓÉÈí¼þ¶ø²»ÊÇÍⲿ´¥·¢Æô¶¯
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;    //ADCÊý¾ÝÓÒ¶ÔÆë =µÍ12λÓÐЧ ×ó¶ÔÆë ¸ßÊ®¶þλÓÐЧ
        ADC_InitStructure.ADC_NbrOfChannel = 3;    //˳Ðò½øÐйæÔòת»»µÄADCͨµÀµÄÊýÄ¿ ¼¸¸öͨµÀ¾ÍÊǼ¸
        ADC_Init(ADC1, &ADC_InitStructure);    //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèADCxµÄ¼Ä´æÆ÷   
        
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_13Cycles5);//
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_13Cycles5);//
        ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_13Cycles5);//
        
        
        ADC_DMACmd(ADC1,ENABLE); //¿ªÆôADCÓëDMAµÄÖ§³Ö
        ADC_Cmd(ADC1, ENABLE);    //ʹÄÜÖ¸¶¨µÄADC1
        
        ADC_ResetCalibration(ADC1);    //ʹÄܸ´Î»Ð£×¼  
         
        while(ADC_GetResetCalibrationStatus(ADC1));    //µÈ´ý¸´Î»Ð£×¼½áÊø
        
        ADC_StartCalibration(ADC1);     //¿ªÆôADУ׼
     
        while(ADC_GetCalibrationStatus(ADC1));     //µÈ´ýУ׼½áÊø
     
    //    ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ

    }        

    void DMA1_Channel1_IRQHandler(void)
    {
        u8 i,j;    
        int sum;
                for(i=0;i<N;i++)
        {
            sum=0;
            for(j=0;j<M;j++)
            {
                sum+=DMA_Adc[j][i];
            }
            ADC_Value[i]=sum/10;//(float)sum/(10*4096)*3.3;
            //ADC_Value[i]=(float)sum/10;
         if(flag>0)
         {
            while(1){
            OLED_ShowNum(1,2,DMA_Adc[0][0],4,12);
            OLED_ShowNum(1,4,DMA_Adc[0][1],4,12);
            OLED_ShowNum(1,6,DMA_Adc[1][0],4,12);
                ADC_SoftwareStartConvCmd(ADC1, DISABLE);//¿ªÊ¼²É¼¯
                ADC_Cmd(ADC1, DISABLE);    //ʹÄÜÖ¸¶¨µÄADC1
            }
         }
         else{
            OLED_ShowNum(1,2,DMA_Adc[0][0],4,12);
            OLED_ShowNum(1,4,DMA_Adc[0][1],4,12);
            OLED_ShowNum(1,6,DMA_Adc[1][0],4,12);
        DMA_ClearFlag(DMA1_FLAG_TC1);
         }
         flag++;
        }
    }
     

    展开全文
  • STM32ADC与DMA配置

    千次阅读 2018-11-08 11:09:16
    DMA通道 DMA通道在接收数据时,... DMA数据传输方向由外到内,必须数组,必须递增数据地址,根据ADC数据配置数据位数,工作模式循环模式。 ADC多通道与DMA中断配置 ADC多个通道首先要配置好顺序,这样数组里就可以...

     

    • DMA通道
    1. DMA通道在接收数据时,不影响CPU其他的操作。
    2. DMA优先级:DMA1优先DMA2,较低编号的通道优先于较高的通道,通道2优先于通道4。
    • ADC单通道与DMA传输的配置
    1. ADC配置成连续转换。
    2. DMA数据传输方向由外到内,必须数组,必须递增数据地址,根据ADC数据配置数据位数,工作模式循环模式。
    • ADC多通道与DMA中断配置
    1. ADC多个通道首先要配置好顺序,这样数组里就可以按照顺序去处理,还要开启循环扫描+连续转换。
    2. DMA开启数据完成中断,中断函数里进行数据滤波或者平均。
    • DMA1请求表
    • DMA2请求表

    外设

    通道1

    通道2

    通道3

    通道4

    通道5

    通道6

    通道7

    ADC1

    ADC1

     

     

     

     

     

     

    SPI/I2S

     

    SPI1_RX

    SPI1_TX

    SPI/I2S2_RX

    SPI/I2S2_TX

     

     

    USART

     

    USART3_TX

    USART3_RX

    USART1_TX

    USART1_RX

    USART2_RX

    USART2_TX

    I2C

     

     

     

    I2C2_TX

    I2C2_RX

    I2C1_TX

    I2C1_RX

    TIM1

     

    TIM1_CH1

    TIM1_CH2

    TIM1_TX4

    TIM1_TRIG

    TIM1_COM

    TIM1_UP

    TIM1_CH3

     

    TIM2

    TIM2_CH3

    TIM2_UP

     

     

    TIM2_CH1

     

    TIM2_CH2 TIM2_CH4

    TIM3

     

    TIM3_CH3

    TIM3_CH4 TIM3_UP

     

     

    TIM3_CH1 TIM3_TRIG

     

    TIM4

    TIM4_CH1

     

     

    TIM4_CH2

    TIM4_CH3

     

    TIM4_CH2

    外设

    通道1

    通道2

    通道3

    通道4

    通道5

    ADC3

     

     

     

     

    ADC3

    SPI/I2S3

    SPI/I2S3_RX

    SPI/I2S3_TX

     

     

     

    UART

     

     

     

    UART4_RX

    UART4_TX

    SDIO

     

     

     

    SDIO

     

    TIM5

    TIM5_CH4

    TIM5_TRIG

    TIM5_CH3

    TIM5_UP

     

    TIM5_CH2

    TIM5_CH1

    TIM6/DAC通道1

     

     

    TIM6_UP/

    DAC通道1

     

     

    TIM7/DAC通道2

     

     

     

    TIM7_UP/ DAC通道2

     

    TIM8

    TIM8_CH3

    TIM8_UP

    TIM8_CH4

    TIM8_TRIG

    TIM8_COM

    TIM8_CH1

     

    TIM8_CH2

    展开全文
  • extern uint16_t SendBuff[SENDBUFF_SIZE];... * 描述 :USART1 GPIO 配置,工作模式配置。115200 8-N-1 * 输入 :无 * 输出 : 无 * 调用 :外部调用 */ void USART1_Config(void) { GPIO_InitTypeDef GPIO_I...
    extern uint16_t SendBuff[SENDBUFF_SIZE];
    
    /*
     * 函数名:USART1_Config
     * 描述  :USART1 GPIO 配置,工作模式配置。115200 8-N-1
     * 输入  :无
     * 输出  : 无
     * 调用  :外部调用
     */
     void USART1_Config(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	
    	/* config USART1 clock */
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
    	
    	/* USART1 GPIO config */
    	/* Configure USART1 Tx (PA.09) as alternate function push-pull */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);    
    	/* Configure USART1 Rx (PA.10) as input floating */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	  
    	/* USART1 mode config */
    	USART_InitStructure.USART_BaudRate = 115200;
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;  //8位有效字长
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;       //1位停止位
    	USART_InitStructure.USART_Parity = USART_Parity_No ;         //无奇偶校验位
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    //无硬件数据流控制
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   //可收可发模式
    	USART_Init(USART1, &USART_InitStructure); 
    	USART_Cmd(USART1, ENABLE);
    }
     
     
    void DMA_USART_Init(void)
    {
     DMA_InitTypeDef DMA_InitStructure;
    
    	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	//开启DMA时钟
    
     	/*设置DMA源:内存地址&串口数据寄存器地址*/
        DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;	   
    
    	/*内存地址(要传输的变量的指针)*/
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
    	
    	/*方向:从内存到外设*/		
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;	
    	
    	/*传输大小DMA_BufferSize=SENDBUFF_SIZE*/	
        DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
    	
    	/*外设地址不增*/	    
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
    	
    	/*内存地址自增*/
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;	
    	
    	/*外设数据单位*/	
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    	
    	/*内存数据单位 8bit Byte     16位 HalfWord   32位 Word */
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;	 
    	
    	/*DMA模式:一次传输,循环*/
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;	 
    	
    	/*优先级:中*/	
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  
    	
    	/*禁止内存到内存的传输	*/
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    	
    	/*配置DMA1的4通道*/		   
        DMA_Init(DMA1_Channel4, &DMA_InitStructure); 	   
    	
    	  DMA_Cmd (DMA1_Channel4,ENABLE);					//使能DMA
    
    }
    /  ADC  
    
    uint16_t SendBuff[SENDBUFF_SIZE];
    
    
    
    
    static void ADC1_GPIO_Config(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	
    	
    	/* Enable ADC1 and GPIOA clock */
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
    	
    	/* Configure PC.01  as analog input */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);				// PC1,输入时不用设置速率
    }
    
    
    /* 函数名:ADC1_Mode_Config
     * 描述  :配置ADC1的工作模式为MDA模式
     * 输入  : 无
     * 输出  :无
     * 调用  :内部调用
     */
    static void ADC1_Mode_Config(void)
    {
    	ADC_InitTypeDef ADC_InitStructure;
    	
    	/* ADC1 configuration */
    	
    	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//独立ADC模式
    	ADC_InitStructure.ADC_ScanConvMode = DISABLE ; 	 //禁止扫描模式,扫描模式用于多通道采集
    	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;	//开启连续转换模式,即不停地进行ADC转换
    	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//不使用外部触发转换
    	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 	//采集数据右对齐
    	ADC_InitStructure.ADC_NbrOfChannel = 1;	 	//要转换的通道数目1
    	ADC_Init(ADC1, &ADC_InitStructure);
    	
    	/*配置ADC时钟,为PCLK2的8分频,即9Hz*/
    	RCC_ADCCLKConfig(RCC_PCLK2_Div8); 
    	/*配置ADC1的通道0为55.	5个采样周期,序列为1 */ 
    	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
    	
    	
    	/* Enable ADC1 */
    	ADC_Cmd(ADC1, ENABLE);
    	
    	/*复位校准寄存器 */   
    	ADC_ResetCalibration(ADC1);
    	/*等待校准寄存器复位完成 */
    	while(ADC_GetResetCalibrationStatus(ADC1));
    	
    	/* ADC校准 */
    	ADC_StartCalibration(ADC1);
    	/* 等待校准完成*/
    	while(ADC_GetCalibrationStatus(ADC1));
    	
    	/* 由于没有采用外部触发,所以使用软件触发ADC转换 */ 
    	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    }
    
    
    
    
    /* 函数名:DMA_Mode_Config
     * 描述  :配置ADC1的工作模式为MDA模式
     * 输入  : 无
     * 输出  :无
     * 调用  :内部调用
     */
    static void DMA1_Mode_Config(void)
    {
    	DMA_InitTypeDef DMA_InitStructure;
    	
    		/* Enable DMA clock */
    	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    	
    	/* DMA channel1 configuration */
    	DMA_DeInit(DMA1_Channel1);
    	DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;	 //ADC地址
    	DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;//内存地址
    	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    	DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
    	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定
    	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 
    	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;	//半字
    	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;		//循环传输
    	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    	DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    	
    	/* Enable DMA channel1 */
    	DMA_Cmd(DMA1_Channel1, ENABLE);
    	
    	/* Enable ADC1 DMA */
    	ADC_DMACmd(ADC1, ENABLE);
    }
    
    
    /*
     * 函数名:ADC1_Init
     * 描述  :无
     * 输入  :无
     * 输出  :无
     * 调用  :外部调用
     */
    void ADC1_Init(void)
    {
    	ADC1_GPIO_Config();
    	ADC1_Mode_Config();
    	DMA1_Mode_Config();
    }
    
    ///
    
    
    int main(void)
    {
    	
    	/* 配置系统时钟为 72M */  
    	SystemInit();
    	
      	/* USART1 config */
    	USART1_Config();
    	DMA_USART_Init();
    	
    	/* enable adc1 and config adc1 to dma mode */
    	ADC1_Init();
    	
    	 /*串口向 DMA发出请求,开启DMA传输 */
           USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);	
    	
    	
    	
    	printf("\r\n -------这是一个ADC实验------\r\n");
    	
    	while (1)
    	{	
    	}	
    	
    }
    
    
    

     

    展开全文
  • 本文的主要内容是使用STM32F407的ADC1来采集8路通道的传感器数据,因为要定时采集,所以使用了定时器功能,另外需要开启DMA功能。首先说一下程序的思路:使用ADC的DMA功能,将ADC数据寄存器的值通过DMA传到内存的...
  • 6.DMA通道操作模式 每个 DMA 通道z通道操作模式可单独编程设定。 DMA 通道有以下基本工作模式: • 软件控制模式 • 硬件控制模式, 单次模式或连续模式 软件控制模式下, 通过置位控制位产生 DMA 通道请求。 硬件...
  • ADC(简易的DMA传输)的认识 首先看到是ADC的特性 1、ADC的12位分辨率。不能直接测量负电压,然后是最小量程化单位是LSB=Vref+/212 ...看到这张图可以看到ADC的工作方式 可以看到所有的器件都是围...
  • 关于stm32f030的DMA配置

    千次阅读 2019-07-31 09:59:26
    1.设置DMA的工作方式 2.设置通道的优先级 3.设置DMA的动作模式 4.设置外设的增量 5.设置内存是否增量 6.设置外设大小 7.设置内存大小 8.设置数据长度 9.设置外设地址 10.设置内存地址 11.使能DMA 举个栗子:从ADC值...
  • 1--STM32 ADC1与ADC2 16通道DMA采集笔记

    千次阅读 2018-10-30 16:04:14
    最近在搞ADC,网上还是很多资源的, 以下为参考链接: 1、对STM32 ADC单次转换模式 连续转换模式 ...2、STM32F103ADC的工作模式和触发方式的探索与理解: http://www.stmcu.org.cn/module/forum/thread-598744-1-...
  • 1 STM32微控制器介绍  STM32系列微控制器是ST公司基于Cortex-M3内核高集成度微控制器。它在性能、价格、功耗和实时性方面树立了一个新标杆,集成了Cortex-M3内核,以及双ADC、多...它每个通道可任意指定工作
  • 1 STM32微控制器介绍  STM32系列微控制器是ST公司基于Cortex-M3内核高集成度微控制器。它在性能、价格、功耗和实时性方面树立了一个新标杆,集成了Cortex-M3内核,以及双ADC、多...它每个通道可任意指定工作
  • 具有5个独立的DMA通道。 具有3个可以配置的DMA通道优先级。 具有31个可以配置传送触发事件。 数据传输源地址和目标地址可独立控制。 具有单独传送、数据块传送和重复传送3种数据传送模式。 数据传输长度可...
  • ADC1使用DMA2,数据流0,通道0,这个是手册固定死;...ADC2的DMA是需要通过双模式工作,然后在ADC1DR中读出32位ADC结果,高16位就是ADC2转换结果;还有ADC1和ADC2模式是可以实现同步采样。 ...
  • STM32使用DMA从串口读数据到内存

    千次阅读 2017-07-04 15:51:28
    使用DMA从串口读数据到内存和从内存搬数据到串口一样,只是要注意所使用的DMA通道不一样。 当配置好后,如果串口上有数据传输,DMA就自动把数据搬到内存中。 当工作在正常模式,DMA搬运了设定长度数据后,会产生...
  • STM32 DMA USART ADC

    2012-07-10 15:49:53
    这是一个综合例子,演示了ADC模块、DMA模块和...因为使用了自动多通道转换,数据取出工作最适合使用DMA方式取出,so,我们在内存里开辟了一个u16 AD_Value[2]数组,并设置了相应的DMA模块,使ADC在每个通道转换结
  • * 描述 :配置ADC1的工作模式DMA模式 * 输入 : 无 * 输出 :无 * 调用 :内部调用 */ static void ADC1_Mode_Config(void) { ADC_InitTypeDef ADC_InitStructure; // ADC_DMARequestModeConfig(ADC1...
  • stm32 双ADC模式

    2013-09-22 18:04:25
    stm32 双ADC模式,ADC1,ADC2通道工作DMA搬运AD转换后数据,注意DMA搬运数据长度为32位,高半个字里是ADC2数据,低半个字里是ADC1数据。
  • 大多数ARM都内嵌一个以太网控制器,支持媒体独立接口(Media IndependentInterface,MII)和带缓冲DMA接口(Buffered DMA Interface,BDI),可在半双工或全双工模式下提供10M/100Mbps以太网接入。在半双工模式下...
  • STM32 DAC工作原理

    千次阅读 2019-08-01 16:00:02
    DAC工作原理 DAC介绍 数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换...在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压...
  • 系统上电后,ADS5422一直工作,采样产生数据是否存储到IDT72V2113中,由TMS320C6203BDX0引脚状态来决定。TMS320C6203B进行初始化,外部扩展总线XCE3设置为同步FIFO读操作模式DMA通道0配置为每次传输1帧,每...
  • 【stm32f407】DAC实验

    千次阅读 2017-06-15 12:04:54
    一.描述 STM32F4的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。...在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压Vref
  • 00. 目录 文章目录00....DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独转换器。在双 DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换
  • 【STM32】DAC程序示例

    2020-09-27 17:02:31
    00. 目录 文章目录00....DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独转换器。在双 DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并
  • 3、16个DMA通道,DMA三种工作模式:禁用模式,正常模式,周期触发模式。 注意,周期触发模式,通过PIT定时中断请求传输DMA,这时只能用通道0~3 4、3个FTM模块(多功能计数器,可实现PWM/输入捕获/正交解码) (TMP...
  • 基于STM32DA转换实验

    2018-08-28 14:53:20
    STM32的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出...在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。
  • WIN7重启后修改注册表被还原

    千次阅读 2018-02-07 15:36:50
    一般win7系统都是自动默认光驱的工作模式DMA 模式!我在win7下改成PIO模式就能读了!右键我的电脑--设备管理器--IDE ATA/ATAPI--找到光驱的次要IDE通道(WIN7显示是英文 ATA Channel 0或者是1 )--右键ATA Channel...
  • 瑞萨科技推出为车辆信息终端...除了高性能图像识别处理加速器,还有一个3通道视频输入接口、支持最大WVGA尺寸(850×480像素)屏幕显示功能、一个专用6通道DMA控制器、三个定时器通道、一个2通道串行接口,以及一个用于
  • STM32 DAC配置与使用

    千次阅读 2019-05-22 09:17:42
    STM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的DAC。DAC 可以配置为 8 位或 12 位...在双DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出。DAC 可以...
  • STM32ADC基本配置

    千次阅读 2018-07-21 17:01:53
    (1)模/数转换工作于单通道...(6)设置A/D通道的转换顺序及采样时间。其中转换时间为 T.conv=采样时间+12.5个周期 (7)⑥使能DMA启动传输 ⑦使能ADC ⑧校准ADC,ADC的校准用到以下代码: /*重置ADC1的校准寄存器关...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 141
精华内容 56
关键字:

dma通道的工作模式