|
用的是安富莱的例子,我自己加了个DMA中断,读出来数据都是零,以下是代码:
#include "sys.h"
#include "delay.h"
#include "usart.h"
unsigned int DAT[1000];
int flag=0;
int adc_value=0;
#define ADC3_DR_ADDRESS ((uint32_t)0x4001224C)
void TIM1_Config(void);
void bsp_InitADC(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* ê1Äü ADC3, DMA2 oí GPIO ê±Öó ****************************************/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOF, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
/* DMA2 Stream0 channel2 ÅäÖÃ **************************************/
DMA_InitStructure.DMA_Channel = DMA_Channel_2;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC3->DR;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint16_t)DAT;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 1000;
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_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream0, ENABLE);
DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* ÅäÖÃADC3í¨μà7òy½ÅÎaÄ£ÄaêäèëÄ£ê½******************************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/****************************************************************************
PCLK2 = HCLK / 2
ÏÂÃæÑ¡ÔñμÄêÇ2·ÖÆμ
ADCCLK = PCLK2 /2 = HCLK / 4 = 168 / 4 = 42M
ADC2éÑùÆμÂê£o Sampling Time + Conversion Time = 3 + 12 cycles = 15cyc
Conversion Time = 42MHz / 15cyc = 2.8Mbps.
*****************************************************************************/
/* ADC1«122¿·Ö3õê¼»ˉ**********************************************************/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC3 3õê¼»ˉ ****************************************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC3;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC3, &ADC_InitStructure);
/* ADC3 1æÔò channel7 ÅäÖÃ *************************************/
ADC_RegularChannelConfig(ADC3, ADC_Channel_7, 1, ADC_SampleTime_3Cycles);
/* ê1ÄüDMAÇëÇó(μ¥ADCÄ£ê½) */
ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
/* ê1Äü ADC3 DMA */
ADC_DMACmd(ADC3, ENABLE);
/* ê1Äü ADC3 */
ADC_Cmd(ADC3, ENABLE);
TIM1_Config();
}
/*
*********************************************************************************************************
* oˉ êy Ãû: TIM1_Config
* 1|ÄüËμÃ÷: ÅäÖö¨ê±Æ÷1£¬óÃóú′¥·¢ADC, ′¥·¢ÆμÂê1Msps
* DÎ 2Î: ÎT
* ·μ »Ø Öμ: ÎT
*********************************************************************************************************
*/
static void TIM1_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //ê1Äü¶¨ê±Æ÷1ê±Öó
TIM_Cmd(TIM1, DISABLE);
/*
********************************************************************************
system_stm32f4xx.c ÎļtÖD void SetSysClock(void) oˉêy¶Ôê±ÖóμÄÅäÖÃèçÏ£o
HCLK = SYSCLK / 1 (AHB1Periph)
PCLK2 = HCLK / 2 (APB2Periph)
PCLK1 = HCLK / 4 (APB1Periph)
òòÎaAPB1 prescaler != 1, ËùòÔ APB1éÏμÄTIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;
òòÎaAPB2 prescaler != 1, ËùòÔ APB2éÏμÄTIMxCLK = PCLK2 x 2 = SystemCoreClock;
APB1 ¶¨ê±Æ÷óD TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14
APB2 ¶¨ê±Æ÷óD TIM1, TIM8 ,TIM9, TIM10, TIM11
TIM6 ¸üDÂÖüÆúêÇ = TIM1CLK / £¨TIM_Period + 1£©/£¨TIM_Prescaler + 1£©
********************************************************************************
*/
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); //3õê¼»ˉ¶¨ê±Æ÷1μļÄ′æÆ÷Îa¸′λÖμ
TIM_TimeBaseStructure.TIM_Period = 168000000 / 1000000 - 1; //ARR×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ(¶¨ê±ê±¼ä£©μ½éèÖÃÆμÂêoó2úéú¸ö¸üD»òÕßÖD¶Ï(ò2êÇË춨ê±ê±¼äμ½)
TIM_TimeBaseStructure.TIM_Prescaler =1; //PSCê±ÖóÔ¤·ÖÆμêy àyèç£oê±ÖóÆμÂê=TIM1CLK/(ê±ÖóÔ¤·ÖÆμ+1)
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //CR1->CKDê±¼ä·Ö¸îÖμ
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //CR1->CMS[1:0]oíDIR¶¨ê±Æ÷Ä£ê½ ÏòéϼÆêy
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //CCMR2ÔúÏòéϼÆêyê±£¬ò»μ©TIMx_CNT<TIMx_CCR1ê±í¨μà1ÎaóDD§μçÆ½£¬·ñÔòÎaÎTD§μçÆ½
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //CCER êä3öê1Äü
TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period / 2;//CCR3í¬¼ÆêyÆ÷TIMx_CNTμıè½Ï£¬2¢ÔúOC4¶Ë¿úéÏ2úéúêä3öDÅoÅ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //CCERêä3ö¼«DÔéèÖà ¸ßμçÆ½óDD§
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); //CMR2 éèÖÃÔ¤×°ÔØê1Äü ¸üDÂê¼t2úéúê±D′èëóDD§
TIM_ARRPreloadConfig(TIM1, ENABLE); //CR1 éèÖÃARR×Ô¶ˉ֨װ ¸üDÂê¼t2úéúê±D′èëóDD§
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE); //ê1ÄüPWM êä3ö
}
/***************************** °2¸»à3μç×ó www.armfly.com (END OF FILE) *********************************/
int main(void)
{
float volt=0;
int i=0;
u16 adcx;
float temp;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏè¼¶·Ö×é2
delay_init(168); //3õê¼»ˉÑóê±oˉêy
uart_init(115200); //3õê¼»ˉ′®¿ú2¨ìØÂêÎa115200
bsp_InitADC();
//3õê¼»ˉADC
while(1)
{
if(flag==1)
{
// printf("begin:\r");
for(i=0;i<1000;i++)
{
//volt=DAT*(3.3/4096);
printf("%d ",DAT);
}
flag=0;
TIM_Cmd(TIM1,ENABLE);
delay_ms(1000);
}
}
}
void DMA2_Stream0_IRQHandler()
{
DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
// printf("dma:");
TIM_Cmd(TIM1,DISABLE);
flag=1;
} |
|