STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置

发布者:温暖阳光最新更新时间:2020-02-19 来源: eefocus关键字:STM32F0  定时器触发  ADC  多通道采样  DMA传输数据  配置 手机看文章 扫描二维码
随时随地手机看文章

本块代码实现了定时器定时触发ADC,多通道采样,并通过DMA进行数据传输到内存的操作。

#include    "adc.h"  

#define DMA_BUFFER_SIZE     6  

uint8 sample_finish = 0;  

int16 adc_dma_tab[6] = { 0 };  

uint8 sample_index = 0;  

  

//采样点数据  

int16 sample_1[128] = { 0 };  

int16 sample_2[128] = { 0 };  

int16 sample_3[128] = { 0 };  

int16 sample_4[128] = { 0 };  

int16 sample_5[128] = { 0 };  

int16 sample_6[128] = { 0 };  

  

void user_adc_init()  

{  

    adc_gpio_init();  

    adc_config();               // 注意此处的初始化顺序,否则采样传输的数据容易出现数据错位的结果  

    adc_dma_init();             //  

    adc_timer_init();           //  

  

}  

  

void adc_config()  

{  

    ADC_InitTypeDef adc_init_structure;  

  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);            //使能ADC时钟  

  

    ADC_DeInit(ADC1);                                               //复位ADC  

    ADC_StructInit(&adc_init_structure);                            //初始化ADC结构体  

  

    adc_init_structure.ADC_ContinuousConvMode = DISABLE;            //禁用连续转换模式  

    adc_init_structure.ADC_DataAlign = ADC_DataAlign_Right;         //采样数据右对齐  

    adc_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO; //外部触发设置为TIM2  

    adc_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;//上升沿触发  

    adc_init_structure.ADC_Resolution = ADC_Resolution_12b;         //12位分辨率  

    adc_init_structure.ADC_ScanDirection = ADC_ScanDirection_Upward;//向上扫描0-18通道  

    ADC_Init(ADC1, &adc_init_structure);  

  

    ADC_OverrunModeCmd(ADC1, ENABLE);                               //使能数据覆盖模式  

    ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1 | ADC_Channel_2  

                          | ADC_Channel_8 | ADC_Channel_14 | ADC_Channel_15,  

                          ADC_SampleTime_13_5Cycles);               //配置采样通道,采样时间125nS  

    ADC_GetCalibrationFactor(ADC1);                                 //使能前校准ADC  

    ADC_Cmd(ADC1, ENABLE);                                          //使能ADC1  

    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN) == RESET);         //等待ADC1使能完成  

  

    ADC_DMACmd(ADC1, ENABLE);                                       //使能ADC_DMA  

    ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);           //配置DMA请求模式为循环模式  

    ADC_StartOfConversion(ADC1);                                    //开启一次转换(必须)  

}  

  

void adc_gpio_init()  

{  

    GPIO_InitTypeDef gpio_init_structure;  

    //使能GPIO时钟  

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC, ENABLE);  

  

    GPIO_StructInit(&gpio_init_structure);  

    //GPIOA                                                         //PA-0~3用作ADC  

    gpio_init_structure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);  

    gpio_init_structure.GPIO_Mode = GPIO_Mode_AN;                   //使用附加(模拟)功能  

    gpio_init_structure.GPIO_OType = GPIO_OType_PP;                 //推挽输出  

    gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz;              //Fast speed  

    gpio_init_structure.GPIO_PuPd= GPIO_PuPd_UP;                    //上拉  

    GPIO_Init(GPIOA, &gpio_init_structure);  

    //GPIOB  

    gpio_init_structure.GPIO_Pin = GPIO_Pin_0;                      //PB-0 用作ADC  

    GPIO_Init(GPIOB, &gpio_init_structure);  

    //GPIOC  

    gpio_init_structure.GPIO_Pin = (GPIO_Pin_4 | GPIO_Pin_5);       //PC-4~5用作ADC  

    GPIO_Init(GPIOC, &gpio_init_structure);  

}  

  

void adc_dma_init()  

{  

    DMA_InitTypeDef dma_init_structure;  

    NVIC_InitTypeDef nvic_init_structure;  

  

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);              //使能DMA时钟  

  

    nvic_init_structure.NVIC_IRQChannel = DMA1_Channel1_IRQn;       //选择DMA1通道中断  

    nvic_init_structure.NVIC_IRQChannelCmd = ENABLE;                //中断使能  

    nvic_init_structure.NVIC_IRQChannelPriority = 0;                //优先级设为0  

    NVIC_Init(&nvic_init_structure);  

  

    DMA_DeInit(DMA1_Channel1);                                      //复位DMA1_channel1  

    DMA_StructInit(&dma_init_structure);                            //初始化DMA结构体  

  

    dma_init_structure.DMA_BufferSize = DMA_BUFFER_SIZE;            //DMA缓存数组大小设置  

    dma_init_structure.DMA_DIR = DMA_DIR_PeripheralSRC;             //DMA方向:外设作为数据源  

    dma_init_structure.DMA_M2M = DISABLE;                           //内存到内存禁用  

    dma_init_structure.DMA_MemoryBaseAddr = (uint32)&adc_dma_tab[0];//缓存数据数组起始地址  

    dma_init_structure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//数据大小设置为Halfword  

    dma_init_structure.DMA_MemoryInc = DMA_MemoryInc_Enable;        //内存地址递增  

    dma_init_structure.DMA_Mode = DMA_Mode_Circular;                //DMA循环模式,即完成后重新开始覆盖  

    dma_init_structure.DMA_PeripheralBaseAddr = (uint32) &(ADC1->DR);//取值的外设地址  

    dma_init_structure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设取值大小设置为Halfword  

    dma_init_structure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址递增禁用  

    dma_init_structure.DMA_Priority = DMA_Priority_High;             //DMA优先级设置为高  

    DMA_Init(DMA1_Channel1, &dma_init_structure);  

  

    DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);                  //使能DMA中断  

    DMA_ClearITPendingBit(DMA_IT_TC);                                //清除一次DMA中断标志  

    DMA_Cmd(DMA1_Channel1, ENABLE);                                  //使能DMA1  

}  

  

void adc_timer_init()  

{  

    TIM_TimeBaseInitTypeDef timer_init_structure;  

    NVIC_InitTypeDef nvic_init_structure;  

  

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  //使能TIM2时钟  

  

    nvic_init_structure.NVIC_IRQChannel = TIM2_IRQn;      //选择TIM2中断通道  

    nvic_init_structure.NVIC_IRQChannelCmd = ENABLE;      //使能TIM2中断  

    nvic_init_structure.NVIC_IRQChannelPriority = 0;      //优先级为0  

    NVIC_Init(&nvic_init_structure);  

  

    TIM_DeInit(TIM2);                                     //复位TIM2  

[1] [2]
关键字:STM32F0  定时器触发  ADC  多通道采样  DMA传输数据  配置 引用地址:STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置

上一篇:STM32L151 IAP过程记录
下一篇:stm32l151 ADC通过DMA通道定时采样电池电量

推荐阅读最新更新时间:2024-11-16 20:08

IAR for AVR 配置JTAGICE mkII仿真时不擦EEPROM
{业务提出的需要} 有时我们想在仿真时,依然可以使用EEPROM中配置好的参数,而不是每次仿真时都重新设置。 {配置方法} 工程- 右键- Debugger - JTAGICE mkII - JTAGICE mkII2 选中 Preserve EEPROM contents even if device is reprogrammed 如下
[单片机]
IAR for AVR <font color='red'>配置</font>JTAGICE mkII仿真时不擦EEPROM
一种基于开关逻辑结构的低功耗SAR ADC的设计
  逐次逼近型模数转换器(successive approximati ON regi ST er analog-to-digital converter,SAR ADC)是应用于采样速率低于5,MHz 的中高分辨率的常见结构,其分辨率一般为8~16 位,因制造工艺与现代数字C MOS 工艺的兼容性好,且易于在较低的工艺成本下实现,所以广泛应用于现代超大规模 集成电路 与片上系统(system-on-chip,SOC),如便携式/ 电池 供电 仪表 、笔输入量化器、工业控制和数据/信号 采集器 等。   笔者设计了一款10位低功耗SAR ADC,采用温度计码控制的开关逻辑结构代替传统的开关阵列控制数模(digital-t
[电源管理]
一种基于开关逻辑结构的低功耗SAR <font color='red'>ADC</font>的设计
基于VerilogHDL的CMOS图像敏感器驱动电路设计
       CMOS图像敏感器是近年来兴起的一类固态图像传感器。CMOS图像敏感器具有低成本、低功耗(是CCD耗的1/1000~1/100)、简单的数字接口、随机访问、运行简易(单一的CMOS兼容电池供给)、高速率(可大于1000帧/秒)、体积小以及通过片上信号处理电路可以实现智能处理功能等特点而得到广泛应用。有些CMOS图像敏感器具有标准的I2C总线接口,可方便应用到系统中。有些没有这类总线接口电路的专用CMOS图像敏感器需要增加外部驱动电路。由于CMOS敏感器的驱动信号绝大部分是数字信号,因此可采用FPCA通过Verilog HDL语言编程产生驱动时序信号。Verilog HDL语言是IEEE标准的用于逻辑设计的硬件描述语言
[嵌入式]
STM32F4系列HAL库配置定时器实验——输入捕获
输入捕获简单讲解 输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量周期和频率为例,用一个简图来说明输入捕获的原理 假定定时器工作在向上计数模式, 图中 t1~t2 时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x 为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道 x为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。 在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数
[单片机]
STM32F4系列HAL库<font color='red'>配置</font><font color='red'>定时器</font>实验——输入捕获
2019款丰田Avalon配置环视摄像头 边界扫描功能助力夜间停车
据外媒报道,2019款丰田Avalon配置了新款功能,可在停车时提供助力。该技术取名为带有边界扫描(Perimeter Scan)功能的鸟瞰图摄像头,该设备最早亮相于2016款RAV 4车型。用户只需点击该图标,就能启动该功能,旨在为用户的停车操作提供辅助。 安装于车侧、前后车身的摄像头为车辆提供了周边环境的合成视图(composite view),其视图酷似车辆边界的实时视频,边界扫描可提供类似实时视频的环视动态图。 在大多数情况下,用户可利用该功能查看车辆周边是否有障碍物。用户还能利用该功能,查看用户车辆与其他车辆是否间距过近,查看是否有其他车辆或行人在接近中,并查看路面是否有破酒瓶之类的障碍物。 边界扫描还有另一
[汽车电子]
微软暗示Surface Duo 2双屏配置规格:升级了摄像头
3月1日消息 外媒 Windows Latest 报道,Surface Duo 是微软在美国和欧洲地区推出的第一款双屏手机。Surface Duo 收到的评价褒贬不一,根据我们最近发现的列表,该公司似乎正在准备推出支持 “5G”和改进相机的下一代双屏手机。 微软的招聘网站上的一些新的信息给出了强烈的暗示,即微软正在开发代号为 “Zeta”的 Surface Duo 2,并支持5G 连接。“Zeta”意思包括希腊第六个字母(Z;ζ)。 现在微软已经删除了大部分招聘信息,但在微软招聘页面上至少还有一则招聘信息存在,而且是在中国台湾地区寻找 SW/FW 二级工程师。在招聘信息中,微软指出,它正在进行 “用 Surface Duo 创
[手机便携]
小米5c高清谍照流出 硬件配置也看光
   近段时间,除了小米Note2以外,又传出小米一款神秘新机的谍照,据称是小米5c。现在又有该机更多的高清谍照曝光,正面观感相当不错,屏占比较高,机身背面则采用了三段式金属机身设计,色差略明显。另外曝光的系统图片中也泄露了一部分硬件配置的参数。   跟之前曝光的谍照一样,这次出现的小米5c同样是黑色版本,搭配黑色的壁纸和2.5D玻璃,整机从正面来看颜值颇高,就是不知道如果换了浅色壁纸后黑边现象如何。Home键部分则是采用了小米5细长的物理按键方案,应该还集成了指纹识别功能。手机的背面为三段式金属机身设计,上下两段进行了注塑处理。     在曝光的系统信息界面中显示,这款新机型号为:Meri,搭载乐一颗主频最高
[手机便携]
构建具有负时间常数的数字可编程增益放大器
数字可编程增益放大器(DPGA)放大或减弱模拟信号,可最大限度地扩大模数转换器(ADC)的动态范围。大多数单片DPGA都在运算放大器的反馈环路中使用了多路复用乘法数模转换器(DAC),如Maxim LTC6910和National Semiconductor LPM8100,以便DAC的输入代码可以设置放大器的闭环增益。不使用单片DPGA,而是使用两个运算放大器和三个模拟开关来构建基于负时间常数的DPGA。 无疑,工程师对e–t/RC 收敛指数非常熟悉,其中RC电路内的电容器以渐进方式放电到零。对于输入VIN,在t = T = loge(2)RC时V = VIN/2,在t = 2T时V = VIN /4,在t =3T时V =
[电源管理]
构建具有负时间常数的数字可编程增益放大器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved