STM32F3的ADC使用DMA模式传输转换数据
来源:互联网 发布:域名被恶意投诉举报 编辑:程序博客网 时间:2024/05/22 10:39
本文使用ADC转换电位器输出的电压值,并用DMA模式传输转换的结果,每8次采样转换取平均值,做一个简单的数字滤波。
ADC的详细配置与使用
见之前的日记STM32中ADC的使用,只是最后增加一步配置DMA:
DMA for ADC channels features configuration
To enable the DMA mode for ADC channels group, use the ADC_DMACmd() function.
To configure the DMA transfer request, use ADC_DMAConfig() function.
DMA的配置
(摘自STM32F3官方用户手册UM1581 User manual)
1. Enable The DMA controller clock using
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE) function for DMA1 or using RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE) function for DMA2.
2. Enable and configure the peripheral to be connected to the DMA channel (except for internal SRAM / FLASH memories: no initialization is necessary).
3. For a given Channel, program the Source and Destination addresses, the transfer Direction, the Buffer Size, the Peripheral and Memory Incrementation mode and Data
Size, the Circular or Normal mode, the channel transfer Priority and the Memory-to-Memory transfer mode (if needed) using the DMA_Init() function.
4. Enable the NVIC and the corresponding interrupt(s) using the function
DMA_ITConfig() if you need to use DMA interrupts.
5. Enable the DMA channel using the DMA_Cmd() function.
6. Activate the needed channel Request using PPP_DMACmd() function for any PPP peripheral except internal SRAM and FLASH (ie. SPI, USART ...) The function allowing this operation is provided in each PPP peripheral driver (ie. SPI_DMACmd for SPI peripheral).
7. Optionally, you can configure the number of data to be transferred when the channel
is disabled (ie. after each Transfer Complete event or when a Transfer Error occurs) using the function DMA_SetCurrDataCounter(). And you can get the number of remaining data to be transferred using the function DMA_GetCurrDataCounter() at run time (when the DMA channel is enabled and running).
8. To control DMA events you can use one of the following two methods:
a. Check on DMA channel flags using the function DMA_GetFlagStatus().
b. Use DMA interrupts through the function DMA_ITConfig() at initialization phase and DMA_GetITStatus() function into interrupt routines in communication phase. After checking on a flag you should clear it using DMA_ClearFlag() function. And after checking on an interrupt event you should clear it using DMA_ClearITPendingBit()function.
1. Enable The DMA controller clock using
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE) function for DMA1 or using RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE) function for DMA2.
2. Enable and configure the peripheral to be connected to the DMA channel (except for internal SRAM / FLASH memories: no initialization is necessary).
3. For a given Channel, program the Source and Destination addresses, the transfer Direction, the Buffer Size, the Peripheral and Memory Incrementation mode and Data
Size, the Circular or Normal mode, the channel transfer Priority and the Memory-to-Memory transfer mode (if needed) using the DMA_Init() function.
4. Enable the NVIC and the corresponding interrupt(s) using the function
DMA_ITConfig() if you need to use DMA interrupts.
5. Enable the DMA channel using the DMA_Cmd() function.
6. Activate the needed channel Request using PPP_DMACmd() function for any PPP peripheral except internal SRAM and FLASH (ie. SPI, USART ...) The function allowing this operation is provided in each PPP peripheral driver (ie. SPI_DMACmd for SPI peripheral).
7. Optionally, you can configure the number of data to be transferred when the channel
is disabled (ie. after each Transfer Complete event or when a Transfer Error occurs) using the function DMA_SetCurrDataCounter(). And you can get the number of remaining data to be transferred using the function DMA_GetCurrDataCounter() at run time (when the DMA channel is enabled and running).
8. To control DMA events you can use one of the following two methods:
a. Check on DMA channel flags using the function DMA_GetFlagStatus().
b. Use DMA interrupts through the function DMA_ITConfig() at initialization phase and DMA_GetITStatus() function into interrupt routines in communication phase. After checking on a flag you should clear it using DMA_ClearFlag() function. And after checking on an interrupt event you should clear it using DMA_ClearITPendingBit()function.
重要代码:
#include "ADC_DMA.h"#define DATANUM 8uint8_t FLAG = 0; //转换次数标志位uint16_t CONV_RESULTS[DATANUM];void ADC_Config(void){ADC_InitTypeDef ADC_InitStructure;ADC_CommonInitTypeDef ADC_CommonInitStructure;RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12,ENABLE);//GPIO_Config();//实现采样输入引脚的配置,配置为模拟输入模式//......其他ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2;ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;//.......其他ADC_CommonInit(USING_ADC,&ADC_CommonInitStructure);//ADC Init,ADC_Init(USING_ADC,&ADC_InitStructure);ADC_ITConfig(USING_ADC, ADC_IT_EOC, ENABLE);//开中断ADC_DMAConfig(USING_ADC, ADC_DMAMode_Circular);//配置ADC_DMA,非常重要ADC_DMACmd(USING_ADC, ENABLE);//打开ADC_DMADMA_Config();ADC_Cmd(USING_ADC,ENABLE);while(!ADC_GetFlagStatus(USING_ADC, ADC_FLAG_RDY));ADC_StartConversion(USING_ADC); }void GPIO_Config(void){//.......//......}void DMA_Config(void){DMA_InitTypeDef DMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_DATA_ADDR;//ADC数据寄存器DR的地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&CONV_RESULTS;//存放转换结果的地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = DATANUM;//.....DMA_Init(DMA1_Channel1, &DMA_InitStructure);DMA_Cmd(DMA1_Channel1, ENABLE);}void ADC1_2_IRQHandler (void){FLAG++;//在主函数中检查FLAG 并惊醒处理//计算转换数据的个数if(FLAG>DATANUM-1){FLAG=0;}ADC_ClearITPendingBit(USING_ADC, ADC_IT_EOC);}//获取转换结果的平均值,做滤波处理uint16_t GetAverage(void){u8 i=0;u16 average=0;u32 sum=0,voltage=0;for(i=0;i<DATANUM;i++){sum += CONV_RESULTS[i];}average = sum/DATANUM;voltage = average*3300/0xFFF;return voltage;}//配置中断void NVIC_Config(void){NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel =ADC1_IRQn;//........NVIC_Init(&NVIC_InitStruct);}
源码下载:
http://download.csdn.net/detail/wind4study/8674381
wind
2015,05,08
0 0
- STM32F3的ADC使用DMA模式传输转换数据
- STM32F3使用USART串口DMA发送数据,使用蓝牙发送
- ADC采集数据(DMA模式)
- STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置
- STM32 ADC—DMA传输
- STM32:ADC采集数据实例(采用DMA模式)
- STM32F1xx 多路ADC 使用DMA转换结果顺序错乱问题
- STM32F4 ADC模块使用不同DMA模式的区别和对比
- stm32f3的i2c使用小结
- stm32f3的i2c使用小结
- STM32通过TIM,ADC,DMA的配合使用实现双通道数据采样
- STM32F407 单通道ADC采样,DMA传输
- STM32 ADC DMA,UART利用DMA传送ADC数据
- STM32F4 ADC采集数据的DMA数据传输【库函数操作】
- stm32 adc dma多通道采样 数据错位 的解决方法
- STM32 使用DMA处理ADC
- DMA+LeUart传输数据
- stm32f4 ADC DMA 模式 中断进不去解决
- 哈希技术杂烩
- 如何在关闭ssh连接的情况下,让程序继续在后台运行?
- svn: Can't convert string from 'UTF-8' to native encoding 的解决办法
- eclipse启动时卡住org.eclipse.jdt.debug
- zoj 3497 Mistwald 矩阵快速幂
- STM32F3的ADC使用DMA模式传输转换数据
- listview
- 双击实体弹出对话框(重载AcDbDoubleClickEdit)
- unity中的http通信
- MyEclipse 2015优化技巧
- MVC缓存依赖:文件依赖
- 详谈 Unity3D 利用 Webservice 读取数据库
- 自动重置事件+临界区实现线程间同步
- 安卓基础 论MediaPlayer的应用(一)