外部adc的adc数据平台下载为什么先缓存再传给cpu

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
积极向上,勤奋好学。以上是废话。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(6534)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'STM32 ADC结合DMA数据采样与软件滤波处理',
blogAbstract:'本文原创于观海听涛,原作者版权所有,转载请注明出处。作为一个偏向工控的芯片,ADC采样是一个十分重要的外设。STM32集成三个12位精度18通道的内部ADC,最高速度1微秒,结合DMA可以解放CPU进行更好的处理。ADC接口上的其它逻辑功能包括:●同步的采样和保持●交叉的采样和保持●单次采样模拟看门狗功能允许非常精准地监视一路、多路或所有选中的通道,当被监视的信号超出预置的阀值时,将产生中断。由标准定时器(TIMx)和高级控制定时器(TIM1和TIM8)产生的事件,可以分别内部级联到ADC的开始触发和注入触发,应用程序能使AD转换与时钟同步。12位ADC是一种逐次逼近型模拟数字数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。',
blogTag:'adc结合dma',
blogUrl:'blog/static/1',
isPublished:1,
istop:false,
modifyTime:1,
publishTime:3,
permalink:'blog/static/1',
commentCount:2,
mainCommentCount:2,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'积极向上,勤奋好学。以上是废话。',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】 - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 6626|回复: 9
新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】
在线时间0 小时
主题帖子好友
新手上路, 积分 25, 距离下一级还需 25 积分
新手上路, 积分 25, 距离下一级还需 25 积分
用STM32F051调试AD转换程序,出来的数据一直是0.0V,不知道哪边有问题,以下是程序代码,请游过的大虾帮帮忙呗,万分感激!!
#include &stm32f0xx.h&
//这个头文件包括STM32F0xx所有外围寄存器、位、内存映射的定义
#include &delay.h&
#include &type_def.h&
USART1_BaudRate
#define ADC1_DR_Address
//用来存放ADC转换结果,也是DMA的目标地址
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker-&Libraries-&Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/*GPIO管脚的配置
选用ADC的通道9,分别对应的管脚为PB1
串口使用USART1其中TX为PA9,RX为PA10 */
void GPIO_Configuration(void)
GPIO_InitTypeDef
GPIO_InitS
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
//PB1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
//模拟输入引脚
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*USART1管脚的配置
串口使用USART1其中TX为PA9,RX为PA10 */
void USART_Configuration(void)
GPIO_InitTypeDef
GPIO_InitS
USART_InitTypeDef USART_InitS
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
USART1_TX -& PA9 , USART1_RX -&
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = USART1_BaudR
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
/*配置ADC1*/
void ADC1_Configuration(void)
ADC_InitTypeDef
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );
ADC_DeInit(ADC1);
//将外设 ADC1 的全部寄存器重设为缺省值
ADC_StructInit(&ADC_InitStructure);
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
//ADC1分辨率12位
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
//模数转换工作在连续转换模式
ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_N
//外部触发转换关闭
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
//ADC数据右对齐
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_B
//顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);
//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_ChannelConfig(ADC1, ADC_Channel_9, ADC_SampleTime_239_5Cycles );
ADC_GetCalibrationFactor(ADC1);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
//使能指定的ADC1
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
//获取指定ADC1的校准程序,设置状态则等待
ADC_StartOfConversion(ADC1);
/*配置DMA*/
void DMA_Configuration(void)
DMA1 Channel Config */
DMA_InitTypeDef DMA_InitS
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
//将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr =
(u32)ADC1_DR_A
//DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)AD_V
//DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//内存作为数据传输的目的地
DMA_InitStructure.DMA_BufferSize = 2;
//DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D
//外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E
//内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
//数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW //数据宽度为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_C
//工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_H //DMA通道 x拥有高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_D
//DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
//根据DMA_InitStruct中指定的参数初始化DMA的通道
DMA_Cmd(DMA1_Channel1, ENABLE);
ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
ADC_DMACmd(ADC1, ENABLE);
//配置所有外设
void Init_All_Periph(void)
GPIO_Configuration();
USART_Configuration();
DMA_Configuration();
ADC1_Configuration();
/*获取ADC的值,将二进制换算为十进制*/
u16 GetVolt(u16 advalue)
return (u16)(advalue * 330 / 4096);
//求的结果扩大了100倍,方便下面求出小数
PUTCHAR_PROTOTYPE
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART1, (uint8_t) ch);
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
int main(void)
Init_All_Periph();
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待传输完成否则第一位数据容易丢失
value = GetVolt(AD_Value);
printf(&value:\t%d.%dv\n
&,value/100,value%100) ;
Delay_ms(100);
欢迎加入STM32/STM8社区技术交流群:& & &STM32Lxx开发群:
在线时间0 小时
主题帖子好友
初级会员, 积分 194, 距离下一级还需 6 积分
初级会员, 积分 194, 距离下一级还需 6 积分
回复:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)AD_V&&//DMA内存基地址
这句话有问题,你应该把AD-Value的地址赋值过去,而不是把AD_Value的内容赋值过去,改成这样试试 DMA_InitStructure.DMA_MemoryBaseAddr = (&AD_Value);
在线时间0 小时
主题帖子好友
新手上路, 积分 25, 距离下一级还需 25 积分
新手上路, 积分 25, 距离下一级还需 25 积分
RE:新手求助~~~STM32F051 ADC出来的数据一直为0
欢迎加入STM32/STM8社区技术交流群:& & &STM32Lxx开发群:
在线时间0 小时
主题帖子好友
新手上路, 积分 25, 距离下一级还需 25 积分
新手上路, 积分 25, 距离下一级还需 25 积分
RE:新手求助~~~STM32F051 ADC出来的数据一直为0
在线等大婶的到来
在线时间1 小时
主题帖子好友
金牌会员, 积分 2728, 距离下一级还需 2272 积分
金牌会员, 积分 2728, 距离下一级还需 2272 积分
回复:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】
社区第3期悬赏问答活动开始咯~详见:
无论你是大神还是大婶,都快来帮忙吧!
欢迎加入STM32/STM8社区技术交流群:& & &STM32Lxx开发群:
在线时间11 小时
主题帖子好友
RE:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】
不知到你有没有好好的看一下,官方的例程呢
#define ADC1_DR_Address
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
__IO uint16_t
ADC1ConvertedValue = 0, ADC1ConvertedVoltage = 0;
__IO uint16_t RegularConvData_Tab[4];
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
Main program.
* @retval None
int main(void)
/*!& At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f0xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f0xx.c file
/* LCD Display init
Display_Init();
/* ADC1 and DMA configuration */
ADC1_DMA_Config();
/* Infinite loop */
/* Test DMA1 TC flag */
while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET );
/* Clear DMA TC flag */
DMA_ClearFlag(DMA1_FLAG_TC1);
/* Display converted data on the LCD */
Display();
ADC1 channel with DMA configuration
* @retval None
void ADC1_DMA_Config(void)
ADC_InitTypeDef
GPIO_InitTypeDef
GPIO_InitS
DMA_InitTypeDef
/* ADC1 DeInit */
ADC_DeInit(ADC1);
/* GPIOC Periph clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
/* ADC1 Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/* DMA1 clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
/* Configure ADC Channel11 as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* DMA1 Channel1 Config */
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_A
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RegularConvData_T
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 4;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW
DMA_InitStructure.DMA_Mode = DMA_Mode_C
DMA_InitStructure.DMA_Priority = DMA_Priority_H
DMA_InitStructure.DMA_M2M = DMA_M2M_D
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* DMA1 Channel1 enable */
DMA_Cmd(DMA1_Channel1, ENABLE);
/* ADC DMA request in circular mode */
ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
/* Enable ADC_DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Initialize ADC structure */
ADC_StructInit(&ADC_InitStructure);
/* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_N
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_B
ADC_Init(ADC1, &ADC_InitStructure);
/* Convert the ADC1 Channel 1 with 55.5 Cycles as sampling time */
ADC_ChannelConfig(ADC1, ADC_Channel_11 , ADC_SampleTime_55_5Cycles);
/* Convert the ADC1 temperature sensor
with 55.5 Cycles as sampling time */
ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);
ADC_TempSensorCmd(ENABLE);
/* Convert the ADC1 Vref
with 55.5 Cycles as sampling time */
ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_55_5Cycles);
ADC_VrefintCmd(ENABLE);
/* Convert the ADC1 Vbat with 55.5 Cycles as sampling time */
ADC_ChannelConfig(ADC1, ADC_Channel_Vbat , ADC_SampleTime_55_5Cycles);
ADC_VbatCmd(ENABLE);
/* ADC Calibration */
ADC_GetCalibrationFactor(ADC1);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Wait the ADCEN falg */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
/* ADC1 regular Software Start Conv */
ADC_StartOfConversion(ADC1);
Display ADC converted value on LCD
* @retval None
void Display(void)
uint32_t v=0,mv=0;
uint8_t text[50],
/* Set the LCD Back Color and Text Color*/
LCD_SetBackColor(White);
LCD_SetTextColor(Green);
for(index=0;index
在线时间0 小时
主题帖子好友
新手上路, 积分 196, 距离下一级还需 -146 积分
新手上路, 积分 196, 距离下一级还需 -146 积分
RE:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】
不懂,学习学习。
欢迎加入STM32/STM8社区技术交流群:& & &STM32Lxx开发群:
在线时间4 小时
主题帖子好友
RE:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】
尝试吧DMA关掉,然后一步一步调试观察。
在线时间0 小时
主题帖子好友
初级会员, 积分 58, 距离下一级还需 142 积分
初级会员, 积分 58, 距离下一级还需 142 积分
RE:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】
6楼说的对,我看官方的是个数组,数组名本身就是个地址,而你的AD_VALUE只是个数据!所以没有数据传到AD_VALUE这个变量,只能是0,DMA只是负,内存和CPU ,内存和内存,内存和外设通道之间的数据传输,其实你想得到的AD_VALUE值,是DMA负责从AD通道寄存器那取回来的,其实你也可以自己取,等它AD转换完,你自己手动就可以数据寄存器中拿回来!
欢迎加入STM32/STM8社区技术交流群:& & &STM32Lxx开发群:
在线时间0 小时
主题帖子好友
新手上路, 积分 10, 距离下一级还需 40 积分
新手上路, 积分 10, 距离下一级还需 40 积分
RE:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】
我用没问题,1年了,不知道是否还需要回答?
站长推荐 /3
为让大家更好的使用STM32单片机,特别是学生群体有进一步的提升,特推出本次助学计划。愿开发板可以物尽其用,发挥最大价值。
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by1065人阅读
STM32(1)
第一次写博客,奉献给STM32了,一直以来都是潜水看博客,希望能够自己也能写一点东西,对自己学习和工作的一个总结,希望能够坚持下去。
项目背景:以57.6kbps的速率采集两个通道的数据
芯片:STM32F205VCT6
总体的思路通过57.6kHz的定时器去触发ADC采样,采样后的数据在通过DMA存放于缓冲区定时产生中断。
由于需要产生57.6KHz的频率,晶振选择9.6MKHz,CPU主频为115.2MHz。
STEP1:配置定时器
通过TIM2去触发两路ADC,详见配置如下
void TIM2_Configuration(void)
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure
TIM_OCInitTypeDef TIM_OCInitStructure
RCC_APB1PeriphClockCmd ( RCC_APB1Periph_TIM2 , ENABLE )
TIM_DeInit ( TIM2 )
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1
TIM_TimeBaseStructure.TIM_Period
= (/(ADC_SAMPLING_MUL*AIS_MODUL_RATE) - 1 )
TIM_TimeBaseStructure.TIM_Prescaler
= ( 1 - 1 )
TIM_TimeBaseStructure.TIM_CounterMode
= TIM_CounterMode_Up
TIM_TimeBaseInit ( TIM2, &TIM_TimeBaseStructure )
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable
TIM_OCInitStructure.TIM_Pulse = 1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low
TIM_OC2Init(TIM2, &TIM_OCInitStructure)
//TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE)
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable
TIM_OCInitStructure.TIM_Pulse = 1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low
TIM_OC3Init(TIM2, &TIM_OCInitStructure)
// TIM_ITConfig(TIM2,TIM_IT_CC3,ENABLE)
TIM_Cmd ( TIM2, ENABLE )
TIM_InternalClockConfig(TIM2)
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable)
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable)
TIM_UpdateDisableConfig(TIM2, DISABLE)
STEP2:配置ADC
首先需要配置GPIO复用
//GPIO -PB0 PB1 -ADC1 ADC2
GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_0 | GPIO_Pin_1
GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_AN
GPIO_InitStructure.GPIO_PuPd
= GPIO_PuPd_NOPULL
GPIO_InitStructure.GPIO_Speed
= GPIO_Speed_50MHz
GPIO_Init ( GPIOB, &GPIO_InitStructure )
然后配置ADC
void ADC_Configuration(void)
ADC_InitTypeDef
ADC_InitStructure
ADC_CommonInitTypeDef ADC_CommonInitStructure
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 , ENABLE)
//ADC Common Init
ADC_CommonInitStructure.ADC_Mode
= ADC_Mode_Independent
ADC_CommonInitStructure.ADC_Prescaler
= ADC_Prescaler_Div4
ADC_CommonInitStructure.ADC_DMAAccessMode
= ADC_DMAAccessMode_Disabled
ADC_CommonInitStructure.ADC_TwoSamplingDelay
= ADC_TwoSamplingDelay_20Cycles
ADC_CommonInit(&ADC_CommonInitStructure)
//ADC1 Init
ADC_InitStructure.ADC_Resolution
= ADC_Resolution_12b
ADC_InitStructure.ADC_ScanConvMode
ADC_InitStructure.ADC_ContinuousConvMode
ADC_InitStructure.ADC_ExternalTrigConvEdge
= ADC_ExternalTrigConvEdge_Rising
ADC_InitStructure.ADC_ExternalTrigConv
= ADC_ExternalTrigConv_T2_CC2
ADC_InitStructure.ADC_DataAlign
= ADC_DataAlign_Right
ADC_InitStructure.ADC_NbrOfConversion
ADC_Init(ADC1, &ADC_InitStructure)
// ADC1 regular channel 8 configuration
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_144Cycles)
//Enable DMA request after last transfer (Single-ADC mode)
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE)
//Enable ADC1 DMA
ADC_DMACmd(ADC1, ENABLE)
// Enable ADC1
ADC_Cmd(ADC1, ENABLE)
// ADC2 Init
ADC_InitStructure.ADC_Resolution
= ADC_Resolution_12b
ADC_InitStructure.ADC_ScanConvMode
ADC_InitStructure.ADC_ContinuousConvMode
ADC_InitStructure.ADC_ExternalTrigConvEdge
= ADC_ExternalTrigConvEdge_Rising
ADC_InitStructure.ADC_ExternalTrigConv
= ADC_ExternalTrigConv_T2_CC3
ADC_InitStructure.ADC_DataAlign
= ADC_DataAlign_Right
ADC_InitStructure.ADC_NbrOfConversion
ADC_Init(ADC2, &ADC_InitStructure)
// ADC2 regular channel 9 configuration
ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 1, ADC_SampleTime_144Cycles)
// Enable DMA request after last transfer (Single-ADC mode)
ADC_DMARequestAfterLastTransferCmd(ADC2, ENABLE)
// Enable ADC2 DMA
ADC_DMACmd(ADC2, ENABLE)
// Enable ADC2
ADC_Cmd(ADC2, ENABLE)
STEP3 配置DMA
首先定义DMA中断标志和缓冲区的定义,其中DMA采用乒乓BUF的方式存储和读取数据。
#define DMA_ADC_BUF_BIT
= 96 //该数据定义了多长时间产生一次DMA中断
Dma2Stream0Flag
Dma2Stream2Flag
Adc1Buf0[DMA_ADC_BUF_BIT]
Adc1Buf1[DMA_ADC_BUF_BIT]
Adc2Buf0[DMA_ADC_BUF_BIT]
Adc2Buf1[DMA_ADC_BUF_BIT]
然后对DMA进行参数配置
void DMA2_Configuration(void)
DMA_InitTypeDef DMA_InitStructure
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE)
//DMA2 Stream0 channel0 configuration------ADC1
DMA_InitStructure.DMA_Channel
= DMA_Channel_0
DMA_InitStructure.DMA_PeripheralBaseAddr
= (Uint32)&ADC1-&DR
DMA_InitStructure.DMA_Memory0BaseAddr
= (Uint32)Adc1Buf0
DMA_InitStructure.DMA_DIR
= DMA_DIR_PeripheralToMemory
DMA_InitStructure.DMA_BufferSize
= DMA_ADC_BUF_BIT
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_FIFOMode
= DMA_FIFOMode_Enable
DMA_InitStructure.DMA_FIFOThreshold
= DMA_FIFOThreshold_Full
DMA_InitStructure.DMA_MemoryBurst
= DMA_MemoryBurst_Single
DMA_InitStructure.DMA_PeripheralBurst
= DMA_PeripheralBurst_Single
//DMA double buffer mode
DMA_DoubleBufferModeConfig(DMA2_Stream0,(Uint32)Adc1Buf1,DMA_Memory_0)
DMA_DoubleBufferModeCmd(DMA2_Stream0,ENABLE)
DMA_Init(DMA2_Stream0, &DMA_InitStructure)
DMA_ITConfig( DMA2_Stream0, DMA_IT_TC, ENABLE )
DMA_ClearITPendingBit ( DMA2_Stream0, DMA_IT_TCIF0 )
DMA_Cmd(DMA2_Stream0, ENABLE)
//DMA2 Stream2 channel1 configuration------ADC2
DMA_InitStructure.DMA_Channel
= DMA_Channel_1
DMA_InitStructure.DMA_PeripheralBaseAddr
= (Uint32)&ADC2-&DR
DMA_InitStructure.DMA_Memory0BaseAddr
= (Uint32)Adc2Buf0
DMA_InitStructure.DMA_DIR
= DMA_DIR_PeripheralToMemory
DMA_InitStructure.DMA_BufferSize
= DMA_ADC_BUF_BIT
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_FIFOMode
= DMA_FIFOMode_Enable
DMA_InitStructure.DMA_FIFOThreshold
= DMA_FIFOThreshold_Full
DMA_InitStructure.DMA_MemoryBurst
= DMA_MemoryBurst_Single
DMA_InitStructure.DMA_PeripheralBurst
= DMA_PeripheralBurst_Single
DMA_DoubleBufferModeConfig(DMA2_Stream2,(Uint32)Adc2Buf1,DMA_Memory_0)
DMA_DoubleBufferModeCmd(DMA2_Stream2,ENABLE)
DMA_Init(DMA2_Stream2, &DMA_InitStructure)
DMA_ITConfig( DMA2_Stream2, DMA_IT_TC, ENABLE )
DMA_ClearITPendingBit ( DMA2_Stream2, DMA_IT_TCIF2 )
DMA_Cmd(DMA2_Stream2, ENABLE)
最后再去定义DMA的中断优先级,中断入口函数以及数据的使用
void NVIC_Configuration ( void )
NVIC_InitTypeDef
NVIC_InitS
NVIC_PriorityGroupConfig ( NVIC_PriorityGroup_2 );
NVIC_InitStructure.NVIC_IRQChannel
= DMA2_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
NVIC_InitStructure.NVIC_IRQChannelSubPriority
NVIC_InitStructure.NVIC_IRQChannelCmd
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel
= DMA2_Stream2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
NVIC_InitStructure.NVIC_IRQChannelSubPriority
NVIC_InitStructure.NVIC_IRQChannelCmd
NVIC_Init(&NVIC_InitStructure);
void DMA2_Stream0_IRQHandler( void )
if( DMA_GetITStatus( DMA2_Stream0, DMA_IT_TCIF0 ) != RESET )
DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0);
Dma2Stream0Flag
void DMA2_Stream2_IRQHandler( void )
if( DMA_GetITStatus( DMA2_Stream2, DMA_IT_TCIF2 ) != RESET )
DMA_ClearITPendingBit(DMA2_Stream2, DMA_IT_TCIF2);
Dma2Stream2Flag
void RECV_Schedule( void )
Din[DMA_ADC_BUF_BIT]
if( Dma2Stream0Flag == 1 )
Dma2Stream0Flag = 0;
if( DMA_GetCurrentMemoryTarget(DMA2_Stream0) == DMA_MEMORY_NO_0 )
for( i = 0; i & DMA_ADC_BUF_BIT; i++ )
Din[i] = Adc1Buf1[i];
for( i = 0; i & DMA_ADC_BUF_BIT; i++ )
Din[i] = Adc1Buf0[i];
if( Dma2Stream2Flag == 1 )
Dma2Stream2Flag = 0;
if( DMA_GetCurrentMemoryTarget(DMA2_Stream2) == DMA_MEMORY_NO_0 )
for( i = 0; i & DMA_ADC_BUF_BIT; i++ )
Din[i] = Adc2Buf1[i];
for( i = 0; i & DMA_ADC_BUF_BIT; i++ )
Din[i] = Adc2Buf0[i];
至此,第一篇博客完成了,写的好粗糙,编辑工具也不会~~~~~~~~还是要多写些~
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2167次
排名:千里之外

我要回帖

更多关于 adc0804数据手册 的文章

 

随机推荐