新手上路
- 积分
- 46
- 金钱
- 46
- 注册时间
- 2016-5-31
- 在线时间
- 7 小时
|
下面的程序功能为从ADC采集一个电压,传输给DMA,传输完成后(10次)产生中断,将数据转换发给串口:可串口采集的值完全不对,且恒定(无论adc输入值)
[mw_shl_code=c,true]#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "sys.h"
#include "stdio.h"
#ifndef __ver_
#define __ver_
#define data_deep 10 //传输深度
u16 databuffer[data_deep]; //存储数组
#endif
void mydma_init0(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr);
void mydma_enble(DMA_Channel_TypeDef*DMA_CHx,u16 DMA1_MEM_LEN);
void Adc_Init(void);
int main(void)
{
delay_init();
uart_init(9600);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Adc_Init(); //adc初始化
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,0x01,ADC_SampleTime_239Cycles5);
mydma_init0(DMA1_Channel1,(u32)&ADC1->DR,(u32)databuffer,data_deep);
mydma_enble(DMA1_Channel1,data_deep);
/*********软件启动**********/
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(1);
}
/**************************************************
*****************ADC初始化*********************
***************************************************/
void Adc_Init(void)
{
GPIO_InitTypeDef GPIO_InitTypeDefstructure;
ADC_InitTypeDef ADC_InitTypeDefstrcuture;
/****step1:使能时钟*************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
/****step2: IO口初始化**************************/
GPIO_InitTypeDefstructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitTypeDefstructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitTypeDefstructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitTypeDefstructure);
/****step3: 预分频*********************/
ADC_DeInit(ADC1);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
/*****step4: *****************/
ADC_InitTypeDefstrcuture.ADC_ContinuousConvMode=ENABLE; //á¬Dø×a»»
ADC_InitTypeDefstrcuture.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitTypeDefstrcuture.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitTypeDefstrcuture.ADC_Mode=ADC_Mode_Independent;
ADC_InitTypeDefstrcuture.ADC_NbrOfChannel=1;
ADC_InitTypeDefstrcuture.ADC_ScanConvMode=DISABLE;
ADC_Init(ADC1,&ADC_InitTypeDefstrcuture);
ADC_DMACmd(ADC1,ENABLE); //使能adc DMA
ADC_Cmd(ADC1,ENABLE); //step5:使能ADC*********/
ADC_ResetCalibration(ADC1); //校准
while(ADC_GetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,0x01,ADC_SampleTime_239Cycles5); //通道配置
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //软
}
/**************************************************
*****************DMA初始化********************
***************************************************/
void mydma_init0(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
DMA_InitTypeDef DMA_InitTypeDefstructure;
NVIC_InitTypeDef NVIC_InitTypeDefstructure;
/*******时钟************/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
/******************/
DMA_DeInit(DMA_CHx);
/********* ***********/
DMA_InitTypeDefstructure.DMA_BufferSize=cndtr; // data_deep
DMA_InitTypeDefstructure.DMA_DIR=DMA_DIR_PeripheralSRC; // ′óíaéè¶áè¡êy¾Y
DMA_InitTypeDefstructure.DMA_M2M=DMA_M2M_Disable;
DMA_InitTypeDefstructure.DMA_MemoryBaseAddr=cmar; //memory_ad
DMA_InitTypeDefstructure.DMA_MemoryDataSize=DMA_PeripheralDataSize_HalfWord; //data_size
DMA_InitTypeDefstructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitTypeDefstructure.DMA_Mode=DMA_Mode_Circular;//DMA_Mode_Circular
DMA_InitTypeDefstructure.DMA_PeripheralBaseAddr=cpar; //periph_ad
DMA_InitTypeDefstructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord; //periph dataSize 16bit
DMA_InitTypeDefstructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitTypeDefstructure.DMA_Priority=DMA_Priority_VeryHigh;
DMA_Init(DMA_CHx,&DMA_InitTypeDefstructure);
/**********中断使能**********************/
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); //tran_finish
/***********************************************/
/******中断分组********/
NVIC_InitTypeDefstructure.NVIC_IRQChannel=DMA1_Channel1_IRQn ;
NVIC_InitTypeDefstructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitTypeDefstructure.NVIC_IRQChannelPreemptionPriority=3;
NVIC_InitTypeDefstructure.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitTypeDefstructure);
/**************************************/
}
/*********一次DMA传输***********/
void mydma_enble(DMA_Channel_TypeDef*DMA_CHx,u16 DMA1_MEM_LEN)
{
DMA_Cmd(DMA_CHx,DISABLE);
DMA_CHx->CNDTR=DMA1_MEM_LEN;
DMA_Cmd(DMA_CHx,ENABLE);
}
/********************************
******************
*********************************/
void DMA1_Channel1_IRQHandler(void)
{
u8 i;
float temp[data_deep]={0};
if(DMA_GetFlagStatus(DMA1_FLAG_TC1)!=RESET)
{
ADC_DMACmd(ADC1,DISABLE); //disable the adc_dma request
DMA_Cmd(DMA1_Channel1,DISABLE); //close DMA_channel1
for(i=0;i<data_deep;i++)
{
temp=databuffer*(3.3/4096);
printf("\n ADC2éÑùμçÑ1V=%f\n\r",temp);
}
printf("\r\n----------\r\n");
DMA_ClearFlag(DMA1_FLAG_TC1); //clear the flag
ADC_DMACmd(ADC1,ENABLE); //enable the adc_dma request
DMA_Cmd(DMA1_Channel1,ENABLE); //enable DMA_channel1
}
}
[/mw_shl_code]
|
|