看了一下午没看出是哪里的问题,时钟什么的都打开了的
芯片是STM32F103RCT6
请大家帮忙看看
代码
main
[mw_shl_code=c,true]#include "delay.h"
#include "sys.h"
#include "usart.h"
#include"ADC.h"
float ADC_ConvertedValueLocal;
int main(void)
{
u8 t;
u8 len;
// u16 times=0;
delay_init(); //延时函数初始化
NVIC_Configuration_sys();// 设置中断优先级分组
uart_init(9600); //串口初始化为9600
ADC1_Init();
while(1)
{
ADC_ConvertedValueLocal=(float)ADC_ConvertedValue/4096*3.3;
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\nThe current AD value is:0x%04X\r\n\n" ,ADC_ConvertedValue);
printf("\r\nThe voltage is :%f\r\n\n" ,ADC_ConvertedValueLocal);
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
}
}
}
[/mw_shl_code]
ADC.c
[mw_shl_code=c,true]#include"ADC.h"
volatile u16 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_AHBPeriph_DMA1 , ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
static void ADC1_Mode_Config()
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
/*配置DMA*/
DMA_DeInit(DMA1_Channel1);//复位DMA通道1
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定义 DMA通道外设基地址=ADC1_DR_Address(这是一个自定义的宏)
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //定义DMA通道存储器地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址
DMA_InitStructure.DMA_BufferSize = 1;//定义DMA缓冲区大小1
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//当前存储器地址不变
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位
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);//初始化DMA通道1
DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道1
/*配置ADC1*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //禁止扫描模式,扫描模式用于多通道采集
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//开启连续转换模式,即不停地进行ADC转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//采集数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道数目为1
ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
RCC_ADCCLKConfig(RCC_PCLK2_Div8);//配置ADC时钟,为PCLK2的8分频,即9Hz
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5);//ADC1选择信道8,音序器等级1,采样时间55.5个周期
ADC_DMACmd(ADC1, ENABLE);//使能ADC的DMA接口
ADC_Cmd(ADC1, ENABLE);//使能ADC1
ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成
ADC_StartCalibration(ADC1);//开始ADC1校准
while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换
}
[/mw_shl_code]
ADC.h
[mw_shl_code=c,true]#ifndef _ADC_H_
#define _ADC_H_
/********************************************************************************/
#include "stm32f10x.h"
#define ADC1_DR_Address ((u32)0x40012400+0x4c)
extern volatile u16 ADC_ConvertedValue;
void ADC1_Init(void);
static void ADC1_GPIO_Config(void);
static void ADC1_Mode_Config(void);
/********************************************************************************/
#endif[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]结果是[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]可以看出
[mw_shl_code=c,true]ADC_ConvertedValue是为0的。 PB0所接的点用万用表测试为1.6V的 并不为0[/mw_shl_code]
[/mw_shl_code]
|