麻煩大佬看看,為啥給ADC加了DMA后就一直輸出0了
main.c里面的
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "adc.h"
// ADC1轉換的電壓值通過MDA方式傳到SRAM
extern __IO uint16_t ADC_ConvertedValue;
// 局部變量,用于保存轉換計算后的電壓值
float ADC_ConvertedValueLocal;
float adcmax;//采樣最大值和最小值
float adcmin;
int main(void)
{
u8 i;
u8 j;
u8 k;
u16 adcx;
float temp;
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
uart_init(115200); //串口初始化為115200
LED_Init(); //LED端口初始化
LCD_Init();
Adc_Init(); //ADC初始化
while(1)
{
ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // 讀取轉換的AD值
adcx=ADC_ConvertedValueLocal;
//獲取最大最小值
adcmax=adcx;
adcmin=adcx;
for(i=0;i<20;i++)
{
adcx=ADC_ConvertedValueLocal;
if(adcx >= adcmax)
{
adcmax = adcx;
}
if(adcx <= adcmin)
{
adcmin = adcx;
}
}
adcmax=(float)adcmax*(3.3/4096);
adcmin=(float)adcmin*(3.3/4096);
temp=(adcmax-adcmin);
printf("檢測電壓1值為:%.3fV\r\n",adcmax);//串口打印
LED0=!LED0;
delay_ms(1);
}
}
adc.c里面的
#include "adc.h"
#include "delay.h"
__IO uint16_t ADC_ConvertedValue;
//初始化ADC
//這里我們僅以規則通道為例
//我們默認將開啟通道0~3
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道時鐘
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14M
//DMA1 Stream1 channe1 配置
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; //DMA外設基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;; //數據傳輸方向,從內存讀取發送到外設
DMA_InitStructure.DMA_BufferSize = 120; //DMA通道的DMA緩存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設地址寄存器不變
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內存地址寄存器遞增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //數據寬度為16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //數據寬度為16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在無限循環模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x擁有高優先級
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x沒有設置為內存到內存傳輸
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //根據DMA_InitStruct中指定的參數初始化DMA的通道USART1_Tx_DMA_Channel所標識的寄存器
DMA_Cmd(DMA1_Channel1, ENABLE);
//PA1 作為模擬通道輸入引腳
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入引腳
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //復位ADC1,將外設 ADC1 的全部寄存器重設為缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在獨立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模數轉換工作在單通道模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模數轉換工作在單次轉換模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //轉換由軟件而不是外部觸發啟動
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC數據右對齊
ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進行規則轉換的ADC通道的數目
ADC_Init(ADC1, &ADC_InitStructure); //根據ADC_InitStruct中指定的參數初始化外設ADCx的寄存器
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采樣時間為239.5周期
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
/* 使能 ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1); //使能復位校準
while(ADC_GetResetCalibrationStatus(ADC1)); //等待復位校準結束
ADC_StartCalibration(ADC1); //開啟AD校準
while(ADC_GetCalibrationStatus(ADC1)); //等待校準結束
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的軟件轉換啟動功能
}
|