STM32 ADC1单通道连续转换,转换数据通过DMA传输给USART1数据寄存器并发送

  ADC单通道连续采集数据,通过DMA传输给串口发送给上位机。使用DMA传输即可让数据绕开CPU,数据不需要进出SRAM。DMA控制器使用系统总线,直接将ADC数据寄存器的数据传输给串口发送数据寄存器,对串口发送数据寄存器的写操作将触发串口传输,从而将数据发送给上位机。在DMA传输过程中,CPU可以进行其他操作,DMA与CPU分时使用系统总线。

为了让ADC1转换与串口发送同步,将DMA传输模式设置为常规(一次传输),即完成指定数量数据的传输后,DMA将自动关闭,而不再响应DMA请求(当传输模式为循环模式时,DMA配置完成后,当有DMA请求信号时,DMA便开始工作,不停地通过系统总线传输数据),打开ADC的转换完成中断,并且在中断函数中重新开启DMA。这样。ADC每完成一个数据的转换,便触发一次DMA传输,传输完成后DMA自动关闭,下一次ADC转换完成时,重新开启DMA,如此反复便实现了ADC1转换与串口发送的同步。而在整个过程中,CPU可以做其他工作。

下面为核心代码:

ADC1 GPIO配置:

    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //开启GPIOB外设时钟  (STM32在对外设寄存器操作之前需要开启相应外设时钟)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //设置为模拟输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);               //PB0为ADC1通道8模拟输入

ADC1模式配置:

    RCC_AHBPeriphClockCmd(RCC_AHB2Periph_ADC1, ENABLE);  //开启ADC1外设时钟
    ADC_InitTypeDef ADC_InitStructure;
    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_ITConfig(ADC1, ADC_IT_EOC, ENABLE);         //打开ADC1转换完成中断 

    RCC_ADCCLKConfig(RCC_PCLK2_Div8)  //配置ADC时钟,为PCLK2的8分频率
    ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5); //配置ADC1通道8,通道转换顺序为1, 转换时间为55.5个时钟周期
    ADC_DMACmd(ADC1, ENABLE);  //打开ADC1的DMA请求,即ADC转换完成后将触发DMA开始传输
    ADC_Cmd(ADC1, ENABLE);  //打开ADC1
    ADC_ResetCalibration(ADC1);   //复位校准寄存器
    while(ADC_GetResetCalibrationStatus(ADC1));  //等待校准寄存器复位完成
    ADC_StartCalibration(ADC1);                 //ADC校准
    while(ADC_GetCalibrationStatus(ADC1));      //等待ADC校准完成
    ADC_SoftwareStartConvCmd(ADC1,Enable)     //打开ADC软件触发

DMA1配置:

    DMA_InitTypeDef DMA_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //开启DMA1外设时钟
    DMA_DeInit(DMA1_Channel1);                          //默认设置
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;     //Peripheral指向 ADC1数据寄存器
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&USART1->DR;       //Memory指向 USART1发送数据寄存器
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;             //方向由 ADC——>USART1
    DMA_InitStructure.DMA_BufferSize = 2;                          //发送两个数据 (由于ADC精度为12位,数据寄存器为16位,分两个字节发送)
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;// Peripheral按字节自增1指向ADC1数据寄存器
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;       // Memory指向串口发送数据寄存器不变(串口数据宽度为8位)
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;    //数据宽度1字节
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;            //数据宽度1字节
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;        //一次传输
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;  //高优先级
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;         //禁止M2M
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    DMA_Cmd(DMA1_Channel1, ENABLE);                     //开启DMA1通道1,ADC1的DMA通道为DMA1通道1

附DMA请求映射:

串口

时间: 2024-10-19 19:53:06

STM32 ADC1单通道连续转换,转换数据通过DMA传输给USART1数据寄存器并发送的相关文章

STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)

Ⅰ.概述 本文讲述关于STM32功能比较强大的ADC模块.ADC(Analog to Digital Converter)也就是模拟量转化为数字量,而STM32的ADC模块功能比较多,本文主要讲述"三条通道逐次转换(单次.单通道软件触发)". 根据笔者的经验,STM32所有系列芯片的ADC模块功能及配置都差不多.因此,本文虽是以F1为例,其实其他系列(F0.F2.F4等)都适用. 本文提供实例代码:三条通道,配置为逐次转换(间隔模式),适用软件触发转换(每触发一次转换一条通道),一个循

对STM32 ADC单次转换模式 连续转换模式 扫描模式的理解

举例 用ADC1 规则通道的顺序为CH0,CH1,CH2,CH3, 不启动SCAN模式: 在单次转换模式下: 启动ADC1,则 1.开始转换CH1(ADC_SQR的第一通道) 转换完成后停止,等待ADC的下一次启动,继续从第一步开始转换 在连续转换模式下: 启动ADC1,则 1.开始转换CH0(ADC_SQR的第一通道) 转换完成后回到第一步,继续转换 启动SCAN模式下 在单次转换模式下: 启动ADC1,则 1.开始转换CH0. 2.转换完成后自动开始转换CH1 3.转换完成后自动开始转换CH

单表查询结果转换成泛型集合

/// <summary> /// 单表查询结果转换成泛型集合 /// </summary> /// <typeparam name="T">泛型集合类型</typeparam> /// <param name="dt">查询结果DataTable</param> /// <returns>以实体类为元素的泛型集合</returns> public static ILis

Spark2 加载保存文件,数据文件转换成数据框dataframe

hadoop fs -put /home/wangxiao/data/ml/Affairs.csv /datafile/wangxiao/ hadoop fs -ls -R /datafile drwxr-xr-x - wangxiao supergroup 0 2016-10-15 10:46 /datafile/wangxiao -rw-r--r-- 3 wangxiao supergroup 16755 2016-10-15 10:46 /datafile/wangxiao/Affairs

NSJSONSerialization 转换JSON数据的 NSJSONReadingOptions的意思

[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingOptions error:&error]; NSJSONReadingOptions有三个枚举值,具体含义如下: 1.NSJSONReadingMutableContainers :Specifies that arrays and dictionaries are created as mutable objects. 指定方法创建的数组和字典是可变的对象.(意

C#的百度地图开发(二)转换JSON数据为相应的类

原文:C#的百度地图开发(二)转换JSON数据为相应的类 在<C#的百度地图开发(一)发起HTTP请求>一文中我们向百度提供的API的URL发起请求,并得到了返回的结果,结果是一串JSON数据,我们先将这个JSON数据,使用在线工盯进行格式化. [html] view plaincopy { "status": 0, "result": [ { "x": 39.926674689976, "y": 116.4659

Spark2加载保存文件,数据文件转换成数据框dataframe

hadoop fs -put /home/wangxiao/data/ml/Affairs.csv /datafile/wangxiao/ hadoop fs -ls -R /datafile drwxr-xr-x   - wangxiao supergroup          0 2016-10-15 10:46 /datafile/wangxiao -rw-r--r--   3 wangxiao supergroup      16755 2016-10-15 10:46 /datafil

封装的转换方法,直接传入你需要转换的数据

//封装的转换方法,直接传入你需要转换的数据 + (NSString *)getJsonFromData:(id)sender { //json对象 NSString *jsonStr; //将传进来的数据转换为data NSData *jsonData = [NSJSONSerialization dataWithJSONObject:sender options:NSJSONWritingPrettyPrinted error:nil]; //数据安全判断 if (jsonData) { j

STM32的AD通道干扰问题

今天调试STM32F103的ADC,使用ADC1单次转换模式进行两通道AD采样,发现两路通道存在烦扰问题.相关AD操作代码如下: void adc_start_convert(uint8_t ch) { ADC1->SMPR2 = (ADC1->SMPR2 & 0XFFFFFFF8) | 7; ADC1->SQR3 = (ADC1->SQR3 & 0XFFFFFFE0) | ch; ADC_SoftwareStartConvCmd(ADC1, ENABLE); }