STM32F4 DMA传输PWM 利用ADC测量显示
Talk is cheap ,show me your code !!!
main.c
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "dma.h"
#include "PWM.h"
#include "led.h"
#include "lcd.h"
#include "adc.h"
#define size 100
u16 send_buf[size];
u16 adcx;
u8 key;
int main()
{
float temp;
int i,j;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(9600);
TFTLCD_Init();
LED_Init();
KEY_Init();
Tim4Ch1Pwm(1024,79);
Adc_Init();
LCD_ShowString(30,190,200,16,16,"ADC VOL:0.000V");
DMAx_Init(DMA1_Stream0, DMA_Channel_2,(u32)&TIM4->CCR1,(u32)send_buf,size);
for(i=0; i<size; ++i)
{
if(i!=size-1)
{
send_buf[i] = 100+10*i;
printf("%d\r\n",send_buf[i]);
}
else
send_buf[i] = 0;
}
while(1)
{
j++;
if(j%20==0)
{
LED0=!LED0;
delay_ms(30);
}
adcx=Get_Adc_Average(ADC_Channel_5,5); //µÃµ½ADCת»»Öµ
temp=(float)adcx*(3.3/4096); //µÃµ½ADCµçѹֵ
adcx=temp;
LCD_ShowxNum(94,190,temp,1,16,0); //ÏÔʾµçѹֵÕûÊý²¿·Ö
temp-=adcx;
temp*=1000;
LCD_ShowxNum(110,190,temp,3,16,0x80); //ÏÔʾµçѹֵµÄСÊý²¿·Ö
key=KEY_Scan(0);
if(key==2)
{
LED0=1;
while (1)
{
// printf("\r\nDMA DATA:\r\n");
LCD_ShowString(30,150,200,16,16,"Start Transimit....");
adcx=Get_Adc_Average(ADC_Channel_5,5); //µÃµ½ADCת»»Öµ
temp=(float)adcx*(3.3/4096); //µÃµ½ADCµçѹֵ
adcx=temp;
LCD_ShowxNum(94,190,temp,1,16,0); //ÏÔʾµçѹֵÕûÊý²¿·Ö
temp-=adcx;
temp*=1000;
LCD_ShowxNum(110,190,temp,3,16,0x80); //ÏÔʾµçѹֵµÄСÊý²¿·Ö
TIM_Cmd(TIM4, ENABLE);
TIM_DMACmd(TIM4,TIM_DMA_CC1,ENABLE);
DMAx_Enable(DMA1_Stream0,size);
if(DMA_GetFlagStatus(DMA1_Stream0,DMA_FLAG_TCIF2)!=0)
{
printf("\r\n´«ÊäÍê:\r\n");
DMA_ClearFlag(DMA1_Stream0,DMA_FLAG_TCIF2);
LED1=1;
break;
}
LED1=!LED1;
delay_ms(300);
}
}
}
}
dma.c
#include "dma.h"
void DMAx_Init(DMA_Stream_TypeDef *DMA_Streamx, u32 chx,u32 par,u32 mar,u16 ndtr)
{
DMA_InitTypeDef DMA_InitStructure;
if((u32)DMA_Streamx>(u32)DMA2)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
}
else
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
}
DMA_DeInit(DMA_Streamx);
while(DMA_GetCmdStatus(DMA_Streamx)!=DISABLE)
{}
DMA_InitStructure.DMA_Channel = chx;
DMA_InitStructure.DMA_PeripheralBaseAddr = par;
DMA_InitStructure.DMA_Memory0BaseAddr = mar;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_BufferSize = ndtr;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA_Streamx,&DMA_InitStructure);
}
void DMAx_Enable(DMA_Stream_TypeDef *DMA_Streamx, u16 ndtr)
{
DMA_Cmd(DMA_Streamx, DISABLE);
while (DMA_GetCmdStatus(DMA_Streamx)!= DISABLE){}
DMA_SetCurrDataCounter(DMA_Streamx,ndtr);
DMA_Cmd(DMA_Streamx,ENABLE);
}
pwm.c
#include "PWM.h"
#include "usart.h"
void Tim4Ch1Pwm(u32 arr, u32 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //ËÙ¶È100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ
GPIO_Init(GPIOD,&GPIO_InitStructure); //³õʼ»¯PD12
TIM_TimeBaseStructure.TIM_Prescaler = psc;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM4,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM4,ENABLE);
}
adc.c
#include "adc.h"
#include "delay.h"
//
//
//³õʼ»¯ADC
//ÕâÀïÎÒÃǽöÒÔ¹æÔòͨµÀΪÀý
//ÎÒÃÇĬÈϽö¿ªÆôͨµÀ1
void Adc_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ʹÄÜGPIOAʱÖÓ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//ʹÄÜADC1ʱÖÓ
//Ïȳõʼ»¯IO¿Ú
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//Ä£ÄâÊäÈë
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//ÏÂÀ
GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1¸´Î»
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //¸´Î»½áÊø
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//¶ÀÁ¢Ä£Ê½
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMAʧÄÜ
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λģʽ
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//·ÇɨÃèģʽ
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//½ûÖ¹´¥·¢¼ì²â£¬Ê¹ÓÃÈí¼þ´¥·¢
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ÓÒ¶ÔÆë
ADC_InitStructure.ADC_NbrOfConversion = 1;//1¸öת»»ÔÚ¹æÔòÐòÁÐÖÐ Ò²¾ÍÊÇֻת»»¹æÔòÐòÁÐ1
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);//¿ªÆôADת»»Æ÷
}
//»ñµÃADCÖµ
//ch:ͨµÀÖµ 0~16
//·µ»ØÖµ:ת»»½á¹û
u16 Get_Adc(u8 ch)
{
//ÉèÖÃÖ¸¶¨ADCµÄ¹æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬²ÉÑùʱ¼ä
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles ); //ADC1,ADCͨµÀ,480¸öÖÜÆÚ,Ìá¸ß²ÉÑùʱ¼ä¿ÉÒÔÌá¸ß¾«È·¶È
ADC_SoftwareStartConv(ADC1); //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø
return ADC_GetConversionValue(ADC1); //·µ»Ø×î½üÒ»´ÎADC1¹æÔò×éµÄת»»½á¹û
}
//»ñȡͨµÀchµÄת»»Öµ£¬È¡times´Î,È»ºóƽ¾ù
//ch:ͨµÀ±àºÅ
//times:»ñÈ¡´ÎÊý
//·µ»ØÖµ:ͨµÀchµÄtimes´Îת»»½á¹ûƽ¾ùÖµ
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}