代码如下,我写的是ADC1规则通道1单次转换后,DMA传输至内存temp, 然后串口1输出
ADC和串口部分单独测试过OK, 问题出在DMA部分,卡在while (DMA_GetFlagStatus(DMA1_FLAG_TC1)!=SET)跳不出来...
(我刚学STM32两周,51单片机也没怎么学过,求各位指导啊)
[mw_shl_code=c,true]#include "usart.h"
#include "delay.h"
#include "stm32f10x_dma.h"
#include "stm32f10x_adc.h"
u16 temp;
void ADC_UD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode=DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel=1;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_DMACmd(ADC1,ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1));
ADC_RegularChannelConfig(ADC1,1,1,ADC_SampleTime_239Cycles5);
}
void DMA_UD_Init(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr=temp;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize=16;
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_Init(DMA1_Channel1,&DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);
}
void Get_ADC(void)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)!=1);
}
void ADC_To_DMA()
{
DMA_Cmd(DMA1_Channel1, DISABLE );
DMA_SetCurrDataCounter(DMA1_Channel1,16);
DMA_Cmd(DMA1_Channel1, ENABLE);
while (DMA_GetFlagStatus(DMA1_FLAG_TC1)!=SET);
DMA_ClearFlag(DMA1_FLAG_TC1);
}
int main(void)
{
u8 n=1;
float adcx;
delay_init();
DMA_UD_Init();
ADC_UD_Init();
USART_UD_Init();
while (n<=100)
{
printf("本次转换结果为:");
Get_ADC();
ADC_To_DMA();
adcx=temp*(3.3/4096);
printf("%.3f\r\n",adcx);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
n++;
delay_ms(34464);
delay_ms(34464);
delay_ms(34464);
}
}
[/mw_shl_code]
求助~~ |