我根据教程完成了利用DMA的ADC测量输入电压的实验,可是串口输出的电压一直为0V,我在PC1引脚上已经接入了3.3V的电压了啊。求帮我看看哪里不对了?代码如下(对应的头文件就不发了,里面没什么,就是宏定义和一些声明)
其中
#define ADC1_DR_Address ((u32)0x40012400+0x4c)
main.c
#include "stm32f10x.h"
#include "usart1.h"
#include "adc.h"
#include "stdio.h"
extern __IO uint16_t ADC_ConvertedValue;//全局变量,ADC1转换的电压值通过DMA方式传送到SRAM
float ADC_ConvertedValueLocal;//局部变量,用于保存转换计算后的电压值
void Delay(__IO uint32_t nCount)//软件延时
{
for(;nCount!=0;nCount--);
}
int main (void)
{
USART1_Config();
ADC1_Init();
printf("\r\n--------这是一个ADC实验---------\r\n");
while(1)
{
ADC_ConvertedValueLocal=(float) ADC_ConvertedValue/4096*3.3; //ADC_ConvertedValue为实时值。。。。。读取转换的AD值
printf("\r\n The current AD value = 0x%04X \r\n",ADC_ConvertedValue);
printf("\r\n The current AD value = %f V \r\n",ADC_ConvertedValueLocal);
Delay(0xfeeee);
}
}
adc.c
#include "stm32f10x.h"
#include "adc.h"
__IO uint16_t ADC_ConvertedValue;
void ADC1_Init(void)
{
ADC1_GPIO_Config();
ADC1_Mode_Config();
}
static void ADC1_GPIO_Config(void)//****************************************声明静态变量结构体,系统在初始化之后,所有成员均在系统内存的静态存储区内,整个程序的运行过程中,始终都在。比较占用系统内存
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//********************使能GPIOC的时钟,这两个都挂在于APB2系统总线上
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//*********************************选择GPIO的0引脚为ADC模拟输入端口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//*****************************设置GPIO口的模式为模拟输入
GPIO_Init(GPIOC,&GPIO_InitStructure);//***********************************初始化以上所有设置
}
static void ADC1_Mode_Config(void)//****************************************声明静态变量结构体,系统在初始化之后,所有成员均在系统内存的静态存储区内,整个程序的运行过程中,始终都在。比较占用系统内存
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitSTructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//***********************使能DMA1的时钟,DMA1挂在在AHB系统总线上
DMA_DeInit(DMA1_Channel1);//**********************************************配置DMA1的ADC1请求通道为1
DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;//***************设置DMA的外设基地址为ADC1的数据寄存器的基地址,需要自己设置,宏定义位于adc.h文件中
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC_ConvertedValue;//**********设置DMA的传送来的数据的内存地址指针
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//************************设置DMA的传输方向是外设为数据源
DMA_InitStructure.DMA_BufferSize=1;//*************************************DMA要传输的数据大小
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_Circular;//***************************设置DMA的传输模式为循环模式
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//***********************设置DMA通道在总线矩阵协调分配总的优先级为高优先
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//******************************禁止DMA传送模式为内存到内存
DMA_Init(DMA1_Channel1,&DMA_InitStructure);//*****************************初始化DMA1通道1的配置数据
DMA_Cmd(DMA1_Channel1,ENABLE);//******************************************DMA1的通道1使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//*********************使能ADC1的时钟,这两个都挂在于APB2系统总线上
ADC_InitSTructure.ADC_Mode=ADC_Mode_Independent;//************************配置ADC的为独立模式,就是一个ADC工作的模式
ADC_InitSTructure.ADC_ScanConvMode=DISABLE;//*****************************禁止使用扫描转换模式
ADC_InitSTructure.ADC_ContinuousConvMode=ENABLE;//************************使能连续转换模式
ADC_InitSTructure.ADC_ExternalTrigConv=ADC_ExternalTrigInjecConv_None;//**ADC转换不使用外部触发,为软件触发
ADC_InitSTructure.ADC_DataAlign=ADC_DataAlign_Right;//********************ADC转换的数据被保存在16位ADC_DR数据寄存器中,以右对齐的方式保存
ADC_InitSTructure.ADC_NbrOfChannel=1;//***********************************ADC数据转换的通道数,1个通道
ADC_Init(ADC1,&ADC_InitSTructure);//**************************************将上面的配置初始化
RCC_ADCCLKConfig(RCC_PCLK2_Div8);//***************************************配置ADC的时钟,为PCLK2的8分频,即9MHz
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);//配置ADC1的通道10为55.5个采样周期
ADC_DMACmd(ADC1,ENABLE);//************************************************使能ADC1的DMA传输
ADC_Cmd(ADC1,ENABLE);//***************************************************使能ADC1
ADC_ResetCalibration(ADC1);//*********************************************复位校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//*****************************等待校准寄存器复位完成
ADC_StartCalibration(ADC1);//*********************************************ADC校准
while(ADC_GetCalibrationStatus(ADC1));//**********************************等待校准完成
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
usart1.c
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_rcc.h"
#include "stdio.h"
void USART1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=115200;
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_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
int fputc(int ch, FILE *f) //提示出错可以不管
{
//等待发送完毕
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET );
//ch送给USART1
USART_SendData(USART1, ch );
//返回ch
return(ch);
}
串口都没有什么问题,正常给串口助手发送信息呢,就是ADC测量的电压一直为零,
根据输出的情况初步分析,DMA传输给 ADC_ConvertedValue变量的值就是0x0000,现在不知道是DMA的传送为题,还是ADC的转换问题,帮忙给我看看吧。非常感谢,我都纠结了好几天了。谢谢。